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