Да, Вы, конечно, можете.Примечание: 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
Прежде всего Вы не должны использовать $(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
Можно использовать встроенное ударом 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
.
Вам не нужен оператор 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}"