语法暗地里是[程序!
$ 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