【问题标题】:Possible to pass literal character * as a command line argument in Bash?可以在 Bash 中将文字字符 * 作为命令行参数传递吗?
【发布时间】:2014-10-19 00:20:18
【问题描述】:

获取 bash 脚本 wtf.sh

#!/bin/bash
echo $1
echo $2
echo $3
./wtf.sh 1 2 3 
1 
2
3

./wtf.sh * * * 



end

./wtf.sh 1 * * 
1
wtf.sh
wtf.sh 

./wtf.sh 1 "*" "*"
1
wtf.sh
wtf.sh

我知道 * 是 Bash 中的特殊参数,但这是否意味着无法将 * 本身作为命令行中的文字字符传递?我期待的是

./wtf.sh * * * 
* 
* 
*

我该如何做到这一点?

【问题讨论】:

    标签: bash parameters


    【解决方案1】:

    您可以通过以下方式传递文字 *

    • 用引号括起来:"*"

    • 用撇号表示:'*'

    • 反斜杠转义:\*

    这些都是等价的(在这种情况下)。

    不起作用的原因是你的脚本有问题:当你不引用$1(以及$2$3)时,你是在告诉shell执行路径名扩展和分词关于他们的内容。这实际上几乎从来都不是你想要的——在这种情况下,它显然不是你想要的。所以你的脚本应该是:

    #!/bin/bash
    echo "$1"
    echo "$2"
    echo "$3"
    

    这里,参数必须用双引号 ("$1") 括起来,这允许进行参数扩展,但禁止路径名扩展和分词。

    【讨论】:

    • 我刚刚用“”的修改进行了测试,结果还是一样。也就是说,如果除了您的脚本修改之外,我还在命令行的每个星号周围添加了引号 ./wtf.sh "*" ,输出为 * ,我就能获得预期的输出。感谢您的澄清。
    • @Peter:是的,两个地方都需要引号。您需要引用 * 以便它不会在命令行上展开,并且您需要引用 $1 以便展开不会全局展开。我试图让答案更清楚。
    • 反斜杠非常适合我!太感谢了! :)
    【解决方案2】:

    如果您将* 作为命令行选项的值传递并使用getopt 提取命令行选项,那么您可以使用-S*,其中-S 是命令行选项,* 是它的值.请注意S* 之间没有空格。如果你给空间,那么路径扩展会自动发生。

    【讨论】:

    • 看来您没有理解问题和问题:rici 的回答发现了主要问题(不幸的是,这是人们尝试在 shell 中编程的最常见问题):缺少引号!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2018-08-23
    • 2016-10-10
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多