変数拡張におけるコロンの目的

変数拡張におけるコロンの目的

古いシェル スクリプトを確認しています。その中で理解できないことが 2 つあります。

rm /data/log || true

value=$(cat /datafile)
if [ ${value: -1} ==  0 ] 
 then echo 'do'
else echo 'dont'
 fi
  1. value: -1- これは実際何をするのですか?
  2. rm /data/log || true- これは何||trueをしているんですか?

答え1

${value: -1}拡大すると最後の文字変数の内容。

${value:-1}違うから${value: -1}

参照シェルパラメータの拡張マニュアル内:

  1. ${value:-1}変数の内容に展開されますvalue。変数が設定されていないか空の場合は、文字列「1」に展開されます。

  2. ${value: -1}${var:offset:length}は、変数の内容の部分文字列を抽出するフォームの短縮形です。 のオフセットは-1、「文字列の末尾から 1 文字」を意味します。 の部分が欠落しているため、部分文字列は文字列の から末尾まで:length取得されます。offset

    マニュアルにはこう書かれています:

    ':-' 展開と混同されないように、負のオフセットはコロンから少なくとも 1 つのスペースで区切る必要があることに注意してください。

答え2

rm /data/log || trueは、(私の経験上) スクリプトが . で実行される場合にのみ役立ちますset -e。コマンドがエラー状態で終了すると、シェルが終了します。スクリプトの作成者は、のフラグset -eを認識していなかったようです。-frm

${value: -1}はおそらくタイプミスです。が null または設定されていない場合に、変数展開の${value:-1}デフォルト (-1 ではなく 1、 は構文-の一部) を提供するであるべきです。:-value

本当にそうであれば${value: -1}、実際の意味については glenn jackman の回答を参照してください。

答え3

bash(1) より: ${parameter:-word} デフォルト値を使用します。パラメータが設定されていないか null の場合、word の展開が置き換えられます。それ以外の場合は、パラメータの値が置き換えられます。

|| trueコマンドが true を返すことを確認します。||は短絡 OR 演算子であり、前のコマンドが false を返す場合は、その後のコマンドが実行され、戻り値が使用されます。

関連情報