指定带有抑音符的shell变量



我创建了一个脚本,需要将变量传递到shell文件

下面是我在shell中运行时的脚本->这正在按预期进行。我将在我的终端"sh/path/shell.sh"中运行

echo "cyberark"
PasswordRetrived=0 # 0=No, 1=Yes
while [ ${PasswordRetrived} -eq 0 ] ; do
OUT=`/opt/destinationpath -p  GetPassword -p ="password" -p environment="dev" some other stuff  2>&1`
if [ $? -ne 0 ] ; then
#    some script..
else
#    some scripts
fi
done

如果我硬编码OUT=/opt/destionation/ .. .. ..,这将按预期工作。然而,我正在使脚本成为动态的,我将其分配为变量。。所以在终端上运行将类似于"sh/path/shell.sh"$变量">

为了简单起见,假设我已经在脚本中声明了变量
我更新的shell.sh文件如下所示

echo "start cyberark"
#VARIABLE
TEST='/opt/destinationpath -p GetPassword -p ="password" ....'
PasswordRetrived=0 # 0=No, 1=Yes
while [ ${PasswordRetrived} -eq 0 ] ; do
OUT=`$TEST  2>&1`
if [ $? -ne 0 ] ; then
#    some script..
else
#    some scripts
fi
done

当我将$TEST变量分配到OUT=$TEST2>1,这将返回错误。

Invalid characters in User Name. ["] is not allowed

我试过使用"$TEST"。我在这件事上哪里出了问题,因为逻辑似乎是正确的。

更新而不是重音=``我发现我可以根据格雷夫重音(`(符号在终端中的作用使用$((作为命令

,问题是我们能把$((和变量组合在一起吗?假设

$OUT=$(${TEST}  2>&1)

这里的问题是您试图将变量字符串($TEST(作为常规命令行进行求值。当shell解析命令行时,引号删除发生在变量展开之前。

因此,$TEST中的双引号,这里是:-p ="password"(可能还有-u ="user",您还没有显示(不会被删除,而是传递给/opt/destinationpath处的程序。

你可以做:

TEST=$(/opt/destinationpath -p GetPassword -p ="password" ....)

将命令输出保存在TEST中(而不是命令本身(。

但这可能不是您想要的,因为它不会为每个循环迭代重新计算命令。

如果需要在每个循环中运行该命令,最简单的选项是执行OUT=$(/opt/destinationpath -p GetPassword ...)

如果确实需要从变量中获取命令,则可以执行OUT=$(eval "$TEST 2>&1"),但eval也有自己的一系列问题。

相反,您可以使用一个函数来代替TEST:

test_function () { /opt/destinationpath -p GetPassword -p ="password" ...; }

在循环中:

OUT=$(test_function  2>&1)

该函数将运行每个循环,其输出将写入OUT

在bash中,还可以导出函数,以便它们在子shell环境中可用。

相关内容

  • 没有找到相关文章

最新更新