猿问

用变量支撑展开?

用变量支撑展开?

#!/bin/shfor i in {1..5}do
   echo "Welcome"done

会工作,显示欢迎5次。

#!/bin/shhowmany=`grep -c $1 /root/file`for i in {1..$howmany}do
   echo "Welcome"done

不管用!howmany的输出值等于5。grep -c会显示出来。$1是参数1,它在运行脚本时是特定的。

有什么想法吗?


呼唤远方
浏览 646回答 3
3回答

摇曳的蔷薇

创建控制循环的序列for i in $(seq 1 $howmany); doecho "Welcome";done

largeQ

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

牧羊人nacy

在展开变量之前对支撑展开进行评估。您需要一个c样式的循环,而不是:for&nbsp;((i=1;i<=howmany;i++))do &nbsp;&nbsp;&nbsp;echo&nbsp;"Welcome"done
随时随地看视频慕课网APP

相关分类

Python
我要回答