0

我想将所有文件合并为一个。这里,最后一个参数是目标文件名。我想取最后一个参数,然后在最后一个参数之前停止循环。

这里给出了我想要实现的代码:

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

如何做到这一点?

4

2 回答 2

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数组的元素。因此,要选择从第一个到倒数第二个的参数,我们使用:

${@:1:$# - 1}
于 2014-11-02T20:42:38.920 回答
3

符合 POSIX 的方法:

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 "$@"; do
    echo "$arg"
    cat "$arg" >> "$last_arg"
    i=$((i+1))
    if [ "$i" = "$#" ]; then
        break
    fi
 done
于 2014-11-03T13:41:59.253 回答