是否有if
用于 Bash 脚本的所有开关的列表?有时我看到有人在使用它,我想知道他们使用的开关实际上是做什么的。
一个例子就是-z
这个。我知道如何使用它,但我不知道它来自哪里。
if [ -z "$BASH_VERSION" ]; then
echo -e "Error: this script requires the BASH shell!"
exit 1
fi
任何参考资料、指南、帖子、答案将不胜感激。
是否有if
用于 Bash 脚本的所有开关的列表?有时我看到有人在使用它,我想知道他们使用的开关实际上是做什么的。
一个例子就是-z
这个。我知道如何使用它,但我不知道它来自哪里。
if [ -z "$BASH_VERSION" ]; then
echo -e "Error: this script requires the BASH shell!"
exit 1
fi
任何参考资料、指南、帖子、答案将不胜感激。
查看 Bash 手册页 ( man bash
)。选项在以下CONDITIONAL EXPRESSIONS
部分中指定:
CONDITIONAL EXPRESSIONS
Conditional expressions are used by the [[ compound command and the
test and [ builtin commands to test file attributes and perform string
and arithmetic comparisons. Expressions are formed from the following
unary or binary primaries. If any file argument to one of the pri-
maries is of the form /dev/fd/n, then file descriptor n is checked. If
the file argument to one of the primaries is one of /dev/stdin,
/dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively,
is checked.
Unless otherwise specified, primaries that operate on files follow sym-
bolic links and operate on the target of the link, rather than the link
itself.
-a file
True if file exists.
... more options ...
帮助中也有说明:
$ help [
[: [ arg... ]
This is a synonym for the "test" builtin, but the last
argument must be a literal `]', to match the opening `['.
是的。这些被称为条件表达式,它们由[[
复合命令和内置命令使用(只是 的同义词)。test
[
[
test
阅读Bash 参考手册的第6.4 节 Bash 条件表达式,其中包含所有这些开关及其用法的列表。
单方括号 ( [ ... ]
) 是test
命令的同义词。如果您查看test 的手册页,您将看到几乎所有(Bash 可能有一些额外的未在此提及的)各种if 开关,正如您所说的那样。都在一个容易找到的地方。
如果您使用双方括号 ( [[ ... ]]
),则您使用的是扩展的 Bash 测试集。这些主要与正则表达式匹配和全局匹配(如果您也有该设置,还有扩展的全局匹配)有关。为此,您必须阅读该 Bash 手册页。
你打电话给他们if switch,但这并不正确。这些是测试if
,实际上与命令无关。
该if
命令仅执行您给它的命令,然后如果该命令返回退出代码0
,将运行该语句的if
一部分。if
否则,它将运行该else
部分(如果存在)。
让我们看看这个:
rm foo.test.txt # Hope this wasn't an important file
if ls foo.test.txt
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
ls: foo.test.txt: No such file or directory
I can't find it anywhere..
该if
语句运行该ls foo.test.txt
命令并且该ls
命令返回一个非零值,因为该文件不存在。这会导致if
语句执行else
子句。
让我们再试一次...
touch foo.test.txt # Now this file exists.
if ls foo.test.txt # Same "if/else" statement as above
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
foo.test.txt
This file exists
在这里,ls
命令返回了0
退出状态(因为文件存在并且文件存在并且可以由ls
命令声明。
通常,您不应使用该ls
命令来测试文件。我只是在这里使用它来显示if
语句执行命令,然后根据该命令的退出状态执行if
orelse
子句。如果你想测试一个文件是否存在,你应该使用test -e
命令而不是ls
命令:
if test -e foo.test.txt # The same as above, but using "test" instead of "ls"
then
echo "This file exists"
else
echo "I can't find it anywhere..."
fi
如果文件存在,test -e
将返回退出状态0
。否则,它将返回非零退出状态。
如果你这样做:
ls -i /bin/test /bin/[
10958 /bin/[ 10958 /bin/test
那10958
是inode。具有相同inode的文件是同一文件的两个不同名称。因此[
和test
command 是软链接的1。这意味着您可以使用[
而不是test
:
if [ -e foo.test.txt ]
then
echo "This file exists"
else
echo "I can't find it anywhere.."
fi
是不是很眼熟?
1.在 Bash 中,test
and[
是内置的,所以当你在 BASH 中运行这些命令时,它没有运行/bin/test
or /bin/[
。但是,它们仍然相互关联。
实际上if
,提供这些的并不是它——它的[
名称更为人所知的是test
. help test
应该给你一个它可以采取的所有选项的列表。你也可以看看标准,如果你在乎的话。