У меня проблемы с циклом 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

2 ответа2

1

Так что вам не нужно заранее знать имена переменных, вы можете написать:

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

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

Вы этого не понимаете, но вам нужно дважды запускать внутренний цикл через цикл. Один раз, чтобы получить имя переменной для назначения, затем второй раз, чтобы фактически сделать назначение. Вы делаете это с Eval. Я слишком нетерпелив, чтобы отладить это сейчас, но это должно быть началом:

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

В общем случае вам может понадобиться экранировать $ s в вашей строке, в зависимости от того, хотите ли вы заменить переменные в первом запуске или во втором. В вашем случае это не имеет значения, за исключением первого, и вы хотите его при первом вызове.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .