我非常擅长打击脚本,我试图通过制作一个只需要一系列数字的小脚本来练习。我会输入前。 5..20并且它应该打印范围,但是它只是回显我输入的内容(" 5..20"在这个例子中)并且不扩展变量。有人能告诉我我做错了吗?
脚本:
echo -n "Enter range of number to display using 0..10 format: "
read range
function func_printrage
{
for n in {$range}; do
echo $n
done
}
func_printrange
答案 0 :(得分:15)
eval
和命令替换$()
eval
是邪恶的,因为您需要清理输入,否则人们可以输入rm -rf /;
和eval
之类的范围function
关键字,它不是POSIX且已被弃用read
的{{1}}标志代替echo 但是,出于学习目的,您可以这样做:
-p
注意:在这种情况下,使用read -p "Enter range of number to display using 0..10 format: " range
func_printrange()
{
for n in $(eval echo {$range}); do
echo $n
done
}
func_printrange
即可,因为您只有eval
'范围
答案 1 :(得分:6)
一种方法是使用eval
,
粗略的例子,
for i in $(eval echo {0..$range}); do echo $i; done
另一种方法是使用bash的C风格for
循环
for((i=1;i<=20;i++))
do
...
done
最后一个比第一个更快(例如,如果你有$ range&gt; 1 000 000)
答案 2 :(得分:5)
解决缺乏扩展的一种方法,并跳过eval的问题是使用命令替换和seq。
重写函数(也避免使用全局变量):
function func_print_range
{
for n in $(seq $1 $2); do
echo $n
done
}
func_print_range $start $end
答案 3 :(得分:-1)
使用${}
进行变量扩展。在您的情况下,它将是$ {range}。你没有$ {}中的$,它用于变量扩展和替换。