2009-11-04 58 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

相关问题