変数拡張でコロンを使用する

変数拡張でコロンを使用する

古いシェルスクリプトを確認しています。私が理解できない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} はデフォルト値を使用します。引数が設定されていないか空の場合、単語の拡張が置き換えられます。それ以外の場合、パラメータ値は置き換えられます。

|| trueコマンドがtrueを返すことを確認してください。||段落 OR 演算子です。前のコマンドがfalseを返すと、次のコマンドが実行され、戻り値が使用されます。

関連情報