以下 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 脚本有什么问题吗?
答案1
!
这里的问题是在对包含的变量进行赋值时缺少引号。 shell 尝试解释该!
字符以首先运行历史扩展,然后再将其分配给变量。引用应防止 shell 将其中的内容解释为'..'
特殊内容并保持原样。
作业应该写成
PASSWD='!PaSsWoRd!'
并通过带引号的扩展传递变量
echo "$PASSWD" | openconnect --csd-wrapper="$WRAPPER" --authenticate --user="$USER" --authgroup="$AUTHGROUP" --passwd-on-stdin "$DOMAIN"
set +H
或者通过在脚本顶部添加行来暂时关闭脚本中的历史扩展。随后在最后执行set -H
以禁用它。不建议这样做,强烈建议使用上面引用的正确方法。
答案2
必须使用第一个示例中使用字符串时所应用的相同(正确)逻辑指派字符串也可以转换为变量。
AUTHGROUP=tunnel My Company
三个字里都是分裂的。并PASSWD=!PaSsWoRd!
在脚本中工作,但请记住,它将!
在 shell 中解释,从而触发历史扩展。
请注意,单引号将保留每个括起来的字符的文字值,而双引号将允许例外:$
、`
和\
(!
请参阅 中的引用man bash
)。然后,PASSWD='!PaSsWoRd!'
会起作用,PASSWD="!PaSsWoRd!"
不会(但是,同样,!
仅在交互式 shell 中存在问题,而不是在脚本中)。
同时,当使用变量:echo '$PASSWD'
将回显文字$PASSWD
,而不是变量的值。