在命令中的word中使用环境变量

时间:2017-03-14 02:33:20

标签: bash shell unix environment-variables

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

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变量。

3 个答案:

答案 0 :(得分:4)

变量名称是贪婪的,这意味着他们将使用尽可能多的文本来形成变量名称。因此,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 ...

答案 1 :(得分:3)

  • 代码中没有 environment 变量,只有 shell 变量。

    • Shell变量是环境变量(导出的变量,例如$PATH,对所有子进程都可见,无论它们是否为shell) ,但情况并非如此。
  • Shell变量名称必须消除歧义来自相邻字符,这些字符可能是语法上合法的变量名称的一部分,方法是将它们括在{...} - ${i}中,情况下。

  • 除非您特别希望shell变量引用(可能嵌入在未引用的标记中)受shell expansions影响,特别是单词分裂和通配,双引用它们 - {{ 1}}在你的情况下。

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

把它们放在一起:

"s${i}a"

答案 2 :(得分:1)

bash大括号扩展可以处理没有循环或变量的

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