回答:
パラメータ拡張の副作用が発生するようにすると便利な場合があります。
たとえば、デフォルト値を設定する
read -p "Enter your name: " name
: ${name:=John Doe} # if the user entered an empty string
echo "$name"
${name:="John Doe"}
展開されます。これは、:への引数として読み取られるため、割り当てが行われます。なし:シェルコマンド、または値として「ジョン・ドウ」を実行しようとし$name
、それがすでに設定されている場合
無限ループにも使用できます。
while : ; do
# ....
done
while true
、(a)句読点の使用が少なく、(b)C派生言語により類似しているため、おそらく読みやすくなります。
これを使用して、プログラムを実行せずにファイルを作成できます。
: > /path/to/file
これはtouch /path/to/file
(touch
プログラムを実行する必要がないため)無限に高速であり、単なるプレーンよりもわずかに移植性が高い場合があります。
> /path/to/file
これは多くのシステムで動作するようです。同様に、ファイルへの書き込みアクセス権があるかどうかを確認するために使用できます。
if { : >> /path/to/file;} 2> /dev/null
then
echo "writeable"
else
echo "write permission denied"
fi
ただし、これは一般になしでも実行できます:
。警告:
(これがより信頼できる理由については、リンクされた質問を参照してくださいif [ -w /path/to/file ]
。)
:
昔、Unix V6とThompson Shellでは、実際にgoto
ステートメントの一部として使用されていました。マニュアルによると、それはもともとUnixのバージョン3で登場しました:
コマンドファイル全体で、最初の非空白文字として:で始まり、1つ以上の空白、ラベルが続く行が検索されます。そのような行が見つかった場合、gotoはコマンドファイルオフセットをラベルの後の行に再配置して終了します。これにより、シェルがラベル付き行に転送されます。
最近では、でbash
、それは何もしない演算子として使用され、成功を返します。あなたが見れば確かに、ソースコードを、あなたは両方のことがわかりますtrue
と:
、同じ機能を使用してint colon_builtin()
下に、。そこにはいない:
非組み込みコマンドがあり、/bin/true
実際にはかなり大きなコマンド、それが何のために。
:
はtrue
、たとえばで使用される任意の場所で使用できますがcommand_that_can_fail || true
、それは非専門家を混乱させる可能性があります。詳細はこちらをご覧ください。
if
否定的な側面でのみ何かをしたい場合は、コマンドの肯定的なテストで使用できます。例えば:
if [[ True == False ]]; then
:
else
echo "true <> flase"
fi
:
bashがないと、構文エラーが生成されます。
これは単純化された例です。一般に、そのコードセグメントをまだ記述しておらず、エラーを生成しないものが必要な場合に、予備コーディングでこのような手法を使用します。
if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fi
、firefoxが実行されていない場合にのみエラーを表示します。つまり、コマンドにエラーがある場合にのみ何かをする必要がある場合。ある意味では、これはに相当しますがpgrep firefox || echo "Firefox not running"
、より読みやすく、より多くのコマンドを許可します
スクリプトがエラーを起こさないようにするために、SSHコマンドを使用したスクリプトで使用しました。
この場合、ユーザーが一連のサーバーに接続できるかどうかを確認します。接続に問題がなければ、リモートホストはエコーを返します。接続が失敗すると、SSHはエラーで応答します。ただし、失敗した場合、SSHコマンドの値ではなく0でスクリプトを終了する必要があります。したがって、本質的に||
nullコマンドでORすることでSSHエラーをトラップします:
。次のようになります。
#!/bin/bash
for i in $(cat servers.txt); do
echo -n "$i ";
ssh user@${i} 'echo OK' || :;
done
そのようにして、エラーコードではなくSSHから出力を取得します。
....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....