处理第一行后,Bash脚本中的for循环退出

时间:2016-01-22 12:59:34

标签: bash for-loop scripting

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

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进行测试显示了同样的事情。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

  

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

答案 1 :(得分:1)

运行时

./myscript *.pdf

首先发生的事情是*.pdf扩展到所有匹配。所以你实际上称之为

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

尝试

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

这将遍历所有位置参数。