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