【问题标题】:Use environment variable in word within command [duplicate]在命令中的 word 中使用环境变量 [重复]
【发布时间】:2017-08-04 05:55:13
【问题描述】:

我想以编程方式创建此输出:

s1a
s2a
s3a
s4a
s5a

我可以转到任意数量的行,而不仅仅是 5。我的方法是使用 for 循环,引用环境变量迭代器:

$ for i in $(seq 1 5); do echo s$ia ; done
s
s
s
s
s

如何区分环境变量$i 和字符a?我想避免引用一些 $ia 变量。

【问题讨论】:

    标签: bash shell unix environment-variables


    【解决方案1】:

    变量名是贪婪的,这意味着它们会尽可能多地使用文本来形成变量名。因此s$ia 是文字s 后跟变量$ia

    您需要使用大括号使其不贪婪:

    echo s${i}a
    

    这意味着文字s、变量$i和文字a

    pax> for i in $(seq 1 5) ; do echo s${i}a ; done
    s1a
    s2a
    s3a
    s4a
    s5a
    

    请记住,现代bash 版本可以生成这些序列 无需借助外部seq

    for i in {1..5} ; do ...
    

    【讨论】:

    • 值得指出i可能不是环境变量;它只是一个 shell 变量。
    • @Jonathan,说得好。我倾向于经常(错误地)将它们混为一谈,因为即使 shell 变量也存在于 shell 的“环境”(通用英语而不是 bash-literal 定义)中。由于这里的行为与它是 shell 还是环境变量无关,所以我已经消除了这种区别。以后,我会更加小心。
    【解决方案2】:
    • 你的代码中没有环境变量,只有shell变量。

      • Shell 变量也可以是环境变量(导出变量,例如 $PATH 对所有子进程可见,无论它们是否是 Shell),但是这里不是这样。
    • Shell 变量名称必须消除歧义,在您的情况下,这些字符可能是语法上合法的变量名称的一部分,方法是将它们括在{...} - ${i} 中。 p>

    • 除非您特别希望 shell 变量引用(可能嵌入在未引用的标记中)受到 shell expansions,特别是分词和通配,双引号它们 - "s${i}a" 在你的情况。

    • 使用arithmetic, C-style loop 创建具有可变迭代次数的内存高效循环。

    把它们放在一起:

    $ n=5; for (( i = 1; i <= n; ++i )); do echo "s${i}a"; done
    s1a
    s2a
    s3a
    s4a
    s5a
    

    【讨论】:

      【解决方案3】:

      bash 大括号扩展可以在没有循环或变量的情况下处理它

      $ echo s{1..5}a | tr ' ' '\n'
      

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 1970-01-01
        • 2015-11-04
        • 2014-04-10
        • 1970-01-01
        • 2021-03-12
        • 2020-10-05
        • 1970-01-01
        • 2019-08-03
        相关资源
        最近更新 更多