我创建了一个脚本,需要将变量传递到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环境中可用。