为变量赋值

为变量赋值

我在 for 循环中遇到了类似以下的问题:

for VARIABLE in alpha bravo charlie; do
  $VARIABLE=`sed -n '/$VARIABLE/s///gp;' $FILE`
done

$FILE 可能包含类似

alpha sandy
bravo cathy
charlie barbara

预期结果应该是...

echo $alpha     # sandy
echo $bravo     # cathy
echo $charlie   # barbara

不幸的是我得到了错误:

bash: alpha=alpha: command not found
bash: bravo=alpha: command not found
bash: charlie=alpha: command not found

答案1

您没有意识到,但每次循环时都需要运行两次内循环。第一次是为了获取要赋值的变量名,第二次是为了实际进行赋值。您可以使用 eval 来执行此操作。我现在迫不及待地想调试它,但这应该是一个开始:

for VARIABLE in alpha bravo charlie; do
  eval $VARIABLE=$(sed -n '/$VARIABLE/s///gp;' $FILE)
done

在一般情况下,您可能需要在行中转义 $s,具体取决于您是否希望在第一次运行或第二次运行中替换变量。 在您的例子中,除了第一次之外,这没有什么区别,并且您希望在第一次调用时进行替换。

答案2

因此您不必事先知道变量名称,您可以写:

output=$(sed 's/ \+/="/;s/$/"/' "$FILE")
eval "$output"

echo $alpha     # sandy
echo $bravo     # cathy
echo $charlie   # barbara

相关内容