Как запустить строку со значениями как команду в bash?

Как запустить строку со значениями как команду в bash?

Вот мой небольшой фрагмент bash-скрипта.

i=5
command='echo $i'
$command

Я хочу, чтобы этот скрипт печатал 5, т.е. я хочу, чтобы он запускал echo и печатал 5. Но вместо этого он продолжает печатать $i. Так как мне решить эту проблему?

решение1

Это было бы:

eval "$command"

Если вы хотите, чтобы содержимое $commandоценивалось как шелл-код.

Если вы не можете гарантировать, что это $commandне начнется с -(что может привести к тому, evalчто некоторые оболочки будут bashрассматривать это как опцию), вы можете запустить:

eval " $command"

вместо этого. Этот дополнительный начальный пробел не повлияет на способ разбора команды и не позволит $commandрассматривать ее как опцию, evalесли она начинается с -. eval -- "$command"также будет работать в некоторых оболочках (включая bash), но не является POSIX (IIRC) и не будет работать, например, в dashоболочке Bourne.

Обратите внимание, что, вероятно, вы $commandдолжны быть:

command='echo "$i"'

Если только вы не намеревались $iподвергнуться разделению+глоб

Потенциально лучшим способом хранения кода в «переменных» было бы использование функций:

mycommand() { echo "$i"; }

(используется mycommandвместо command, так как commandэто уже существующая команда).

Если $commandэто break/ continue/ return, поведение будет зависеть от оболочки.

Если вы хотите $commandсохранитьпростая команда, то есть список слов, первое из которых ищется как команда для выполнения со списком слов в качестве аргументов, вы бы использовали переменную массива:

command=('echo' '$i' "$i")
"${command[@]}"

Это запустит echo, с echo, $iи содержимым в $iкачестве аргументов.

command='echo $i ;x /* '$i
$command

(со значением по умолчанию $IFS) — это тот, который имел бы наименьший смысл. Там, $commandбудет содержать строку. Первый $iоставлен как есть, второй расширен (как вне одинарных кавычек), а затем эта строка будет подвергнута split+glob (как $commandне внутри двойных кавычек), результатом чего станет несколько слов, взятых какпростая командаснова.

Связанный контент