古いシェルスクリプトを確認しています。私が理解できない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} はデフォルト値を使用します。引数が設定されていないか空の場合、単語の拡張が置き換えられます。それ以外の場合、パラメータ値は置き換えられます。
|| true
コマンドがtrueを返すことを確認してください。||
段落 OR 演算子です。前のコマンドがfalseを返すと、次のコマンドが実行され、戻り値が使用されます。