Bash脚本使用Bash变量作为参数执行shell命令

时间:2011-07-30 00:59:49

标签: bash variables command

我有一个循环创建了一组变量,如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

1 个答案:

答案 0 :(得分:2)

永远不要使用eval,除非没有别的办法,你真的知道自己在做什么。

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

听起来你想做的一切都可以通过数组完成。如果您不熟悉bash数组,请查看Greg's Wiki,特别是this page或bash手册页,了解如何使用它们。

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

disk+=( "new value" )

甚至

disk[counter]="new value"

然后在你的问题的循环中,你也可以使statd成为一个数组,并通过

为它分配来自磁盘的值
statd[counter]="... ${disk[counter]} ..."

再次值得一提:避免使用eval