2013-12-14 3 views
0

Что такое «eval» в этом скрипте? Что это значит?Linux Script confusion

#!/bin/bash  
n=1  
for i `eval echo {1..$1}`  
do  
    n=$((n * i))  
done 
+0

обратные сигналы оценивают выражение; 'eval' оценивает фигурные скобки, которые расширяются от 1 до $ 1 (аргумент вашей функции). Я думаю, что просто 'for i in \' echo {1 .. $ 1} \ '' сделал бы это. – Floris

+0

Использование 'eval', как правило, плохое. вместо этого используйте 'seq':' for i in \ 'seq 1 $ 1 \'; do echo $ i; done'. – Lynch

ответ

2

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 
+0

Спасибо, это имеет большой смысл! – user3101059

0

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}`, так как последний генерирует синтаксическую ошибку.

+0

Да, я забыл «в». Спасибо за объяснение. – user3101059

+0

Re: «' eval' выполняет подстановку переменных перед тем, как запускает команду »: это в общем случае, но в этом случае для нее не требуется замена параметров. «$ 1» заменяется на '5', прежде чем' eval' даже вызывается. – ruakh

2

Чтобы избежать путаницы и использование eval вы можете использовать c-style for-loop:

for ((i=1; i<=$1; i++)) 
+0

Язык C всегда имеет для меня больше смысла. – user3101059