2014-02-10 60 views
5

所以我有以下的小腳本,並保持不知道..

#!/bin/bash 

if [ -d $1 ]; then 
    echo 'foo' 
else 
    echo 'bar' 
fi 

..爲什麼會發生這種打印富時調用不帶參數?如何使test [-d]對空字符串返回true?

+1

'如果[-d 「$ 1」];然後echo'foo';當'$ 1'爲空時,fi'不會打印'foo',但它不能回答你的問題 –

回答

3

來自:info coreutils 'test invocation'(通過man test發現參考):

如果省略表達式中,如果參數爲空和真 否則** test' returns false. **If EXPRESSION is a single argument,測試」返回false。參數可以是任何字符串,包括字符串,如 -d', -1',--', --help'和--version' that most other programs would treat as options. To get help and version information, invoke the commands [--help'和`[--version',沒有通常的關閉 括號。

突出正確:

如果表達式是一個參數,'測試」返回false如果 參數爲空,否則返回true

所以每當我們做[ something ]將返回true如果something不爲空:

$ [ -d ] && echo "yes" 
yes 
$ [ -d "" ] && echo "yes" 
$ 
$ [ -f ] && echo "yes" 
yes 
$ [ t ] && echo "yes" 
yes 

看到第二個[ -d "" ] && echo "yes"返回false,你能解決這個問題的方式:報價$1使-d總是得到一個參數:

if [ -d "$1" ]; then 
    echo 'foo' 
else 
    echo 'bar' 
fi 
3

[ -d ] && echo y 

產生y的原因是,該殼將其解釋爲在test命令,並將其評估爲真。即使說:

[ a ] && echo y 

會產生y。從help test報價:

string  True if string is not the null string. 

這就是爲什麼建議引用變量。說:

[ -d "$1" ] && echo y 

當不帶參數調用時不應產生y

3

原因很簡單明瞭:語法不匹配其中-d被識別爲操作文件名的操作員的情況。它只是作爲一個字符串,並且每個非空字符串都是true。只有給出-d的第二個參數時,纔會將其識別爲運算符,以確定給定的FILE是否爲目錄。

這同樣適用於所有其他運營商如-e-r

在你的情況下,使用雙引號來避免運行到該「問題」:

[ -d "$1" ]