【问题标题】:for-loop in Bash Script Exits After Processing First Line [duplicate]Bash脚本中的for循环在处理第一行后退出[重复]
【发布时间】:2016-04-29 02:09:25
【问题描述】:

在终端中运行它运行良好:

for a in *.pdf; do mv "$a" "$a".tmp; done

在 bash 脚本中运行它 (#!/bin/bash)

for a in "$1"; do mv "$a" "$a".tmp; done

...并传递参数*.pdf,即./myscript *.pdf,脚本只处理目录中的第一个文件。通过将mv 更改为echo 进行测试显示相同的结果。

任何解释为什么会这样,以及如何使它能够处理所有文件匹配?谢谢!

【问题讨论】:

  • shell 已经扩展了 *.pdf 并将 pdf 列表传递给 myscript。如果您想将字符串 *.pdf 传递给您的脚本,您将不得不引用或转义它。 ./myscript "*.pdf" 应该可以工作

标签: bash for-loop scripting


【解决方案1】:

当你跑步时

./myscript *.pdf

发生的第一件事是*.pdf 扩展到所有匹配项。所以你实际调用的是

./myscript file1.pdf file2.pdf file3.pdf

试试

for a; do
    mv "$a" "$a".tmp
done

这将遍历所有位置参数。

【讨论】:

    【解决方案2】:

    问题是$1 只是第一个参数(这里是第一个pdf)。要遍历所有参数,请使用:

    for var in "$@"; do
       do mv "$var" "$var".tmp
    done
    

    $@ 是一个 bash 内置变量,一个包含所有命令行参数的数组。所以你知道,还有$*,就是:

    所有位置参数,被视为一个单词 (src)

    【讨论】:

    • 效果很好。谢谢!
    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多