我有一个循环创建了一组变量,如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
答案 0 :(得分:2)
永远不要使用eval
,除非没有别的办法,你真的知道自己在做什么。
STATD$counter=$(...)
应该出错。这不是有效的赋值,因为字符串“STATD$counter
”不是有效的变量名。会发生什么(使用一个具体的例子,如果计数器碰巧是3并且您的管道在$( )
输出“输出”中,bash只会将该行扩展到“STATD3=output
”所以它将会尝试找到一个名为“STATD3=output
”的命令并运行它。可能这不是你想要的。
听起来你想做的一切都可以通过数组完成。如果您不熟悉bash数组,请查看Greg's Wiki,特别是this page或bash手册页,了解如何使用它们。
例如,在循环中你没有在你的问题中发帖:make disk
(不是DISK
:don't use all upper case variable names)这样的数组
disk+=( "new value" )
甚至
disk[counter]="new value"
然后在你的问题的循环中,你也可以使statd
成为一个数组,并通过
statd[counter]="... ${disk[counter]} ..."
再次值得一提:避免使用eval
。