2014-02-19 57 views
3

我試圖做的,如果在外殼如果哈希值不存在,只有做一些事情恰恰相反。我已經學會了從這裏創建Bash哈希:Associative arrays in Shell scripts除非在shell腳本中沒有嗎?

declare -A myhash 

我聲明瞭一個簡單的哈希:

​​

[ ${myhash[$key]+abc} ] 

,看是否myhash [$關鍵]存在或不從這裏:Easiest way to check for an index or a key in an array?

我也學會了補充!在表達前做在if語句相反從這裏:How to make "if not true condition"?

但下面的表達式

if ! [ ${myhash[$key]+abc} ]; then 
    echo $key 

fi 

不起作用,並且沒有印刷的信息。沒有錯誤消息。

我嘗試這樣做:

[ ${myhash[$key]+abc} ] && echo $key 

,並得到了錯誤信息:

abc: command not found 

誰能告訴我怎麼做工作?

+1

考慮編輯您的問題:只有當第一個成功

||下一個命令進行包括1.您收到的確切錯誤消息或其他「不起作用」的證據。 2.一個爲'myhash [key]'提供值的簡單測試用例。 ''..''結構在大多數使用'man test'的系統中都有記錄。它希望將一個命令作爲將'$ {myhash [key] + abc}'轉換爲字符串的結果。祝你好運。 – shellter

+0

好的,剛編輯 – olala

回答

2

首先,這

[ ${myhash[$key]+abc} ] 

將測試如果參數擴展的結果是空的或不是。 ${myhash[$key]}存在並擴展爲一個字符串(本身可能或可能不爲空),或者它不擴展爲字符串「abc」。假設你沒有設置myhash[$key]="",擴展總是產生一個非空字符串,所以命令成功。因此, ! [ ${myhash[$key]+abc} ]總是會失敗。

假設「ABC」是不是在myhash有效的條目,實際上你需要檢查參數擴展爲實際值,或者「ABC」表示未設置鍵:

if [[ ${myhash[$key]+abc} == abc ]]; then 
    echo "$key does not exist in myhash" 
else 
    echo "myhash[$key]=${myhash[$key]}" 
fi 
+0

感謝您的解釋! – olala

1

原因沒有打印是因爲您在設置後檢查該值是否未設置。

這裏是你在做什麼:「爲什麼不是取消設置檢查時,該值設置觸發」

#!/bin/bash 
key=foo 

declare -A myhash      # create associative array 
myhash[$key]="1"      # set the value 
if ! [ ${myhash[$key]+abc} ]; then # check if value is not set 
    echo $key      # if so, print key 
fi 

而現在你問

如果你不是想檢查鍵設置,你不應該用倒立的!存在檢查。

至於[ ${myhash[$key]+abc} ] && echo $keyabc: command not found,我無法解釋這一點。它永遠不會發生。

也就是說,如果你做了${myhash[$key]+abc} && echo $key雖然你會看到。您確定您正確地呈現了您運行的實際示例,並獲得了實際結果:

+0

感謝您的解釋! – olala

0

Easiest way to check for an index or a key in an array?顯示瞭如何檢查它是否存在與[ ${array[key]+abc} ]

如果確實如此,則命令成功退出,所以&&之後的部分被執行(echo "exists"

你要檢查,如果它不存在。因此,如果[..]部分退出失敗,您希望執行命令。因此,使用||代替&&

[ ${myhash[$key]+abc} ] || echo "does not exist" 

&&:只能用下一個命令進行,如果第一次沒有成功