bashのヌル演算子「:」、コロンのポイントは何ですか?


13

BASHスクリプトの「null」演算子のポイントは何ですか?if言うことは何もないが、プログラムを適切に実行するためのコマンドが必要な場合に、コマンドに続くプレースホルダーとして使用されることを理解しています。しかし、それの全体的な用途は何ですか?いつ使用しますか?いつそれを使用するのが理にかなっていますか?



1
引用する理由は非常に重要です。なぜもっと必要なのですか?
テルドン

回答:


16

パラメータ拡張の副作用が発生するようにすると便利な場合があります。

たとえば、デフォルト値を設定する

read -p "Enter your name: " name
: ${name:=John Doe}  # if the user entered an empty string
echo "$name"

2
2行目がどのように機能するかをシンボルごとに説明してください。
ルスラン14年

bashマニュアルの:コマンドパラメーターの拡張について読んでください。
グレンジャックマン14年

4
@glennjackmanが参照しているものの概要を説明するために、2行目はnullコマンド:を呼び出し、${name:="John Doe"}展開されます。これは、:への引数として読み取られるため、割り当てが行われます。なし:シェルコマンド、または値として「ジョン・ドウ」を実行しようとし$name、それがすでに設定されている場合
imkendal

13

無限ループにも使用できます。

while : ; do 
   # ....
done

4
ただしwhile true、(a)句読点の使用が少なく、(b)C派生言語により類似しているため、おそらく読みやすくなります。
wchargin 14年

9

これを使用して、プログラムを実行せずにファイルを作成できます。

: > /path/to/file

これはtouch /path/to/filetouchプログラムを実行する必要がないため)無限に高速であり、単なるプレーンよりもわずかに移植性が高い場合があります。

> /path/to/file

これは多くのシステムで動作するようです。同様に、ファイルへの書き込みアクセス権があるかどうか確認するために使用できます

if { : >> /path/to/file;} 2> /dev/null
then
    echo "writeable"
else
    echo "write permission denied"
fi

ただし、これは一般になしでも実行できます:。警告:

  • これは、ファイルが既に存在するかどうかをチェックしません。許可されていない場合、許可があればファイルが作成されます。
  • ファイルが存在せず、スクリプトにファイルを作成する権限がない場合、「書き込み権限が拒否されました」と報告されます。

(これがより信頼できる理由については、リンクされた質問を参照してくださいif [ -w /path/to/file ]。)


5

:昔、Unix V6とThompson Shellでは、実際にgotoステートメントの一部として使用されていました。マニュアルによると、それはもともとUnixのバージョン3で登場しました:

コマンドファイル全体で、最初の非空白文字として:で始まり、1つ以上の空白、ラベルが続く行が検索されます。そのような行が見つかった場合、gotoはコマンドファイルオフセットをラベルの後の行に再配置して終了します。これにより、シェルがラベル付き行に転送されます。

最近では、でbash、それは何もしない演算子として使用され、成功を返します。あなたが見れば確かに、ソースコードを、あなたは両方のことがわかりますtrue:、同じ機能を使用してint colon_builtin()下に、。そこにはいない:非組み込みコマンドがあり、/bin/true実際にはかなり大きなコマンド、それが何のために。

:true、たとえばで使用される任意の場所で使用できますがcommand_that_can_fail || true、それは非専門家を混乱させる可能性があります。詳細はこちらをご覧ください


3

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"、より読みやすく、より多くのコマンドを許可します
Sergiy Kolodyazhnyy

0

スクリプトがエラーを起こさないようにするために、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).
....
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.