我需要了解bash if expression。当然,我使用过谷歌。我知道它是这样的:
if [ expr operator expr ]
then
doSomeThing
fi
但是,据我所知,Bash没有布尔数据类型。我想检查作为参数($ 1)传递的文件是否存在。我会直接这样做的方式:
if [ -e $1 = true ]
then
echo "File exists."
fḯ
或者也许喜欢:
if [ -e $1 ] #Assuming that this is true only if file in $1 exists.
这些都不起作用,我不确定[]的含义。 -e $ 1似乎是一个明智的选择,但它总是如此?字符串和整数有不同的运算符。而且我不能使用括号将表达式组合在一起。这太令人困惑了。
任何人都有一些提示? bash中的IF不能像我尝试过任何其他语言一样工作。
答案 0 :(得分:3)
[...]
表示程序/usr/bin/test
以...
作为参数执行,并且检查其返回值(0
表示true
而x != 0
表示{{ 1}}(是的,false
在这里真的意味着0
,因为true
是UNIX中的0
退出代码))。所以
OK
是对的。它与
相同if [ -e $1 ]; then
echo "ok"
fi
唯一的问题是if test -e $1; then
echo "ok"
fi
可能包含空格。如果是这样$1
会混淆,因为它会得到3个或更多的参数。第一个(/usr/bin/test
)是一元运算符(想要一个参数)。既然你给它2个或更多(一个-e
参数是/usr/bin/test
本身),它会抱怨:
-e
所以,只需使用
...: binary operator expected
如果if [ -e "$1" ];then
echo "ok"
fi
包含空格,那甚至可以工作。另一种可能性是使用
$1
这样做会相同,但它会被bash本身评估,并且没有if [[ -e $1 ]]; then
echo "ok"
fi
程序被分叉。
化合物与往常一样,但/usr/bin/test
表示-a
,and
表示-o
。所以
or
如果if [ -e /etc/fstab -a -e "$1" ]; then
echo "ok"
fi
和作为第一个命令行参数给出的文件存在,将回显ok。
答案 1 :(得分:3)
正如其他人所提到的,[
实际上是test
命令,因此它的参数根据标准参数解析规则进行解析,这会强制一些相当不方便和混乱的语法。例如,你可以在测试命令中使用括号<
和>
,但你最好逃避它们,否则shell会将它们视为不幸的意思。
有一个更好的解决方案:conditional expression,看起来很像老式的测试命令,但在表达式周围使用[[ ]]
而不是[ ]
。因为它不是作为命令解析的,所以它具有更自然的语法,并且还具有一些更强大的功能:
if [[ -e $1 && ! -d $1 ]]; then # if $1 exists but isn't a directory...
# note that quotes are not needed, since $1 will not undergo word splitting
[[ $string == done ]] # string comparison
[[ $string == a* ]] # glob-style pattern matching: does $string start with "a"?
[[ $string == "*"* ]] # partial glob: does $string start with "*"?
[[ $string =~ ^[[:upper:]] ]] # regex matching: does $string start with an upper-case letter?
[[ $string < g ]] # string comparison: is $string alphabetically before "g"
[[ $num -lt 5 ]] # numeric comparison: is $num numerically less than 5
答案 2 :(得分:0)
[]是bash测试命令的简写 http://ss64.com/bash/test.html
如果bash中的操作检查用于测试的命令的返回代码是否为0。
您可以使用以下命令检查任何命令的返回状态:
echo $?
例如试试这个:
test -e myfile.txt echo $? [ -e myfile.txt ] echo ?$
答案 3 :(得分:0)
man test
这应该有效:
function foo() {
if [ -e "$1" ] ; then
echo "$1 exists"
fi
}
有几种方法可以编写复合表达式: 和
[ expr1 -a expr2 ]
或:
[ expr1 -o expr2 ]
您还可以使用[[ expr && expr || expr ]]
语法