我的bash脚本如何在命令行参数中看到循环变量?

Cod*_*rer 0 bash shell

在bash脚本中执行命令行参数时,我似乎无法"访问"我的循环变量的值.我希望能够写出类似的东西

#!/bin/bash
for myvar in 1 2 3
do
  $@
done
Run Code Online (Sandbox Code Playgroud)

并运行脚本为./myscript echo "${myvar}".当我这样做时,线条被回显为空.我可能没有完全掌握一个正在评估的地方.

我想要的甚至可能吗?

Cha*_*ffy 6

$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在环境中找到).


你想要达到的真正目标(即商业目的)是什么?可能有一种方法可以更好地与最佳实践保持一致.

  • +1用于询问相关问题"什么是真正的目标". (2认同)