在 bash 中,我知道可以编写一个for
循环,其中某些循环控制变量i
迭代指定的整数。例如,我可以编写一个 bash shell 脚本来打印 1 到 10 之间的整数:
#!/bin/bash
for i in {1..10}
do
echo $i
done
如果我提供字符串列表,是否可以迭代作为字符串的循环控制变量?例如,假设我有一个fname
表示文件名的字符串。我想为每个文件名调用一组命令。例如,我可能想fname
使用如下命令打印内容:
#!/bin/bash
for fname in {"a.txt", "b.txt", "c.txt"}
do
echo $fname
done
换句话说,在第一次迭代中,fname
应该具有值fname="a.txt"
,而在第二次迭代中,fname
应该具有值fname="b.txt"
,依此类推。不幸的是,上面的语法似乎不太正确。我想获得输出:
a.txt
b.txt
c.txt
但是当我尝试上面的代码时,我得到了这个输出:
{a.txt,
b.txt,
c.txt}
您能否帮助我确定正确的语法,以便我可以迭代地更改变量的值/内容fname
?感谢您的时间。
答案1
正确的语法如下:
#!/bin/bash
for fname in a.txt b.txt c.txt
do
echo $fname
done
答案2
在我看来你应该这样做...
printf %s.txt\\n a b c
答案3
正如用户 13742 在评论bash
,我们可以在和中使用数组ksh
:
#!/usr/bin/env bash
files_list=( "a.txt" "b.txt" "c and space.txt" )
for i in "${files_list[@]}"
do
echo "$i"
# do something else here,maybe
done
并按如下方式工作:
$ ./iterate_files_array.sh
a.txt
b.txt
c and space.txt
但是,某些 shell(例如dash
(/bin/sh
在 Ubuntu 上))不支持数组。在这种情况下,我们可以求助于使用此处文档结构:<<
#!/bin/sh
while IFS= read -r line
do
echo "$line"
done << EOL
one.txt
two.txt
with space.txt
EOL