Что такое «eval» в этом скрипте? Что это значит?Linux Script confusion
#!/bin/bash
n=1
for i `eval echo {1..$1}`
do
n=$((n * i))
done
Что такое «eval» в этом скрипте? Что это значит?Linux Script confusion
#!/bin/bash
n=1
for i `eval echo {1..$1}`
do
n=$((n * i))
done
Eval выполняет команду оболочки, которую он находит в своих аргументах. Вам нужно сделать это, потому что оператор ..
требует, чтобы его аргументы были буквальными числами, а не переменными.
eval echo {1..$1}
первый заменяет значение $1
в аргумент как часть нормальной подстановки переменной. Если аргумент сценария был 5, это становится:
eval echo {1..5}
Затем eval
выполняет эту команду, поэтому он выполняет:
echo 1 2 3 4 5
Поскольку это все внутренние обратные кавычки, выход echo
подставляется в for
линии, поэтому она становится:
for i in 1 2 3 4 5
Спасибо, это имеет большой смысл! – user3101059
eval echo {1..$1}
генерирует список всех чисел от 1
до первого аргумента. Затем вы перебираете все эти значения и умножаете их на n
, генерируя n!
.
Синтаксис {a..b}
генерирует список всех чисел от a
до b
включительно. Вы должны позвонить eval
, потому что для синтаксиса ..
требуются номера, а не переменные. Помещение eval
допускает замену переменных перед запуском команды.
Я также подозреваю, что вы хотели написать for i in `eval echo {1..$1}`
, а не for i `eval echo {1..$1}`
, так как последний генерирует синтаксическую ошибку.
Да, я забыл «в». Спасибо за объяснение. – user3101059
Re: «' eval' выполняет подстановку переменных перед тем, как запускает команду »: это в общем случае, но в этом случае для нее не требуется замена параметров. «$ 1» заменяется на '5', прежде чем' eval' даже вызывается. – ruakh
Чтобы избежать путаницы и использование eval
вы можете использовать c-style for-loop:
for ((i=1; i<=$1; i++))
Язык C всегда имеет для меня больше смысла. – user3101059
обратные сигналы оценивают выражение; 'eval' оценивает фигурные скобки, которые расширяются от 1 до $ 1 (аргумент вашей функции). Я думаю, что просто 'for i in \' echo {1 .. $ 1} \ '' сделал бы это. – Floris
Использование 'eval', как правило, плохое. вместо этого используйте 'seq':' for i in \ 'seq 1 $ 1 \'; do echo $ i; done'. – Lynch