我想将所有文件合并为一个。这里,最后一个参数是目标文件名。我想取最后一个参数,然后在最后一个参数之前停止循环。
这里给出了我想要实现的代码:
echo "No. of Argument : $#"
for i in $* - 1
do
echo $i
cat $i >> last argument(file)
done
如何做到这一点?
使用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}
符合 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