私の友人はBashスクリプトを使って遊んでいて、私にそのスクリプトを見てほしいと言いました。 (彼は他の友人にそのスクリプトを代わりにしてもらうように頼んだ。)
if [ "`pidof transmmission-gtk`"=0 ];
`
特にpidof自体が二重引用符で囲まれている場合、前の(バックティック)のポイントは正確に何ですか?
ちなみに分散解像度パッケージ用です。私はbashをあまり使用していないので尋ねます。
答え1
バックティックは次のことを意味します。コマンドの置き換え:拡張結果`pidof transmission-gtk`
は実行中のコマンドの出力ですpidof transmission-gtk
。`pidof transmission-gtk`
これを書くもう1つの方法$(pidof transmission-gtk)
はこの選択肢であり、推奨されます(バックティック自体内のコマンドに引用符が含まれている場合は欠点がなく、問題を回避します)。
二重引用符を使用すると、コマンド置換の結果が別の単語に分割され、ワイルドカードパターンとして解釈されるのを防ぎます。シェルスクリプトを起動した場合は、心配しないでください。コマンド置換の周りに常に二重引用符を入れることを覚えておいてください。変数置換の場合も同様です。たとえば、Always write "$foo"
、never plain です$foo
。
書かれたこのコードは意味がありません。テストには、=0
(実行中のプロセスがない場合transmission-gtk
)、1234=0
(一致するプロセスがある場合)、または123 456=0
(スペースが含まれていてもシェル用語として単一の単語)に似た単語が含まれています。 )。テストの個々の単語は常に正しいと見なされます。文字列が他の文字列と同じかどうかをテストするには、次のようにします[ "string1" = "string2" ]
(角かっこの両側と演算子の両方にスペースが必要です)。数値的等価性をテストするには、true-eq
などの演算子を使用します。[ 1 -eq 01 ]
これには、実行中のプロセスがあるかどうかをテストする2つの方法がありますtransmission-gtk
。
出力が空であることをテストします。
if [ -z "$(pidof transmission-gtk)" ]; then …
戻り状態が
pidof
0 でないことをテストして失敗を示します。コマンドの出力は使用されないため、/dev/null
(大きな穴)にリダイレクトされます.if ! pidof transmission-gtk >/dev/null; then
答え2
bash(1)
マンページ、拡張部分、コマンドの置き換え部分:
Command substitution allows the output of a command to replace the com-
mand name. There are two forms:
$(command)
or
`command`
Bash performs the expansion by executing command and replacing the com-
mand substitution with the standard output of the command, with any
trailing newlines deleted.
[
コンクリートブロックほどスマートで空の文字列が好きではないので引用します。