2014-11-02 30 views
0

我想合并所有文件到一个。这里最后一个参数是目标文件名。 我想采取最后一个参数,然后在最后一个参数前循环停止。如何获取最后一个参数并在shell脚本中的最后一个参数之前停止?

下面的代码考虑到我想要实现:

echo "No. of Argument : $#" 
for i in $* - 1 
do 
    echo $i 
    cat $i >> last argument(file) 
done 

如何实现这一目标?

+1

请注意,如果目标文件首先列出并且源文件之后会更容易。你会有:'target =“$ 1”;转移;猫“$ @”>“$ target”'它不会依赖Bash。 GNU命令['mv'](http://linux.die.net/man/1/mv)和['cp'](http://linux.die.net/man/1/cp)已经修改为支持“-t destination”选项来指定目标目录,这与我所建议的类似。 – 2014-11-03 01:38:31

+2

是的,它是一个很好的逻辑...谢谢 – LoveToCode 2014-11-04 03:44:19

回答

3

使用bash

fname=${!#} 
for a in "${@:1:$# - 1}" 
do 
    echo "$a" 
    cat "$a" >>"$fname" 
done 

bash,最后一个参数的脚本是${!#}。所以,这就是我们获取文件名的地方。

bash还允许从数组中选择元素。要开始一个简单的例子,观察:

$ set -- a b c d e f 
$ echo "${@}" 
a b c d e f 
$ echo "${@:2:4}" 
b c d e 

在我们的例子中,我们要选择从第一到第二要素持续。第一个是号码1。最后是号码$#。我们要选择除最后一个以外的所有内容。因此我们想要数组的$# - 1元素。因此,从第一个参数到倒数第二,我们使用:符合POSIX标准的

${@:1:$# - 1} 
+2

非常感谢很多人.......... – LoveToCode 2014-11-02 20:54:44

2

的方法:

eval last_arg=\$$# 
while [ $# -ne 1 ]; do 
    echo "$1" 
    cat "$1" >> "$last_arg" 
    shift 
done 

这里,eval是安全的,因为你只扩展一个只读参数eval将执行的字符串中。如果您不想通过shift取消位置参数的设置,则可以使用计数器尽早跳出循环来遍历它们。

eval last_arg=\$$# 
i=1 
for arg in "[email protected]"; do 
    echo "$arg" 
    cat "$arg" >> "$last_arg" 
    i=$((i+1)) 
    if [ "$i" = "$#" ]; then 
     break 
    fi 
done 
+0

+ POSIX兼容性。 – John1024 2014-11-04 01:54:56

相关问题