以下 bash 脚本运行良好:
#!/bin/bash
echo '!PaSsWoRd!' | openconnect --csd-wrapper=/home/user/.cisco/csd-wrapper.sh --authenticate --user=abcde123 --authgroup="tunnel My Company" --passwd-on-stdin vpn.mycompany.com
但是,我想用这样的变量替换以前的输入参数:
#!/bin/bash
WRAPPER=/home/user/.cisco/csd-wrapper.sh
USER=abcde123
PASSWD=!PaSsWoRd!
AUTHGROUP=tunnel My Company
DOMAIN=vpn.mycompany.com
echo '$PASSWD' | openconnect --csd-wrapper=$WRAPPER --authenticate --user=$USER --authgroup="$AUTHGROUP" --passwd-on-stdin $DOMAIN
不幸的是,这种尝试不再起作用。我想我必须输入一些引号字符或类似字符。你知道下面的 bash 脚本有什么问题吗?
对包含变量的赋值缺少引号
!
是这里的问题。!
shell在将其分配给变量之前尝试解释该字符以首先运行历史扩展。引用应防止 shell 将其中的内容解释'..'
为特殊内容并保持原样。作业应该写成
并通过带引号的扩展传递变量
set +H
或者通过在脚本顶部包含该行来暂时关闭脚本中的历史扩展。随后set -H
在最后执行以禁用它。不建议这样做,并且强烈建议使用上面正确引用的方法。在将字符串分配给变量时,也必须使用在第一个示例中使用字符串时应用的相同(正确)逻辑。
在
AUTHGROUP=tunnel My Company
这三个字是分裂的。并PASSWD=!PaSsWoRd!
在脚本中工作,但请记住,!
将在 shell 中解释,触发历史扩展。请注意,单引号将保留每个封闭字符的文字值,而双引号将允许例外:
$
、、`
和(请参阅 中的引用)。然后,将起作用,不会(但同样,仅在交互式 shell 中存在问题,而不是在脚本中)。\
!
man bash
PASSWD='!PaSsWoRd!'
PASSWD="!PaSsWoRd!"
!
同时,使用变量时需要双引号:
echo '$PASSWD'
将回显文字$PASSWD
,而不是变量的值。