エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

シェルスクリプトで、引数がオプションか判断する方法【104日目】

参考元

github.com

dockerの公式イメージ読んでたら思わぬノウハウを。

結論

if [ "${1#-}" != "$1" ]; then

コードの意味

${1#-} なんぞやっていう。

Man page of BASH

${parameter#word} ${parameter##word} パターンに前方一致した部分を取り除く。 word が展開され、パス名展開の場合と同じようなパターンを作ります。 このパターンが > parameter の値の先頭部分とマッチする場合、展開して得られる値は parameter を展開した値から最短一致パターン (#''の場合) > または最長一致パターン (##'' の場合) を取り除いたものになります。 parameter が @ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。

つまり

if [ "${1#-}" != "$1" ]; then

-fが第一引数なら、 f != -fになってif文の中が実行される
some_nameが第一引数なら、 some_name != some_nameになってif文の中が実行されない

ってお話。

日記

Dockerの勉強してたら${1#-}が読めなくて友人に助け求めたらこんな面白い発見が。

シェルスクリプトで変数展開なるものがあるらしい。

こんな感じに変数を取得する時に、中身を変えてから出力出来るんだってね。#以外にもいろいろあるから、
今後使う時の参考にしようと思います。

とりあえず・・・今日はいっぱい勉強して疲れた・・・そして風邪が未だに治らない。