忘れるからメモ。Bash では Special Parameters -- Bash Reference Manual という。 2.5 Parameters and Variables -- opengroup.org Posix Shell はここらへん。
変数 | |
---|---|
$# | コマンドラインの引数 |
$1 〜 $9, $0 | 引数それぞれ。 Positional Parameters という。 |
$* | $0 以外のコマンドライン引数 |
$@ | $* と同等。ただし "$@" とした時、位置パラメータを評価せずにコマンドに渡すことが出来る |
$? | シェルが最後に実行したコマンドの終了状態を保持している。ほとんどのコマンドは成功時には「0」を返す |
$$ | 現在のシェルのプロセス番号を保持している |
$- | シェルにセットされているオプションを保持している |
$! | バックグラウンドで実行された直前のプロセスのプロセス番号を保持しています |
その他
Shell Parameter Expansion -- bash とか 2.6.2 Parameter Expansion -- posix shell とか、細かいところでハマりそうなところ。
書き方 | |
---|---|
${@:2} | 二つ目以降の引数を取得 |
${parameter:-word} |
parameter が未定義/NULLのときは word が 代用 される |
${parameter:=word} |
parameter が未定義/NULLのときは word が 代入 される |
${parameter:?word} |
parameter が未定義/NULLのときは word とエラーを出力して終了する。 |
${parameter:+word} |
parameter が未定義/NULLのときは NULL を使用して、それ以外のときは word を使う |
${parameter%word} |
最短の 接尾語 を取り除く。拡張子を消す等に使用。実行例を参考 |
${parameter%%word} |
最長の接尾語 を取り除く。実行例を参考 |
${parameter#word} |
最短の 接頭語 を取り除く。ディレクトリパスから $HOME を消す時等に使用する。実行例を参考 |
${parameter##word} |
最長の 接頭語 を取り除く。ディレクトリパスを消したい時に使用する。実行例を参考 |
$'string' |
Bash のみ ANSI-C Quoting. echo 'a\te'; としても a\te と表示されるが、 echo $'a\te' としたら a e となる。 \UHHHHHHHH と Unicode( ISO/IEC 10646 ) がある。 |
気が向いたら増やしてく。
Shell Parameter Expansion の : のこと
:- とか使用するが、この : は変数定義と NULL で挙動がそれぞれ微妙に変わる。
Parameter 定義しNULL値ではない | Parameter定義しているがNULL値 | Parameter 未定義 | |
---|---|---|---|
${parameter:-word} |
parameter を返す | word を返す | word を返す |
${parameter-word} |
parameter を返す | NULLを返す | word を返す |
${parameter:=word} |
parameter を返す | word を代入する | word を代入する |
${parameter=word} |
parameter を返す | NULLを返す | word を代入する |
${parameter:?word} |
parameter を返す | エラーを出力して終了 | エラーを出力して終了 |
${parameter?word} |
parameter を返す | NULLを返す | エラーを出力して終了 |
${parameter:+word} |
word を返す | NULLを返す | NULLを返す |
${parameter+word} |
word を返す | word を返す | NULLを返す |
実行例 :-
,:=
,:?
,:+
の違い例
#!/usr/bin/env bash
echo ${hoge:-abc}
echo ${hoge}
echo "--- separator ---"
echo ${hoge:=abc}
echo ${hoge}
echo "--- separator ---"
use_this="hoge"
echo ${use_this:+is_null}
echo ${say_null:+ok}
echo "--- separator ---"
echo ${err:?wow}
出力
> sh shell_param_exp.sh
abc
--- separator ---
abc
abc
--- separator ---
is_null
--- separator ---
shell_param_exp.sh: line 14: err: wow
実行例 -- 接尾語・接頭語のこと
#!/usr/bin/env bash
hoge="${HOME}/hoge/bake/file.c"
echo 'original'
echo $hoge
echo ''
echo '${parameter%word}'
echo ${hoge%.c}.o
echo ''
echo '${parameter%%word}'
echo ${hoge%%file.c}new_file.o
echo ''
echo '${parameter#word}'
echo ${hoge#$HOME}
echo ''
echo '${parameter##word}'
echo ${hoge##*/}
実行結果
> sh shell_prefix_patterns.sh
original
/Users/yasui/hoge/bake/file.c
${parameter%word}
/Users/yasui/hoge/bake/file.o
${parameter%%word}
/Users/yasui/hoge/bake/new_file.o
${parameter#word}
/hoge/bake/file.c
${parameter##word}
file.c
その他 Shell を書く上で必要なサイト
ShellCheck がおすすめ。 Shell の文法ミスから改善案まで言ってくれます。