David Asked: 2020-11-11 12:45:11 +0800 CST 2020-11-11 12:45:11 +0800 CST 2020-11-11 12:45:11 +0800 CST 如何在bash脚本中使用for循环? 772 我有一个无法按我想要的方式工作的小 bash 脚本 这是代码 #! /bin/bash echo "Escriba la cantidad de letras" read x for i in $x;do echo "Letra $i" read y echo $y done #export Mensaje #./recibir.sh 逻辑错误的图像 它应该为我重复回声我进入顶部回声的次数,但它只执行一次而且我不太了解 bash 的逻辑 linux 3 Answers Voted Best Answer Trauma 2020-11-11T12:58:18+08:002020-11-11T12:58:18+08:00 forbash one 迭代一组值;类似于for ... in或类似于foreach其他语言。 举个例子看起来更好: for idx in *.sh; do echo $in; done; Bash 创建一个序列,其中包含与该模式匹配的所有文件。 [ 文件 1.sh 文件 2.sh 文件 3.sh ] for迭代生成序列的元素。 idx = file1.sh -> ... idx = file2.sh -> ... 对于for数字,你应该这样做 for i in $(seq 1 $END) Cuauhtli 2020-07-26T10:17:40+08:002020-07-26T10:17:40+08:00 补充@Trauma 的回答。 "for" 所做的不仅仅是迭代一组值,或者更确切地说,生成一组值然后迭代,同样在前提下运行,就像在 c 中一样,它以多种方式进行: for name in < secuencia separada por espacios >;do lista de comandos;done for ((expr1;expr2;expr3));do lista de comandos;done 这可以在 找到man 1 bash。 我之所以提到这一点,是因为在示例 1 中,for 循环适用于扩展,即: for archivo in carpeta/* do echo $archivo done #es equivalente a for archivo in "$(ls carpeta)" do echo $archivo done 它们是等效的,但它们适用于不同类型的扩展,第一个是路径名扩展,第二个是命令替换,但也可以在大括号扩展上完成,即: for i in {1..4} do echo $i done 1 2 3 4 或者一个稍微复杂一点的例子,你可以在其中组合它们: for archivo in ca1/sc{2,3}/*foo do echo $archivo done 它将打印所有以 foo 结尾且位于 ca1 文件夹内的 sc2 和 sc3 文件夹内的文件。 您还可以man bash在 EXPANSIONS 部分中查看扩展。需要注意的是,字符串展开的顺序具有优先顺序。 我之所以这么说是因为我认为有必要澄清它,因为存在以下问题: https://askubuntu.com/questions/1057870/bash-script-for-i-in-xy/1059139#1059139 在@Allex 提出的第二个示例中,您可以看到您还可以在数组上迭代大括号扩展。 allexiusw 2020-07-26T12:25:19+08:002020-07-26T12:25:19+08:00 如果您想要执行从 0 到 x 的典型 for,其中 x 从变量中读取并表示重复限制,您可以使用与 C 语言非常相似的 for 语法。 #!/bin/bash echo "Ingrese el número de repeticiones para el ciclo for: " read r echo "Iniciando el for: " for((i=0; i<r; i++)); do echo $i; done 另一方面,bash在for结构中支持foreach,foreach对于读取数组非常有用,我给你举个实际的例子: #!/bin/bash r=("one two" "two" "3" "5") for row in "${r[@]}"; do echo $row done “${r[@]}” 引用数组 $r 如果位置是 $r[ @ ] "@" 那么你指的是数组的所有元素,即 ("one two" "two" "3" "5"),positions(0, 1, 2, 3)= @ 在引号 "${r[@]}" 中,每个结果元素都是一个字符串,这将防止 "one two" 被解释为两个不同的字符串。 最后,一旦对结果数据进行排序,就迭代数组的元素并打印它们。
for
bash one 迭代一组值;类似于for ... in
或类似于foreach
其他语言。举个例子看起来更好:
Bash 创建一个序列,其中包含与该模式匹配的所有文件。
[ 文件 1.sh 文件 2.sh 文件 3.sh ]
for
迭代生成序列的元素。idx = file1.sh -> ...
idx = file2.sh -> ...
对于
for
数字,你应该这样做补充@Trauma 的回答。
"for" 所做的不仅仅是迭代一组值,或者更确切地说,生成一组值然后迭代,同样在前提下运行,就像在 c 中一样,它以多种方式进行:
for name in < secuencia separada por espacios >;do lista de comandos;done
for ((expr1;expr2;expr3));do lista de comandos;done
这可以在 找到
man 1 bash
。我之所以提到这一点,是因为在示例 1 中,for 循环适用于扩展,即:
它们是等效的,但它们适用于不同类型的扩展,第一个是路径名扩展,第二个是命令替换,但也可以在大括号扩展上完成,即:
或者一个稍微复杂一点的例子,你可以在其中组合它们:
它将打印所有以 foo 结尾且位于 ca1 文件夹内的 sc2 和 sc3 文件夹内的文件。
您还可以
man bash
在 EXPANSIONS 部分中查看扩展。需要注意的是,字符串展开的顺序具有优先顺序。我之所以这么说是因为我认为有必要澄清它,因为存在以下问题:
在@Allex 提出的第二个示例中,您可以看到您还可以在数组上迭代大括号扩展。
如果您想要执行从 0 到 x 的典型 for,其中 x 从变量中读取并表示重复限制,您可以使用与 C 语言非常相似的 for 语法。
另一方面,bash在for结构中支持foreach,foreach对于读取数组非常有用,我给你举个实际的例子:
“${r[@]}”