unix中的多个if条件

时间:2013-04-15 22:35:55

标签: bash shell unix

我正在尝试运行以下逻辑

if [-f $file] && [$variable -lt 1] ; then
  some logic 
else
print "This is wrong"
fi

失败并出现以下错误

MyScipt.ksh[10]: [-f: not found

如果第10行是if条件,我已经输入了。

我也试过

if [-f $file && $variable -lt 1] ; then

给出了同样的错误。

我知道这是一个语法错误,但我不确定,当我在&&

中使用if block的多个条件时,正确的语法是什么

3 个答案:

答案 0 :(得分:3)

[不是运算符,它是程序的名称(或者有时是内置函数)。使用type [进行检查。无论如何,您需要在其后面放置一个空格,以便命令行解析器知道该怎么做:

if [ -f $file ]

在这种情况下,&&运算符可能无法执行您想要的操作。您应该阅读bash(1) documentation.在这种特定情况下,您似乎想要的是:

if [ -f $file -a $variable -lt 1 ]

或者更现代的bash语法:

if [[ -f $file && $variable -lt 1 ]]

答案 1 :(得分:2)

[语法秘密地是一个程序!

$ type [
[ is a shell builtin
$ ls -l $(which [)
-rwxr-xr-x 1 root root 35264 Nov 19 16:25 /usr/bin/[

由于shell解析(技术上和#34; lexes")命令行的方式,它会看到:

  • if - 关键字
  • [-f - 计划[-f
  • $file] - [-f程序的字符串参数,由$file]的值构成。如果$file是" asdf",那么这将是asdf]

等等,按照你的命令行事。你需要做的是包括空格,shell用来分隔命令的不同部分(标记):

if [ -f "$file" ]; then

现在[独立,可以被识别为命令/程序。另外,]自称为[的参数,否则[会抱怨。关于这个的更多说明:

  • 您不需要在;之前或之后放置空格,因为这是shell识别的特殊分隔符。
  • 你应该总是"双引号" $ variables因为它们在shell执行lexing之前被扩展。这意味着如果一个不带引号的变量包含一个空格,shell会将该值视为单独的标记,而不是一个字符串。

在if-test中使用&&并不是通常的方法。 [(也称为test)将-a理解为"和"所以这就是你想要的:

if [ -f "$file" -a "$variable" -lt 1 ]; then

答案 2 :(得分:1)

if块中使用-a表示AND。 请注意-f选项前面的空格。

if [ -f $file -a $variable -lt 1] ; then
    some logic 
else
     print "This is wrong"
fi