我是 Unix/Linux 新手。我正在尝试理解在我之前开发人员的代码。有人能告诉我这一行是什么if [ $# -lt 2 ]
意思吗?
答案1
在 Bash 中$#
扩展到已设置的位置参数的数量。
if [ $a -lt $b ]
表示如果 a 的值小于 b 的值。
if [ $# -lt 2 ]
意思是如果设置的位置参数数量小于2。
在一个实际示例中,你也许会使用它来计算函数的参数数量。如果你将函数定义为:
count_words(){
if [ $# -lt 2 ]
then
echo "There are less than two words."
else
echo "There are 2 or more words."
fi
}
然后使用不同的单词数调用该函数,结果如下:
$ count_words hello
There are less than two words.
$ count_words how many words
There are two or more words.
$ count_words
There are less than two words.
$ count_words two words
There are two or more words.
答案2
这是由三部分组成的:
$#
是一个 shell 变量,包含脚本或函数的位置参数的数量。[
不是特殊语法,而是程序的名称 - 它是 的别名test
。(查看man [
或man test
。)的命令行
[
被解析为一个表达式:[ $# -lt 2 ]
正在[
使用参数$#
、-lt
、2
和]
(这只是一个视觉分隔符)进行调用。它返回一个成功的退出代码,$?
如果0
表达式计算结果为真(即,如果脚本的参数数量小于 2),则设置为 ,否则返回失败的退出代码,设置$?
为1
。您可以通过输入以下内容来查看:[ 1 -lt 2 ]; echo $? # 1 < 2 is true: 0 [ 2 -lt 1 ]; echo $? # 2 < 1 is false: 1
if condition; then body; fi
评估命令condition
,如果它返回成功的退出代码,则继续评估中的命令body
。
值得注意的是您可能会遇到的一些事情:
该
true
实用程序始终返回成功的退出代码,并且false
始终返回失败,因此您可以在条件下使用它们,例如:while true; do … done
if [ $foo = "yes" ]
$foo
如果扩展为空字符串 ([ = yes ]
) 或包含空格的字符串 ( ) ,则不起作用[ no thanks = yes ]
。因此您经常会看到:if [ "x$foo" = "xyes" ]
因此,它
[
接收单个参数xno thanks
作为的第一个操作数=
。[[
…]]
是一个 shell关键词(不是内置),并使用特殊的解析规则来解决上述限制,并且可能提供额外的功能。