【问题标题】:How does bash accept argument during a callup [duplicate]bash在调用期间如何接受参数[重复]
【发布时间】:2015-01-12 07:36:17
【问题描述】:

假设我有一个名为 foo.sh 的 bash 脚本

#!/bin/bash
echo "Type your name"
read personname
if["$personname" == "kevin"]; then
    echo "Your name is kevin"
    exit 1
fi

现在,我将其作为cp foo.sh /usr/bin/foo 授予它全局访问权限

所以,我现在很难同时调用脚本并传递参数。 我只能这样做

bash foo
john

而不是做

bash foo john 

【问题讨论】:

  • 只是为了稍后节省您的时间:您需要在 if 语句中使用更多空格:if [ "$personname" = "$kevin" ]; then。 (并且不要在[...] 中使用==,即使bash 允许。使用=,或者改用[[ ... ]]。)
  • read 从标准输入读取。命令行参数不在标准输入上传递。
  • 哦,很高兴知道这些。我徘徊为什么我们必须使用=而不是==
  • 由于使用了bash foo,这告诉我您没有在 /usr/bin/foo 上设置执行权限位。您应该可以简单地使用foo john 调用脚本。要设置执行位,请使用八进制权限 chmod 0755 /usr/bin/foochmod ug+x /usr/bin/foo
  • @Contax,因为== 没有被POSIX sh 标准指定,所以只有一些shell 支持它。另一方面,在比较中使用= 是标准的一部分——因此任何符合 POSIX 的 shell 都可以使用该语法。

标签: bash


【解决方案1】:

如果你想接收一个参数,你必须这样修改它:

#!/bin/bash
personname=$1
if [ "$personname" = "kevin" ] ; then
    echo "Your name is kevin"
    exit 1
fi

现在您可以使用一个参数foo john 调用脚本。

【讨论】:

  • 现在分配的空格太多。需要是personname=$1,而不是personname = $1;后者调用personname 作为命令,= 作为第一个参数。
【解决方案2】:

参数以variables $1 - $9 结尾。 $0 存储调用脚本的名称(例如,如果您有多个符号链接指向一个脚本并且它应该对每个脚本做出不同的反应,这很有用)。如果您拥有超过 9 个参数,您可以通过调用 shift 或将参数编号括在括号中(${10} 等)来访问其他参数。

除此之外,您应该给自己(可能还有每个人)对该脚本的执行权限,这样您就可以只使用“foo”来调用它,而无需手动调用 bash - 这就是您使用 shebang 行的目的。

【讨论】:

    【解决方案3】:

    在大多数情况下,您可以通过标准输入的重定向批量读取内容。

    bash foo <<HERE
    john
    HERE
    

    在这种情况下,我使用了所谓的 HERE 文件,该文件以两个小于号开头,后跟一个用于声明输入结束的标记。

    另一个例子可能是对程序使用 echo 和管道:

    echo "kevin" | bash foo
    

    同样,您可以从存储在文件或其他可以使用标准输入读取的资源中的名称进行简单的重定向。

    【讨论】:

    • 虽然这解决了问题,但它并没有回答问题。您在这里没有使用参数,您只是在启动程序之前用值填充 STDIN。
    猜你喜欢
    • 2021-10-16
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2017-02-24
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多