
このステートメントがあるのですif [ ! - f "$i" -o "$i"x = "$MTR"x]
が、このステートメントで何が達成されるのか疑問に思っています。最初の部分は変数がi
ファイルでないかどうかをチェックするものだと理解していますが、その後の 2 番目の部分-o
(論理 OR を表すものだと思います) が何なのかわかりません。どなたか助けていただければ幸いです。
答え1
正解です。-o は論理 OR を表します。
は、"$i"x = "$MTR"x
の内容を変数$i
とと比較します$MTR
。2つの変数のいずれかが設定されていないか初期化されていない場合に問題を回避するために、両方の変数に が追加されていると
思います。x
答え2
この文が
if [ ! -f "$i" -o "$i"x = "$MTR"x ]
-f "$i"
は、値が$i
通常のファイル (または通常のファイルへのシンボリック リンク) に対応しているかどうかをチェックします。このテストは、 で否定されます。!
は、-o
「論理 OR」を表す古くて古い方法です。
シェル"$i"x = "$MTR"x
の非常に古い実装では必要だったかもしれない、やや扱いにくい方法で、 と が同じ文字列であるかどうかをテストします。sh
$i
$MTR
(現在の)標準sh
シェルでは、この文は次のように記述されます。
if [ ! -f "$i" ] || [ "$i" = "$MTR" ]
あるいは、少し論理的に考えれば、
if [ "$i" = "$MTR" ] && [ -f "$i" ] || [ ! -f "$i" ]
$i
言葉で説明すると、が と同じ文字列であり$MTR
、既存の通常ファイル (またはそれへのシンボリック リンク) を参照している場合、または が$i
ファイル名でない場合は、このステートメントは true になります。
この発言が何を意味するのかを見るのはもっと興味深いかもしれない。間違い$i
とが$MTR
同じ文字列でない場合にのみ偽となります。そして $i
既存のファイルを参照します。