如何传递包含特殊字符的未知命令行参数(bash)?

如何传递包含特殊字符的未知命令行参数(bash)?

我正在尝试弄清楚如何解决“$”导致命令扩展为密码字段的问题。使用命令替换(未知)参数时如何反斜杠“$”?(即 $1、$2)

例如,在名为“testPass”的脚本中:

密码="$1"

回显 $PASSWORD

如果我输入:

测试通过 abcd123#$asd

那么输出是:

abcd123#

我也尝试过单引号(echo '$PASSWORD'),正如大多数人在网上说的那样,但是这只是打印:

密码

我甚至尝试使用 printf 命令,该命令也在网上提到过,如下所示:

printf'%q\n''$密码'

然而,这会做一些类似的事情,输出如下:

\$密码

我搜索了很长时间才弄清楚,但是我是 UNIX 新手,所以我可能遗漏了一些我不知道的东西。如果您有任何想法,请告诉我,谢谢。

答案1

您的 $1 分配和“echo”命令工作正常。($变量只扩展一次 - 如果扩展的值看起来像另一个变量,那就是不是再次扩大。)

问题在于缺失的$asd部分从一开始就没有出现在脚本中。

交互式 shell 命令行执行变量扩展的方式与 shell 脚本完全相同。当您输入 时abcd123#$asd,该$asd部分将充当变量名称,并在整个“testPass”命令运行之前扩展为(在本例中)空值。

因此您应该引用的是命令行参数本身:

  • 变量扩展永远不会发生在单引号内:

    echo 'The password is abcd123#$asd'
    
    testPass 'abcd123#$asd'
    
  • 变量在双引号内展开,或者根本没有引号,但可以通过转义$:来避免这种情况

    echo The password is abcd123#\$asd
    
    testPass "abcd123#\$asd"
    

相关内容