我在 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