16 variables syntax bash variable-expansion
#!/bin/sh
for i in {1..5}
do
echo "Welcome"
done
Run Code Online (Sandbox Code Playgroud)
会工作,显示欢迎5次.
#!/bin/sh
howmany=`grep -c $1 /root/file`
for i in {1..$howmany}
do
echo "Welcome"
done
Run Code Online (Sandbox Code Playgroud)
Doesn't work! howmany would equal 5 as that is what the output of grep -c would display. $1 is parameter 1 which is specific when running the script.
Any ideas?
mkl*_*nt0 18
如果意图只是迭代一个范围内的数字 - 如OP的情况 - 最好的选择不是使用大括号扩展,而是使用bash的C风格循环 - 请参阅user000001的答案.
如果使用大括号展开的是仍然期望:
如果您不需要列表中的数字具有前缀或后缀,请使用seq带有不带引号的命令替换的实用程序(小警告:seq不是POSIX实用程序,但它可以广泛使用); 例如
echo $(seq 3)- > 1 2 3; 起始数字1 隐含
echo $(seq -f '%02.f' 3)- > 01 02 03- 零填充echo $(seq 2 4)- > 2 3 4; 显式的开始和结束数字echo $(seq 1 2 5)- > 1 3 5; 自定义增量(该2在中间)如果您需要列表中的数字有前缀或后缀,您有几个选择:
seq其工具-f选项提供printf样式格式字符串(如上面用于补零),或基于纯巴什解决方法eval(特别小心需要!),或者建立一个阵列在一个循环中,所有这些都是在详细此回答.awk或等实用程序的自定义脚本perl.eval变量驱动序列括号表达式的安全使用示例:事先验证变量,以确保它们包含十进制整数.
from=1 to=3 # sample values
# Ensure that $from and $to are decimal numbers and abort, if they are not.
(( 10#$from + 10#$to || 1 )) 2>/dev/null || { echo "Need decimal integers" >&2; exit 1; }
eval echo "A{$from..$to}" # -> 'A1 A2 A3'
Run Code Online (Sandbox Code Playgroud)
大括号扩展的主要目的是扩展到一个令牌列表,每个令牌都有一个可选的前缀和/或后缀 ; 大括号扩展必须是不加引号的,有两种风格:
echo A{b,c,d}- > Ab Ac Ad,即3个令牌,如args的数量所暗示的那样.echo {/,$HOME/}Library 例如, - > /Library /User/jdoe/Library一个序列表达式(范围)..,通常是数字 - 不支持的变量
{a..c}{1..10},{10..1},{-1..2}
A{1..3}#- >A1# A2# A3#{$from..$to} # !! FAILS- $from并且$to被解释为文字,因此不被识别为单个字母或十进制整数 - 不执行大括号扩展(见下文).
zsh和ksh.echo A{1..5..2}- > A1 A3 A5- 数字加2echo A{001..003} - > A001 A002 A003一个无效支架表达是不膨胀(像普通的未引用的字符串处理,用{和}作为处理文字):
echo {}- > '{}'- 作为括号expr无效:至少需要2个 ,分隔的标记
{}使用find,例如.echo {1..$to}- > '{1..<value-of-$to>}'- 作为大括号expr无效.in bash:不支持的变量; 但是,在和中有效.kshzshfish相反,扩展任何 {...}序列;类似地,zsh有选项BRACE_CCL(默认为OFF)用于扩展内部的单个字符{..},这有效地导致任何非空 {...}序列的扩展.)use*_*001 14
在扩展变量之前评估大括号扩展.你需要一个c风格的循环:
for ((i=1;i<=howmany;i++))
do
echo "Welcome"
done
Run Code Online (Sandbox Code Playgroud)
创建一个序列来控制你的循环
for i in $(seq 1 $howmany); do
echo "Welcome";
done
Run Code Online (Sandbox Code Playgroud)
问题是"支撑扩展"是在"可变扩展"之前执行的
for i in $(seq 1 $howmany)
Run Code Online (Sandbox Code Playgroud)
作为@damienfrancois说,或者,如果你愿意:
for i in $(eval echo '{$start..10}')
Run Code Online (Sandbox Code Playgroud)
可能会这样做,但不要将它用于每个人的理智.
| 归档时间: |
|
| 查看次数: |
6483 次 |
| 最近记录: |