2009-11-04 63 views
5

我想知道如何使用文件內容作爲命令行參數,但是我正在努力學習語法。在BASH中使用文件內容作爲命令行參數

說我有以下幾點:

# cat > arglist 
src/file1 dst/file1 
src/file2 dst/file2 
src/file3 dst/file3 

如何使用每行的內容在arglist文件作爲參數的說,一個cp命令?

回答

7

xargs的'-n'選項指定了多少個參數每個命令的使用方法:

$ xargs -n2 < arglist echo cp 

cp src/file1 dst/file1 
cp src/file2 dst/file2 
cp src/file3 dst/file3 
+0

'<'如何工作? – Michelle 2013-07-03 09:23:05

1

您可以使用管道(|):

cat file | echo 

或輸入重定向(<)

cat < file 

xargs

xargs sh -c 'emacs "[email protected]" < /dev/tty' emacs 

然後你可以使用awk來獲取參數:

cat file | awk '{ print $1; }' 

希望這有助於..

+0

沒有必要貓的awk片 – ghostdog74 2009-11-04 14:27:19

+0

所有這些都做_something_,但他們都脫靶。 – Jamie 2009-11-04 15:37:50

+0

'echo'不會從'stdin'中讀取。除了'cat'不需要'echo'。此外,您不必重定向到「貓」 - 這是可行的:'貓文件'。 – 2009-11-04 15:40:22

3

使用read(這並不認爲在arglist文件名空格被轉義):

while read src dst; do cp "$src" "$dst"; done < argslist 

如果文件中的參數是按正確的順序和空格的文件名被引用,那麼這也將起作用:

while read args; do cp $args; done < argslist 
+0

+1比我的解決方案好得多:-D – NawaMan 2009-11-04 14:32:16

+0

如果沒有最後一個換行符,讀取循環將「錯過」讀取最後一行。 – ghostdog74 2009-11-04 23:02:52

0

,如果你的目的只是爲了CP中的thelist這些文件

$ awk '{cmd="cp "$0;system(cmd)}' file 
+0

錘子?釘子?當你使用shell進行操作時, – 2009-11-04 15:48:13

+0

沒有什麼不同。 shell也在調用系統命令。 – ghostdog74 2009-11-04 23:02:12

0

使用for環路與IFS(內部字段分隔符)設置爲new line

OldIFS=$IFS # Save IFS 
$IFS=$'\n' # Set IFS to new line 
for EachLine in `cat arglist"`; do 
Command="cp $Each" 
`$Command`; 
done 
IFS=$OldIFS 
+0

沒有必要將命令及其參數放入變量中。無論如何,你必須執行'$ Command'或'\'$ Command \''來使它工作。 – 2009-11-04 15:46:48

+0

謝謝,我想念:D – NawaMan 2009-11-04 16:09:54

相關問題