Bash 使用{$var}在for循环中进行变量替换
我对bash脚本非常陌生,我正在尝试通过制作这个只需要一系列数字的小脚本来进行练习。我会输入ex5..20,它应该打印范围,但是-它只是回显我输入的内容(在本例中为“5..20”),并且不会扩展变量。有人能告诉我我做错了什么吗 脚本:Bash 使用{$var}在for循环中进行变量替换,bash,Bash,我对bash脚本非常陌生,我正在尝试通过制作这个只需要一系列数字的小脚本来进行练习。我会输入ex5..20,它应该打印范围,但是-它只是回显我输入的内容(在本例中为“5..20”),并且不会扩展变量。有人能告诉我我做错了什么吗 脚本: echo -n "Enter range of number to display using 0..10 format: " read range function func_printrage { for n
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
使用
${}
进行变量扩展。在您的情况下,它将是${range}。您在${}中省略了$,它用于变量扩展和替换
eval
和命令替换$()
eval
是邪恶的,因为你需要净化你的输入,否则人们可以输入像rm-rf/这样的范围代码>和eval
将运行该命令
函数
关键字,它不是POSIX,已被弃用read
的-p
标志代替echoread -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
是可以的,因为您只是在echo
范围内一种方法是使用eval
,
粗略的例子
for i in $(eval echo {0..$range}); do echo $i; done
另一种方法是使用bash的C风格进行循环
for((i=1;i<=20;i++))
do
...
done
for((i=1;i 1000000)绕过扩展不足的一种方法,跳过eval的问题是使用命令替换和seq
返工功能(也避免全局):
不过,感谢您的评论-我不想在子shell中执行命令。我想将$range变量替换为“for n in”循环,因此本质上它变成:“for n in{5..20};do”@ZDRuX啊,我明白了,更正了我的答案。你忘了用$来启动变量扩展。-1,这并不能回答问题。他说的是支架扩展而不是变量扩展。谢谢你,它现在起作用了!使用“函数”有什么错?是否有我应该使用的替代方法?@ZDRuX:函数
不是POSIX,即它不可移植。至于替代方法,请参阅我的代码。使用eval绝对不安全。请尝试输入1..5$(ls)
。不能用这种方式替换变量:。。。;i@karatedog正确,但您并没有真正提供帮助。正确的用法是使用变量名,但不带前缀:for((i=begin;i
function func_print_range
{
for n in $(seq $1 $2); do
echo $n
done
}
func_print_range $start $end