如何获取最后一个参数并在shell脚本中的最后一个参数之前停止?

时间:2014-11-02 20:07:42

标签: shell unix sh csh subshell

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

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

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

如何实现?

2 个答案:

答案 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