Bash 脚本:如何将变量插入 Bash 脚本?

Bash 脚本:如何将变量插入 Bash 脚本?

以下 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,而不是变量的值。

相关内容