我想合并所有文件到一个。这里最后一个参数是目标文件名。 我想采取最后一个参数,然后在最后一个参数前循环停止。如何获取最后一个参数并在shell脚本中的最后一个参数之前停止?
下面的代码考虑到我想要实现:
echo "No. of Argument : $#"
for i in $* - 1
do
echo $i
cat $i >> last argument(file)
done
如何实现这一目标?
我想合并所有文件到一个。这里最后一个参数是目标文件名。 我想采取最后一个参数,然后在最后一个参数前循环停止。如何获取最后一个参数并在shell脚本中的最后一个参数之前停止?
下面的代码考虑到我想要实现:
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
元素。因此,从第一个参数到倒数第二,我们使用:符合POSIX标准的
${@:1:$# - 1}
非常感谢很多人.......... – LoveToCode 2014-11-02 20:54:44
的方法:
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
+ POSIX兼容性。 – John1024 2014-11-04 01:54:56
请注意,如果目标文件首先列出并且源文件之后会更容易。你会有:'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
是的,它是一个很好的逻辑...谢谢 – LoveToCode 2014-11-04 03:44:19