如何读取和修改此bash脚本以检查2个参数而不是1?

时间:2013-01-09 06:13:10

标签: bash

我知道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;当然是符号。

4 个答案:

答案 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

Check the bash reference manual for more info

答案 1 :(得分:1)

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

答案 2 :(得分:1)

  • $#个参数。
  • $ 0 shell脚本名称
  • $ 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表示成功其他一切意味着失败。如果您改为呼叫testtest 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)

  1. $# - 存储传递给的命令行参数的数量 shell程序。

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

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

    EXPECTEDARGS=2
    if [ $# -lt $EXPECTEDARGS -o "x$0" == "x"  -o $0 == "bash" ]; then