
古いシェル スクリプトを確認しています。その中で理解できないことが 2 つあります。
rm /data/log || true
value=$(cat /datafile)
if [ ${value: -1} == 0 ]
then echo 'do'
else echo 'dont'
fi
value: -1
- これは実際何をするのですか?rm /data/log || true
- これは何||true
をしているんですか?
答え1
${value: -1}
拡大すると最後の文字変数の内容。
${value:-1}
は違うから${value: -1}
!
参照シェルパラメータの拡張マニュアル内:
${value:-1}
変数の内容に展開されますvalue
。変数が設定されていないか空の場合は、文字列「1」に展開されます。${value: -1}
${var:offset:length}
は、変数の内容の部分文字列を抽出するフォームの短縮形です。 のオフセットは-1
、「文字列の末尾から 1 文字」を意味します。 の部分が欠落しているため、部分文字列は文字列の から末尾まで:length
取得されます。offset
マニュアルにはこう書かれています:
':-' 展開と混同されないように、負のオフセットはコロンから少なくとも 1 つのスペースで区切る必要があることに注意してください。
答え2
rm /data/log || true
は、(私の経験上) スクリプトが . で実行される場合にのみ役立ちますset -e
。コマンドがエラー状態で終了すると、シェルが終了します。スクリプトの作成者は、のフラグset -e
を認識していなかったようです。-f
rm
${value: -1}
はおそらくタイプミスです。が null または設定されていない場合に、変数展開の${value:-1}
デフォルト (-1 ではなく 1、 は構文-
の一部) を提供するであるべきです。:-
value
本当にそうであれば${value: -1}
、実際の意味については glenn jackman の回答を参照してください。
答え3
bash(1) より: ${parameter:-word} デフォルト値を使用します。パラメータが設定されていないか null の場合、word の展開が置き換えられます。それ以外の場合は、パラメータの値が置き換えられます。
|| true
コマンドが true を返すことを確認します。||
は短絡 OR 演算子であり、前のコマンドが false を返す場合は、その後のコマンドが実行され、戻り値が使用されます。