検索条件
全8件
(1/2ページ)
シェルスクリプトでオプションパラメーターを解析するやつ
基本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>
ヘルプが充実してるのでヘルプ見たほうが早い
-X method
-X POST
とかするとそのメソッドを投げられる-XPOST
形式でも動く-s
-S
-s
が指定されている時にエラーを表示する-L
-sSL
でセットにして使うことが多い-v
--verbose
-I
でも見れるがHEAD methodを投げてるだけなので-X
と併用できない)2>&1
-H
-H 'Content-Type: application/json'
-H 'User-Agent:' -H 'Accept:' -H 'Host:'
でcurl自身の既定ヘッダを消せる。但しHostヘッダーのないリクエストはRFC違反であるため受け付けられる保証はない-d
x-www-form-urlencoded
を投げる時に使う-d key=value
-X POST
扱いになる--data-urlencode
-d
と同じだが中身がURLエンコードされる-o <path>
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
と同じ-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/
/(.+)/; print $1
echo hoge.jpg | perl -ne '/(.+)./; print $1'
$_
echo aaabbc | perl -ne 's/c/d/; print'
の出力はaaabbd
となるEND{}
-n
, -p
を指定した場合、END{}
は$_
が取れないので渡す場合は$x = $_; END{ print $x }
のように別の変数に代入する必要がある一例
ls -l | perl -ale '$F[8] =~ s/\.html//; print "$F[8]";'
1のところが行数なので、ここを変えることで任意の行の文字列を取れる
perl -ne 'print if $. == 1'
echo "foo bar" | perl -pe 's/(?<first>.+) (?<last>.+)/$+{first}-$+{last}/'
unshift
で配列の先頭に値を追加し、END{}
で最後に出力している
cat <<EOF | perl -ne 'unshift @x, $_; END{ print @x }'
aaa
bbb
ccc
EOF