2016-11-21 91 views
0

這個慶典不解析邏輯表達式的這種bash否定有什麼問題?

if ! [[ mkdir -p "$available" 
    && mkdir -p "$enabled" 
    && mkdir -p "$logroot" 
    && chmod 755 "$available" "$enabled" "$logroot" ]] 
then 
    echo "Could not make $available, $enabled, and $logroot." 
    exit 1; 
fi 

什麼是正確的形式?

+0

'[[]]'是語法充當名爲'test'命令的擴展版本。它不是一個通用的分組操作符,而是一些用於處理事情的東西,那麼傳統上使用'test'命令(以及一些額外的項目,比如模式匹配和正則表達式,就是常規的'測試'不能處理)。 –

回答

3

如果要執行與&&鏈的多個命令,然後[[ ... ]]是不恰當的。 這似乎這就是你想要的結果:

if ! { mkdir -p "$available" && 
    mkdir -p "$enabled" && 
    mkdir -p "$logroot" && 
    chmod 755 "$available" "$enabled" "$logroot"; } 
then 
    echo "Could not make $available, $enabled, and $logroot." 
    exit 1 
fi 

要回答你的後續問題,的if(!(a && !b && c))相當於將是:

if ! (a && ! b && c); then 
    # ... 
fi 

也就是說,!僅綁定到術語旁邊, ,你需要在!左右放置一個空格。 (感謝@that-other-guy

甚至更​​好,你可以通過使用內{ ...; },而不是分組(感謝@charles-duffy)避免(...)子shell:

if ! { a && ! b && c; }; then 
    # ... 
fi 
+0

謝謝。如果我想要(C樣式)'if(!(a &&!b && c))'not操作符綁定*僅*後面的術語? – spraff

+0

@spraff這真是一個後續的問題......但我加入到我的回答 – janos

+0

換行符內'[['或*下*'&&'和''||是罰款。 – chepner

1

您可以在BASH這樣使用它:

if ! { mkdir -p "$available" && 
    mkdir -p "$enabled" && 
    mkdir -p "$logroot" && 
    chmod 755 "$available" "$enabled" "$logroot"; } 
then 
    echo "Could not make $available, $enabled, and $logroot." 
fi 
  • &&允許您輸入換行的下一個命令
  • 相反的! [[ ... ]]你應該使用! { ... }作爲[[ ... ]]用於評估conditional expressions
+1

* grumbles re:不必要的子shell * –

+0

確實應該是'{...}' – anubhava