为了账号安全,请及时绑定邮箱和手机立即绑定

用变量支撑展开?

用变量支撑展开?

呼唤远方 2019-07-03 17:39:26
用变量支撑展开?#!/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,它在运行脚本时是特定的。有什么想法吗?
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

创建控制循环的序列

for i in $(seq 1 $howmany); doecho "Welcome";done


查看完整回答
反对 回复 2019-07-03
?
largeQ

TA贡献2039条经验 获得超7个赞

解决办法不能在序列大括号表达式中使用变量:

  • 如果目的仅仅是在范围内迭代数-就像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'

支撑展开概述

这个支撑扩张的主要目的是为了展开为令牌列表。每个令牌都有一个可选前缀和/或后缀支撑展开必须是未报价然后进来2种口味:

  • 固定级数(列表)以逗号分隔的字符串 - 变量支撑

    • 指定并展开为

      固定令牌数

      (2或更多);例如:
    • echo A{b,c,d} -> Ab Ac Ad

      ,即由args的数目所暗示的3个令牌。
    • echo {/,$HOME/}Library

      例如->

      /Library /User/jdoe/Library

    • 变量引用-甚至全局-

      支持,但请注意,它们会被扩展。

      支撑扩张

      结果

      ,在正常评价过程中。
  • 序列表达式(范围)与..典型数值化 - 变量不支持

    • [稀有]

      *只有

      单一英文字母

      允许的;允许的

      {a..c}

    • 数字仅十进制整数

      ;例如,

      {1..10}{10..1}{-1..2}

    • Bash 4+

      增加了两个特性:
    • 相比之下,

      使用变量是吗?zshksh.

    • 使用前缀和后缀的示例:

      A{1..3}# -> A1# A2# A3#

    • 坏的

      例举

      变量{$from..$to} # !! FAILS - $from

      $to

      被解释为

      文字

      因此不能被识别为一个字母或一个十进制整数-

      支撑展开是执行(见下文)。
    • echo A{001..003} -> A001 A002 A003

    • echo A{1..5..2} -> A1 A3 A5

      -增加2的数字
    • 任选

      增量步长值:

    • 有能力

      零垫:

    • 扩展为

      变量令牌数

      ,由

      文字起点和终点

      (为

      历史原因不支持使用变量

      -见

      用户000001的答案):

  • 无效支撑表达扩大(处理为常规的未引号字符串,与{}作为文字):

    • 这允许使用未引用的{}带着find例如。

    • echo {} -> '{}'

      -作为支柱费用无效:至少

      2 ,

      -需要分离的令牌
    • echo {1..$to} -> '{1..<value-of-$to>}'

      -作为支撑费无效。在……里面

      bash

      *变量不支持;但是,

      有效

      在……里面

      ksh

      zsh.

    • (fish

      相反,扩展

      任何 {...}

      序列;类似地,

      zsh

      有选择权

      BRACE_CCL

      (默认情况下关闭)用于展开

      个人

      字里行间

      {..}

      ,这实际上导致了

      任何非空的 {...}

      顺序)


查看完整回答
反对 回复 2019-07-03
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

在展开变量之前对支撑展开进行评估。您需要一个c样式的循环,而不是:

for ((i=1;i<=howmany;i++))do
   echo "Welcome"done


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 645 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信