1

我知道 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

这会正确检查至少 1 个参数。

我想逐行了解此代码段的含义。到目前为止,我只能确定 EXPECTEDARGS 是一个变量。

在理解了代码片段之后,我想对其进行修改以检查 2 个参数。

代码片段将在 github gist 中。

我的目标是使用执行脚本

bash -c "$(curl -fsSL https://raw.github.com/gist/4491019)" <arg1> <arg2> 

当然没有 <> 符号。

4

4 回答 4

1

if [ $# -ne $EXPECTEDARGS -o "x$0" == "x" -o $0 == "bash" ]; 然后

  • $# - 脚本的参数总数。
  • "x$0" == "x"- 检查是否$0为空/空。
  • $0- 第一个参数,始终是脚本名称。因此,除非您的脚本名是bash,否则使用字符串 'bash' 进行检查的条件将返回 false 。
  • -o- 或运算符

如果语句为真,则休息只是echo输出到控制台的语句。ifbash 中的语法if

if [ <condition> ]; then
   # ... Statements
fi

要检查参数的数量是否为 2,您只需要以下内容 -

EXPECTEDARGS=2
if [ $# -ne $EXPECTEDARGS ]; then
     # number of arguments are not 2, display usage etc, here
fi

查看 bash 参考手册以获取更多信息

于 2013-01-09T06:23:32.527 回答
1

如果参数数量不等于 ( ne) 到 EXPECTEDARGS 或 ( -o) 脚本名称为空字符串 ( "x$0" == "x") 或 ( -o) 脚本名称bash则报告使用情况并退出。脚本名称测试可能正在测试调用是否通过脚本文件而不是管道或 $(cat script) 之类的东西。

于 2013-01-09T06:25:33.997 回答
1
  • $# 个参数。
  • $0 外壳脚本名称
  • $1,$2,...,$n 参数 1、2 等
  • [条件] 测试一个或多个条件,-ne 不等于,-eq 等于,-gt 大于,-lt 小于,-o 或,= 比较字符串/数字
  • "x$0" = x 检查脚本名称/程序名称是否为空

如果您想了解更多信息,请将脚本另存为文件并尝试使用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

于 2013-01-09T06:27:24.357 回答
1
  1. $# - 存储传递给 shell 程序的命令行参数的数量。

  2. $0 - 指向脚本的文件名。

要让您的脚本检查 2 个参数,请进行以下更改

EXPECTEDARGS=2
if [ $# -lt $EXPECTEDARGS -o "x$0" == "x"  -o $0 == "bash" ]; then
于 2013-01-09T06:31:39.007 回答