【问题标题】:Bash script execute shell command with Bash variable as argumentBash 脚本以 Bash 变量为参数执行 shell 命令
【发布时间】:2011-10-16 08:40:48
【问题描述】:

我有一个循环创建一组变量,如 DISK1、DISK2...,其中变量名称末尾的数字由循环创建,然后加载设备名称的路径。现在我想在另一个循环中使用这些变量来执行一个 shell 命令,但是该变量没有将其内容提供给 shell 命令。

for (( counter=1 ; counter<=devcount ; counter++))
do
    TEMP="\$DISK$counter"

# $TEMP should hold the variable name of the disk, which holds the device name
# TEMP was only for testing, but still has same problem as $DISK$counter

    eval echo $TEMP  #This echos correctly

    STATD$counter=$(eval "smartctl -H -l error \$DISK$counter" | grep -v "5.41" | grep -v "Joe")
    eval echo \$STATD$counter

done

【问题讨论】:

  • 预期输出?实际输出?
  • 输出无关紧要,因为这个问题是关于功能的

标签: bash variables command


【解决方案1】:

永远不要使用eval,除非没有其他方法并且你真的知道自己在做什么。

STATD$counter=$(...) 应该给出一个错误。这不是一个有效的赋值,因为字符串“STATD$counter”不是一个有效的变量名。会发生什么(使用一个具体的例子,如果计数器恰好是 3 并且您的管道在$( ) 输出“输出”中,bash 只会将该行扩展到“STATD3=output”,所以它会尝试找到一个名为“STATD3=output”的命令并运行它。很可能这不是您想要的。

听起来你想做的所有事情都可以用数组来完成。如果您不熟悉 bash 数组,请查看 Greg's Wiki,尤其是 this page 或 bash 手册页以了解如何使用它们。

例如,在您没有在问题中发布的循环中:使disk(不是DISKdon't use all upper case variable names)这样的数组

disk+=( "new value" )

甚至

disk[counter]="new value"

然后在您问题的循环中,您也可以将 statd 设为一个数组,并使用磁盘中的值分配它

statd[counter]="... ${disk[counter]} ..."

值得再说一遍:避免使用eval

【讨论】:

  • 如果您想混淆诸如制作二维数组之类的东西,那么评估非常棒;-)
  • 感谢您的回答。我只是将它全部转换为数组,这就解决了整个问题。至于 STATD$counter,这甚至无关紧要,因为它在尝试执行 shell 命令时未能评估 $DISK$counter(吐出内容),所以它从来没有尝试分配任何东西到 'basterdized' STATD$counter 变量。 :-) 所以即使你没有完全回答为什么 $DISK$counter 不会扩展,你还是把我推向了我应该开始的方向。谢谢!
  • @sdproto:你确定是 \$DISK$counter 部分失败了吗?该部分应该正确扩展,并且您的 cmets / test echo 在此之前似乎可以确认。
猜你喜欢
  • 2020-06-24
  • 2012-10-30
  • 2014-06-28
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
相关资源
最近更新 更多