シェルスクリプトの引数
シェルスクリプトを書いている時に、引数をチェックするために
1 2 |
|
みたいなことをして引数をチェックしていたら-e
や-n
が消えている?
とわからなくなってちょっと試してみると
1 2 3 4 5 6 7 8 9 10 11 12 |
|
起こっている情況としては、
-e
が消えている-n
も消えている。かつ改行がなくなって次の-u
が同じ行に出力されている。
という状態。
シェルスクリプトにこんな仕様があるのかとちょっと検索しても出てこなくて
ChatGPTに聞いたら
-e
はset -e
でerrexit
のオプション、-n
はset -n
でnoexec
のオプションだからそうなっているし、
正しくはスクリプトの中でset -e
とかしなさい、とのこと。
でもよく使う-u
(nnounset
)や-a
(allexport
)とかも同様では?
また、
1 2 |
|
と最初に来なければ見えている状態。
さらに、
1 2 |
|
とすると、
1 2 |
|
見えた。。。
echoの引数なだけ
勘違いしてたのは単にecho
のオプションとして-e
がbackslashによるエスケープシーケンスをを有効にするオプションで、-n
が最後を改行なしにするオプション、というだけ。
$@
で渡しているので一つ一つ分けて順にecho
に渡されるわけで、最初に-e
や-n
が渡されればオプションとして使われていただけです。
エスケープシーケンスなどはないので-e
が渡されれば単にそのオプション分は表示されず、
-n
が渡されれば-n
はオプションとして消化されて表示されずさらに改行なしになるだけです。
なので$@
自体にはこれらはちゃんと入ってますし使えます。
BSDなecho
BSDな/bin/echo
は-e
オプションが無いので、macOSとかで
1 2 |
|
というスクリプトを作ると
1 2 3 4 5 6 7 8 9 10 11 12 |
|
と、-e
でも通常通り表示されます。
macOSでも普通にecho
使うとbashのbuiltinなechoが使われるので-e
は有効で消えます。
1 2 3 |
|