投稿日:
シェルスクリプトでオプションパラメーターを解析するやつ
基本shiftと合わせて使う
サンプルコード
とりあえず最低限の動作サンプル的なやつ
#!/bin/bash
usage_exit () {
echo "Usage: $0 [-p piyo] [-f] <foo> <bar>"
exit 1
}
# オプション名の後ろに `:` をつけるとパラメーターを取れる、つけないと取れない
# オプション先頭に `:` をつけるとエラーハンドリングを自動でしなくなる
# e.g. `getopts :p:fh`
while getopts p:fh OPT
do
case $OPT in
p) piyo=$OPTARG
;;
f) fuga=1
;;
h) usage_exit
;;
\?) usage_exit
;;
esac
done
# オプション分の引数をずらす
# これがないとオプションが `$1` とかに入ってくる
shift $((OPTIND - 1))
# オプションを抜いた引数を取る
foo=$1
bar=$2
echo $foo
echo $bar
echo $piyo
echo $fuga
投稿日:
シェルスクリプトが設置されているパスを取得する
cwd=$(cd $(dirname $0); pwd)$0はシェルスクリプトのフルパスdirnameでスラッシュから始まるファイル名を除去cdで移動pwdで表示
現在のパスを移動せずにシェルスクリプト内でパスを移動する
これはサブシェルを使うと出来る
サブシェルとは()で囲まれた部分で、この中では別のシェルが動いている
例えば次のスクリプトはfoo/に移動し中のファイルリストを表示するが、2行目では現在の位置にあるファイルリストを表示するため移動していない
コマンド展開記法$()もサブシェルが動いている
(cd foo/; ls -la)
ls -la
複数コマンドをワンライナーで実行する
;
- 以下のように書くと連続で線形実行される。手前が異常終了しても続く
curl; echo 2;
&
コマンドの末尾に&をつけるとバックグラウンドで実行される
- 以下の例では左がバックグラウンド、右がフォアグラウンドで実行される
echo 1 & echo 2
&&
AndAlso的な動きをする
- 以下のように書くと連続で線形実行される。手前が異常終了すると続かない
curl && echo 2
|
コマンドの末尾に|をつけると標準出力が次にリダイレクトされる
- 以下のように書くと連続で線形実行される。手前の標準出力が次にリダイレクトされる
echo 1 | xargs -I{} echo {}2
||
OrElse的な動きをする
- 以下のように書くと連続で線形実行される。手前が異常終了した場合のみ次が動く
curl || echo 1
投稿日:
HTTPを始めFTPやLDAPなど多様なプロトコルに対応したクライアント
curl [options...] <url>
Options
ヘルプが充実してるのでヘルプ見たほうが早い
-X method-X POSTとかするとそのメソッドを投げられる-XPOST形式でも動く
-s- 通信の進捗を表示しない
- 通信エラーも表示しない
-S-sが指定されている時にエラーを表示する
-L- location headersを読む
- 3xx系のコードの追従する(302 redirectとか)
-sSLでセットにして使うことが多い
-v--verbose- レスポンス内容が全部出る
- レスポンスヘッダを見る時に使える(
-Iでも見れるがHEAD methodを投げてるだけなので-Xと併用できない) - エラー出力されるのでgrepしたい時などは標準出力にリダイレクトが必要
2>&1
- レスポンスヘッダを見る時に使える(
-H- ヘッダを投げられる
-H 'Content-Type: application/json'-H 'User-Agent:' -H 'Accept:' -H 'Host:'でcurl自身の既定ヘッダを消せる。但しHostヘッダーのないリクエストはRFC違反であるため受け付けられる保証はない
-dx-www-form-urlencodedを投げる時に使う-d key=value- 複数あるときは複数指定する
- 暗黙的に
-X POST扱いになる
--data-urlencode-dと同じだが中身がURLエンコードされる
-o <path>- ファイルを保存する
- ダウンロード目当てならwgetのほうが使いやすい
例
JSONのPOST
curl -v -H 'Content-Type: application/json' -d '{ "hoge": "piyo" }' -- 'https://example.com'
参考
投稿日:
ls -l | xargs echoのようにして手前のコマンドの標準出力を渡すコマンド。そのコマンドの次に差し込まれる形になる
指定位置に結果を差し込む
echo 'bbb' | xargs -I{} echo "aaa"{}-I{}のように指定すると置換文字列を指定できる
echo 'bbb' | xargs -I{} echo "aaa"{}{}{}- 複数書けば複数回置換される
投稿日:
文字列を編集したりするのに大変便利なやつ。sedやawkの代わりに使える。構文はPerlそのものが使える。なにせPerlなので
コマンドラインオプション
-e- ワンライナーでコードを書くやつ
php -rやnode -eと同じ- Evaluate, Eval, 評価
-n- 入力の各行に対し処理がかかる
$.で行番号、$_で行の文字列を取得できるwhile (<>)相当の処理
-p- 入力の各行に対し処理を行い、更に
print $_相当の処理を実行する
- 入力の各行に対し処理を行い、更に
-l- 入力(
$_)から改行文字を削除し出力に改行を追加する
- 入力(
-a- 入力の各行に対して
awk相当の文字列分割処理を行う(autosplit mode with -n or -p) - 分割した文字は
$Fに配列として入るので次のようにして取得できるperl -ale 'print "$F[0] - $F[1]'
$#Fを指定すると分割した個数が取れる
- 入力の各行に対して
-F/pattern/-aでsplitするパターンを設定する- 例えば
-F,とするとCSVを分割できる
-i[ext]- ファイルを編集する
- 使用例:
perl -i -pe 's/aaa/xxx/' foo.txt -i.bakのように指定するとバックアップファイルが作成される- このオプションは次に続く文字が解釈されるため、単体で指定する必要がある(
-ipeのようには使えない)
構文
変数を指定しない場合、基本的に$_として扱われる
print- 標準出力に出力
- 単体では
print $_と同じ挙動をする
$hoge =~ s/foo/bar/- fooをbarに置換
/(.+)/; print $1- キャプチャした内容を出力
- コマンド例:
echo hoge.jpg | perl -ne '/(.+)./; print $1'
$_- 基本的に書かなくても補完される
- 例えば
echo aaabbc | perl -ne 's/c/d/; print'の出力はaaabbdとなる - その他特殊変数:https://perldoc.jp/docs/perl/5.18.1/perlvar.pod
END{}- このブロックで囲んだコードは実行時の最後に動作する
-n,-pを指定した場合、END{}は$_が取れないので渡す場合は$x = $_; END{ print $x }のように別の変数に代入する必要がある
- https://perldoc.jp/docs/perl/5.38.0/perlmod.pod#BEGIN44-32UNITCHECK44-32CHECK44-32INIT32and32END
- このブロックで囲んだコードは実行時の最後に動作する
チートシート
変数置換
一例
ls -l | perl -ale '$F[8] =~ s/\.html//; print $F[8];'
特定行を取得
1のところが行数なので、ここを変えることで任意の行の文字列を取れる
入力
cat <<EOF | perl -ne 'print if $. == 1' 25-08-10 - 14:48:39
aaa
bbb
ccc
EOF
出力
aaa
捕獲処理
入力
echo "foo bar" | perl -ne '/^([^ ]+)/; print $1'
出力
foo
名前付き捕獲
入力
echo "foo bar" | perl -pe 's/(?<first>.+) (?<last>.+)/$+{first}-$+{last}/'
出力
foo-bar
逆順出力
unshiftで配列の先頭に値を追加し、END{}で最後に出力している
入力
cat <<EOF | perl -ne 'unshift @x, $_; END{ print @x }'
aaa
bbb
ccc
EOF
出力
ccc
bbb
aaa