2017-10-14 90 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條件中不匹配。

+3

請看看:http://www.shellcheck.net/ – Cyrus

+0

用'echo「$ result」'替換'echo $ result'。變量中有兩個選項卡。 – Cyrus

+0

你真的有條件使用'xinput'包含在後面的引號中嗎?如果你想顯示這些命令的輸出,你需要使用'echo'之類的東西來放在它們的前面。而且,因爲您已經在使用cmd替換的'$(cmd)'形式,所以對這些行也這樣做。我猜你並不需要cmd替換你的有條件使用'xinput ...',。將有興趣看看'shellcheck.net'標誌。 (是的,它的確如此)。祝你好運。 – shellter

回答

1

通過grep獲取的字符串在開始處有一個選項卡,它需要包含在比較的字符串中。再次檢查echo "$result"(加引號)有幫助。

0

在bash(但不是更基本的shell)中,可以使用[[ ]]的模式匹配功能來檢查字符串是否包含模式;使用這種方式,就不再需要擔心領先的標籤,甚至用grep挑選出相關線路的需求:

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

注意,* s的開始和圖案到底是什麼意思「開頭任何事物「和」其次是任何事物「。

此外,這裏並沒有真正需要雙引號$(xinput ...),但國際海事組織保持跟蹤哪些地方是安全的,可以關閉雙引號以及何時不安全,這是太麻煩了。 (=左邊的[[ ]]裏面比較是安全的地方之一,但右邊沒有,並且在[ ]它幾乎是不安全的 - 祝你好運記得所有正確的!)所以我更喜歡總是使用雙引號。