我有代码匹配:
if [ $LAST_MODIFIED -lt 3600 || ! -f "$i" ]; then
wget $WGET_OPTS $BASE$i
LAST_MODIFIED=`echo "\`date +%s\` - \`stat -c %Y $i\`" | bc`
if [ $LAST_MODIFIED -lt 500 ]; then
$FILES_MODIFIED++
fi
fi
$i
是通过
for i in `/bin/grep ".gz" index.html | awk -F\" '{print $2}'`
然而,bash告诉我
[: missing `]'
和
-f: command not found
为什么?
答案 0 :(得分:9)
您应该使用[[ ... ]]
代替[ ... ]
或使用-o
代替||
。
if [[ $LAST_MODIFIED -lt 3600 || ! -f "$i" ]]; then
或:
if [ $LAST_MODIFIED -lt 3600 -o ! -f "$i" ]; then
见这里:http://www.ibm.com/developerworks/library/l-bash-test.html
答案 1 :(得分:4)
应该是
if [ $LAST_MODIFIED -lt 3600 ] || ! [ -f "$i" ]; then
[
(和!
)是shell内置函数。它们不是if
。
答案 2 :(得分:1)
尝试将if重写为
if [ cond a ] || [ cond b ]; then
...
fi
答案 3 :(得分:0)
[
是一个实际的内置命令,需要]
作为它的最后一个参数。
但是你的语法使[
“3600
”的最后一个参数成为一个新的命令..
尝试在[
和]
之间执行命令。
答案 4 :(得分:0)
请记住,bash [
内置命令必须遵守外部/bin/[
命令的语法要求(通常是/bin/test
的链接)才能保持向后兼容性sh的古老版本,其中test
([
)不是shell的内部。
为了尊重这种兼容性,解析器必须对待||作为新命令的分隔符,从而终止[
命令。当/bin/test
被称为[
(它在argv [0]上检查它)时,它需要关闭“]”作为参数。
在测试([
)命令中使用-o(或)。
(就我个人而言,我认为使用[
形式的test
就是一个坏主意。正是出于这个原因。新手将其视为一种语法特征......一种条件表达式构造到if
语句,期望语义与其作为命令的实现不一致。所以我把它教导为test
,即使我使用它(有时)作为[
,因为这种做法是如此普遍