2017-10-14 6 views
0

bash-newbieここに。bash:grep-variableで文字列を比較する問題

私は私のラップトップのタッチパッドを有効/無効にするショートカットとして、次の簡単なスクリプトを使用する:条件があれば、しかし、入力されることはありません

#!/bin/bash 

result=$(xinput --list-props 11 | grep "Device Enabled") 
echo $result 
# Output: Device Enabled (140): 1 

if [[ "$result" = "Device Enabled (140): 1" ]]; then 
     `xinput set-prop 11 "Device Enabled" 0` 
else 
     `xinput set-prop 11 "Device Enabled" 1` 
fi 

ザ・。 echo $resultは、変数に実際に比較したい文字列値が含まれていることを示しています。私はしばらく検索していますが、if-conditionでresult-variableとstringがなぜ一致しないのかを理解できません。

+3

ご覧ください:http://www.shellcheck.net/ – Cyrus

+0

'echo $ result'を' echo "$ result"に置き換えてください。変数には2つのタブがあります。 – Cyrus

+0

'xinput'をバッククォートで囲んで条件付きで使うのは本当ですか?それらのコマンドの出力を表示したい場合は、先に 'echo'のようなものを使う必要があります。 '$(cmd)'形式のcmd置換を使っているので、これらの行についても同様にしてください。私は 'xinput ...'を条件付きで使うためにcmd-substitutionを必要としないと思います。 'shellcheck.net'がそれにフラグを付けるかどうかを調べることに興味があります。 (ええ、そうです)。がんばろう。 – shellter

答えて

1

grepで取得した文字列には先頭にタブがあり、比較文字列に含める必要がありました。 echo "$result"(引用符を付ける)をもう一度確認することが役に立ちました。

0

[[ ]]のパターンマッチング機能を使用して、文字列にパターンが含まれているかどうかを確認できます。パターンの最初と最後に* sは「先行意味することを

if [[ "$(xinput --list-props 11 | grep "Device Enabled")" = *"Device Enabled (140): 1"* ]]; then 

注:それを使用して、この方法は、主要なタブを心配する必要性、または関連する行を選択するgrepを使用するためにも必要性を取り除きます「何かによって」および「それに続く」と呼ばれる。

また、二重引用符は$(xinput ...)で実際には必要ありませんが、二重引用符を残しても安全であるかを把握しているIMOと安全でないときは大変です。 (=比較の左側は[[ ]]が安全な場所の1つですが、右側はありません。[ ]それはほとんど決して安全ではありません - すべてを正しく覚えておいてください!)いつも二重引用符を使用します。