所以我有以下的小腳本,並保持不知道..
#!/bin/bash
if [ -d $1 ]; then
echo 'foo'
else
echo 'bar'
fi
..爲什麼會發生這種打印富時調用不帶參數?如何使test [-d]對空字符串返回true?
所以我有以下的小腳本,並保持不知道..
#!/bin/bash
if [ -d $1 ]; then
echo 'foo'
else
echo 'bar'
fi
..爲什麼會發生這種打印富時調用不帶參數?如何使test [-d]對空字符串返回true?
來自: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
該
[ -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
。
原因很簡單明瞭:語法不匹配其中-d
被識別爲操作文件名的操作員的情況。它只是作爲一個字符串,並且每個非空字符串都是true。只有給出-d
的第二個參數時,纔會將其識別爲運算符,以確定給定的FILE是否爲目錄。
這同樣適用於所有其他運營商如-e
,-r
等
在你的情況下,使用雙引號來避免運行到該「問題」:
[ -d "$1" ]
'如果[-d 「$ 1」];然後echo'foo';當'$ 1'爲空時,fi'不會打印'foo',但它不能回答你的問題 –