1

我正在尝试运行以下逻辑

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

这给出了同样的错误。

我知道这是一个语法错误,但我不确定,当我&&在 a 中使用多个条件时正确的语法是什么if block

4

3 回答 3

3

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

if [ -f $file ]

在这种&&情况下,操作员也可能不会做你想做的事。您可能应该阅读bash(1)文档。 在这种特定情况下,您想要的似乎是:

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

或者在更现代的 bash 语法中:

if [[ -f $file && $variable -lt 1 ]]
于 2013-04-15T22:38:00.017 回答
2

语法暗地里是[程序!

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

由于 shell 解析(技术上“lexes”)你的命令行的方式,它会看到:

  • if- 关键字
  • [-f- 该程序[-f
  • $file]- 程序的字符串参数[-f,由 和 的值$file组成]。如果$file是“asdf”,那么这将是asdf]

等等,听从你的命令。您需要做的是包含空格,shell 使用空格来分隔命令的不同部分(标记):

if [ -f "$file" ]; then

现在[独立存在,可以被识别为命令/程序。此外,]作为 的论据独立存在[,否则[会抱怨。关于这一点的更多注意事项:

  • 您不需要在 之前或之后放置空格;,因为这是 shell 识别的特殊分隔符。
  • 您应该始终“双引号” $variables 因为它们在 shell 进行词法分析之前被扩展。这意味着如果一个未加引号的变量包含一个空格,shell 将把该值视为单独的标记,而不是一个字符串。

在这样的 if-test 中使用&&不是通常的方法。[(也称为test)理解-a为“和”,因此这符合您的意图:

if [ -f "$file" -a "$variable" -lt 1 ]; then
于 2013-04-15T22:52:57.850 回答
1

在块中使用 -aif来表示 AND。注意 -f 选项前面的空格。

if [ -f $file -a $variable -lt 1] ; then
    some logic 
else
     print "This is wrong"
fi   
于 2013-04-15T22:38:43.167 回答