Разыменуйте связанное имя переменной

Да, Вы, конечно, можете.Примечание: 1>file_1 может быть упрощен до >file_1 как 1 значение по умолчанию.

Например:

$ cat test.ksh
#!/bin/ksh
echo "this goes to stdout" 
echo "this goes to stderr" >&2
echo "this goes to fd 3" >&3
$ ./test.ksh >file_1 3>file_2
this goes to stderr
$ cat file_1
this goes to stdout
$ cat file_2
this goes to fd 3
12
20.02.2012, 23:53
3 ответа

Прежде всего Вы не должны использовать $(echo $FRUITS) в for оператор. Используя просто $FRUITS достаточно. Затем можно покончить с одной из строк в цикле, при помощи eval.

eval просто говорит удару делать вторую оценку следующего утверждения (т.е. еще один, чем его нормальная оценка). \$ переживает первую оценку как $, и следующая оценка затем рассматривает это $ как запуск имени переменной, которое решает к "Желтому" и т.д.

Таким образом, у Вас не должно быть отдельного шага, который делает временную строку (который является тем, чему я верю, было основное намерение Вашего вопроса).

for fruit in $FRUITS ;do
    eval echo $fruit is \$${fruit}_COLOUR
done

Для альтернативного метода, как упомянуто Patrick в комментарии (выше), можно вместо этого использовать ассоциативный массив, в котором индекс элемента не должен быть целым числом. Можно использовать строку, такую как название типа фруктов. Вот пример, с помощью ассоциативного массива удара:

# This declares an associative array (It unsets it if it already exists)
declare -A colour
colour['BANANA']="Yellow"
colour["APPLE"]="Green or Red"
colour[MARTIAN ORANGE]="Blue"

for fruit in BANANA APPLE "MARTIAN ORANGE" ;do 
    echo "$fruit" is "${colour[$fruit]}"
done
10
27.01.2020, 19:55

Можно использовать встроенное ударом eval сделать это:

#!/bin/bash
FRUITS="BANANA APPLE ORANGE"
BANANA_COLOUR="Yellow"
APPLE_COLOUR="Green or Red"
ORANGE_COLOUR="Blue"

for fruit in $( echo $FRUITS );
do
    fruit_colour=${fruit}_COLOUR
    eval echo $fruit is \$${fruit_colour}
done

Отметьте backslashed-знак-доллара. В основном, причины строки "оценки" bash к substitue для $fruit и ${fruit_color}, затем использование eval сделать второй раунд substition перед вызовом echo.

6
27.01.2020, 19:55

Вам не нужен оператор eval. evalв большинстве языков означает, что вы делаете что-то не так.

foo_var=10
bar_var=12

# Build a string with your var name of choice
chosen_prefix='foo'
var_name="${chosen_prefix}_var"

# Use bang to deference it
chossen_value=${!var_name}
echo "Chossen value: ${chossen_value}"
1
27.01.2020, 19:55

Теги

Похожие вопросы