我知道php编程,但我不熟悉bash脚本编程语法。
我有这段代码
EXPECTEDARGS=0
if [ $# -ne $EXPECTEDARGS -o "x$0" == "x" -o $0 == "bash" ]; then
echo "Usage:"
echo " Parameter 1: argument 1 missing"
exit 1
fi
这正确检查至少一个参数。
我想了解此代码段的含义逐行。到目前为止,我只能证明EXPECTEDARGS是一个变量。
在理解了代码片段之后,我想修改它以检查2个参数。
代码片段将在github gist中。
我的目标是使用
执行脚本bash -c "$(curl -fsSL https://raw.github.com/gist/4491019)" <arg1> <arg2>
没有&lt;&gt;当然是符号。
答案 0 :(得分:1)
如果[$#-ne $ EXPECTEDARGS -o“x $ 0”==“x”-o $ 0 ==“bash”];然后
$#
- 脚本的参数总数。 "x$0" == "x"
- 检查$0
是否为空/空。 $0
- 第一个参数,始终是脚本名称。因此,除非您的脚本名称为 bash ,否则使用字符串'bash'进行检查的条件将返回false。 -o
- OR运算符如果echo
语句为true,则Rest只是输出到控制台的if
语句。 bash中if
上的语法是
if [ <condition> ]; then
# ... Statements
fi
要检查参数的数量为2,您只需要以下内容 -
EXPECTEDARGS=2
if [ $# -ne $EXPECTEDARGS ]; then
# number of arguments are not 2, display usage etc, here
fi
答案 1 :(得分:1)
如果参数数量不等于(ne
)到EXPECTEDARGS或(-o
)脚本名称是空字符串("x$0" == "x"
)或(-o
)脚本名称为bash
,然后报告使用情况并退出。脚本名称测试可能正在测试调用是通过脚本文件而不是管道或$(cat脚本)类型的东西。
答案 2 :(得分:1)
如果您想了解更多信息,请将脚本另存为文件并尝试使用echo
打印内容。使用以下命令运行脚本:
bash -c ./script.sh
或
bash script.sh
模仿bash + curl的行为
[ ]
或test
是一个很好的例子,它们只是一个程序,实际上是同一个程序,在C中检查$ 0或argv [0]时,它们的行为有点不同。
$ ls -l /bin/test /bin/\[
-r-xr-xr-x 2 root wheel 43120 Dec 11 2011 /bin/[*
-r-xr-xr-x 2 root wheel 43120 Dec 11 2011 /bin/test*
如果你运行[ 2 -gt 1 ]; echo $?
它将在你的终端打印0,0表示成功其他一切意味着失败。如果您改为呼叫test
:test 2 -gt 1; echo $?
,它也会打印0。
所以if
只运行一个程序并检查退出代码,你也可以这样做:
if true; then
echo success
fi
if false; then
echo fail
fi
true; echo $?; false; echo $?
将打印:成功,0,1
答案 3 :(得分:1)
$# - 存储传递给的命令行参数的数量 shell程序。
$ 0 - 指向脚本的文件名。
要让您的脚本检查2个参数,请进行以下更改
EXPECTEDARGS=2
if [ $# -lt $EXPECTEDARGS -o "x$0" == "x" -o $0 == "bash" ]; then