我正在尝试弄清楚如何解决“$”导致命令扩展为密码字段的问题。使用命令替换(未知)参数时如何反斜杠“$”?(即 $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"