在终端中运行它运行良好:
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
进行测试显示了同样的事情。
任何解释为什么会这样,以及如何使其能够处理所有文件匹配?谢谢!
答案 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
这将遍历所有位置参数。