bash在调用期间如何接受参数[重复]
Posted
技术标签:
【中文标题】bash在调用期间如何接受参数[重复]【英文标题】:How does bash accept argument during a callup [duplicate] 【发布时间】: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/foo
或 chmod ug+x /usr/bin/foo
@Contax,因为==
没有被POSIX sh 标准指定,所以只有一些shell 支持它。另一方面,在比较中使用=
是标准的一部分——因此任何符合 POSIX 的 shell 都可以使用该语法。
【参考方案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。以上是关于bash在调用期间如何接受参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章