我想以编程方式创建此输出:
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
变量。
答案 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 变量。
$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'