可以在Bash中传递文字字符*作为命令行参数吗?

时间:2014-10-19 00:20:18

标签: bash parameters

使用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 * * * 
* 
* 
*

我如何做到这一点?

2 个答案:

答案 0 :(得分:6)

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

  • 将其放在引号中:"*"

  • 将其放在撇号中:'*'

  • 反斜杠转义:\*

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

不起作用的原因是您的脚本存在问题:当您不引用$1(以及$2$3)时,您告诉shell对其内容执行路径名扩展和单词拆分。这实际上几乎不是你想要的 - 在这种情况下显然不是你想要的。所以你的脚本应该是:

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

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

答案 1 :(得分:0)

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