在bash脚本中执行命令行参数时,我似乎无法"访问"我的循环变量的值.我希望能够写出类似的东西
#!/bin/bash
for myvar in 1 2 3
do
$@
done
Run Code Online (Sandbox Code Playgroud)
并运行脚本为./myscript echo "${myvar}".当我这样做时,线条被回显为空.我可能没有完全掌握一个正在评估的地方.
我想要的甚至可能吗?
$myvar 在子脚本运行之前进行评估,因此无法在其中进行评估.
也就是说,当您调用脚本时:
./myscript echo "${myvar}"
Run Code Online (Sandbox Code Playgroud)
实际上被称为:
./myscript echo ''
Run Code Online (Sandbox Code Playgroud)
假设$myvar在封闭环境中是空的.
如果你想成为邪恶(这是邪恶的,并且会产生错误,你不应该这样做),你可以使用eval:
#!/bin/bash
for myvar in 1 2 3; do
eval "$1"
done
Run Code Online (Sandbox Code Playgroud)
...然后打电话给:
./myscript 'echo "${myvar}"'
Run Code Online (Sandbox Code Playgroud)
不太可怕的是导出变量:
#!/bin/bash
export myvar
for myvar in 1 2 3; do
"$@"
done
Run Code Online (Sandbox Code Playgroud)
...但即便如此,您调用脚本的方式也需要避免预先评估.例如,这将与上述一起使用:
./myscript bash -c 'echo "$myvar"'
Run Code Online (Sandbox Code Playgroud)
...但这基本上让你回到了eval.另一方面:
./myscript ./otherscript
Run Code Online (Sandbox Code Playgroud)
......会做你想要的,假设otherscript指的是$myvar某个地方.(这不一定是shell脚本,甚至不是脚本;它可以是可执行文件或其他命令,它仍然可以myvar在环境中找到).
你想要达到的真正目标(即商业目的)是什么?可能有一种方法可以更好地与最佳实践保持一致.