2016-01-22 66 views
2

后在终端运行此运行良好:for循环bash脚本退出处理一线

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,该脚本仅处理目录中的第一个文件。通过更改mvecho进行的测试显示了同样的结果。

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

+0

shell将已经扩大'* .pdf'和通在myscript的pdf列表中。如果你想把字符串'* .pdf'传递给你的脚本,你将不得不引用或转义它。 './myscript“* .pdf”'应该可以工作 –

回答

2

问题是$1只是第一个参数(这里是第一个pdf)。通过所有的参数循环,可使用:

for var in "[email protected]"; do 
    do mv "$var" "$var".tmp 
done 

[email protected]是内置变量一个bash,包含所有的命令行参数的阵列。所以,你知道,还有$*,那就是:

所有的位置参数,被视为一个字(src

+0

很好。谢谢! – Majal

1

当您运行情况

./myscript *.pdf 

第一件事,就是*.pdf被扩大到所有的比赛。所以你实际调用是

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

尝试

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

这将遍历所有的位置参数。