2016-01-22 48 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 

這將遍歷所有的位置參數。