在 bash shell 脚本中,编写一个迭代字符串值的 for 循环

在 bash shell 脚本中,编写一个迭代字符串值的 for 循环

在 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

相关内容