Linux脚本混乱

Linux脚本混乱,linux,bash,shell,Linux,Bash,Shell,这个脚本中的“eval”在做什么?这算什么 #!/bin/bash n=1 for i `eval echo {1..$1}` do n=$((n * i)) done eval echo{1..$1}生成从1到第一个参数的所有数字的列表。然后循环遍历所有这些值并将它们相乘到n,生成n {a..b}语法生成从a到b的所有数字的列表。您必须调用eval,因为。语法需要数字,而不是变量-在运行命令之前放置eval允许变量替换 我还怀疑您想在'eval

这个脚本中的“eval”在做什么?这算什么

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

eval echo{1..$1}
生成从
1
到第一个参数的所有数字的列表。然后循环遍历所有这些值并将它们相乘到
n
,生成
n

{a..b}
语法生成从
a
b
的所有数字的列表。您必须调用
eval
,因为
语法需要数字,而不是变量-在运行命令之前放置
eval
允许变量替换


我还怀疑您想在'eval echo{1..$1}`
中为I编写
,而不是为I'eval echo{1..$1}`
编写
,因为后者会生成语法错误。

eval echo{1..$1}
生成从
1
到第一个参数的所有数字的列表。然后循环遍历所有这些值并将它们相乘到
n
,生成
n

{a..b}
语法生成从
a
b
的所有数字的列表。您必须调用
eval
,因为
语法需要数字,而不是变量-在运行命令之前放置
eval
允许变量替换


我还怀疑您想在`eval echo{1..$1}`
中为I编写
,而不是为`eval echo{1..$1}`
编写
,因为后者会生成语法错误。

eval执行在其参数中找到的shell命令。之所以需要这样做,是因为
运算符要求其参数为文字数字,而不是变量

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

Eval执行在其参数中找到的shell命令。之所以需要这样做,是因为
运算符要求其参数为文字数字,而不是变量

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

为避免混淆和使用
eval
,您可以使用:


for((i=1;i为避免混淆和使用
eval
您可以使用:


for((i=1;反勾号用于计算表达式;
eval
用于计算从1扩展到$1的大括号(函数的参数)。我认为,`echo{1..$1}中的
用于i使用<代码> EVA/COD>通常是不好的。考虑使用<代码> SEQ < /代码>代替:<代码>我在“SEQ 1 $ 1”;执行回音$i;完成“< /代码>”。回退评估表达式;<代码> EVA/COD>评估从1扩展到1元的卷曲括号(函数的参数)。使用<代码> EVA/COD>通常是不好的。考虑使用<代码> SEQ < /代码>代替:<代码>我在“SEQ 1 $ 1”;执行ECH$i;完成< /代码>。是的,我确实忘记了“in”。谢谢解释。RE:“代码> EVA/COD>在运行命令之前做变量替换”。:一般来说这是正确的,但在本例中没有参数替换。在调用
eval
之前,
$1
被替换为
5
。是的,我确实忘记了“in”。感谢您的解释。Re:“
eval
在运行命令之前进行变量替换”:一般来说,这是正确的,但在这种情况下,没有参数替换它。在调用
eval
之前,
$1
被替换为
5
。谢谢,这很有意义!谢谢,这很有意义!C语言对我来说总是更有意义。C语言对我来说总是更有意义。