3 回答
TA贡献2039条经验 获得超8个赞
解决办法不能在序列大括号表达式中使用变量:
如果目的仅仅是 在范围内迭代数-就像OP的案子- 最佳选择是 不 使用支撑展开 ,而是使用bash的 C型回路-见 用户000001的答案 .如果特定的数字并不重要,并且只需要执行一个指定次数的循环体, 是个选择。 如果使用支撑展开 是尽管如此: 使用 seq效用与ITS -f提供一个 printf-样式格式字符串(如上面用于零填充),或基于 eval(需要额外的照顾!)或者建造一个 列阵
在循环中,所有这些都在 这个答案 .您还可以考虑一般地实现该功能,例如编写自定义shell函数或使用实用程序(如 awk或 perl.echo $(seq 3)->1 2 3;起始号码 1默示echo $(seq 2 4)->2 3 4;显式起始数和结束号 echo $(seq 1 2 5)->1 3 5;自定义增量( 2在 中间)
echo $(seq -f '%02.f' 3)->01 02 03-零垫 如果你 不需要列表中的数字具有 前缀或后缀 ,使用 seq的实用程序。 未报价命令替换( 小警告:seq不是POSIX实用程序,但它广泛可用)。 如果你 确实需要列表中的数字才有 前缀或后缀 ,你有几种选择:
安全使用的例子 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'支撑展开概述
a
固定级数 (列表)以逗号分隔的字符串 -变量 支撑 指定并展开为 固定 令牌数 (2或更多);例如: echo A{b,c,d}->Ab Ac Ad,即由args的数目所暗示的3个令牌。 echo {/,$HOME/}Library例如-> /Library /User/jdoe/Library变量引用-甚至全局- 是
支持,但请注意,它们会被扩展。 后
支撑扩张 结果
,在正常评价过程中。 a
序列 表达式(范围)与 ..,典型 数值化 -变量 不支持 [稀有] 弦
*只有 单一英文字母
允许的;允许的 {a..c}数字: 仅十进制整数
;例如, {1..10},{10..1},{-1..2}Bash 4+
增加了两个特性: 相比之下, 使用变量 是吗? 在 zsh和 ksh.使用前缀和后缀的示例: A{1..3}#->A1# A2# A3#坏的
例举 变量:
{$from..$to} # !! FAILS-$from和 $to被解释为 文字
因此不能被识别为一个字母或一个十进制整数- 不
支撑展开是执行(见下文)。 echo A{001..003}->A001 A002 A003echo A{1..5..2}->A1 A3 A5-增加2的数字 任选 增量步长值:
有能力 零垫:
扩展为 变量 令牌数 ,由 文字 起点和终点 (为 历史原因, 不支持使用变量
-见 阿 无效 支撑表达 是 不 扩大 (处理为常规的未引号字符串,与 {和 }作为 文字):这允许使用未引用的 {}带着 find例如。 echo {}->'{}'-作为支柱费用无效:至少 2
,-需要分离的令牌 echo {1..$to}->'{1..<value-of-$to>}'-作为支撑费无效。在……里面 bash*变量不支持;但是, 有效
在……里面 ksh和 zsh.(
fish相反,扩展 任何
{...}序列;类似地, zsh有选择权 BRACE_CCL(默认情况下关闭)用于展开 个人
字里行间 {..},这实际上导致了 任何非空的
{...}顺序)
TA贡献1862条经验 获得超7个赞
for ((i=1;i<=howmany;i++))do echo "Welcome"done
添加回答
举报
