Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在shell脚本中获取最后一个参数并在最后一个参数之前停止?_Shell_Unix_Sh_Csh_Subshell - Fatal编程技术网

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

如何在shell脚本中获取最后一个参数并在最后一个参数之前停止?,shell,unix,sh,csh,subshell,Shell,Unix,Sh,Csh,Subshell,我想把所有文件合并成一个文件。这里,最后一个参数是目标文件名。 我想取最后一个参数,然后在最后一个参数之前循环停止 这里给出了我想要实现的代码: echo "No. of Argument : $#" for i in $* - 1 do echo $i cat $i >> last argument(file) done 如何实现这一点?使用bash: 在bash中,脚本的最后一个参数是${!}。这就是我们得到文件名的地方 bash还允许从数组中选择元素。要从一个简单

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

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

echo "No. of Argument : $#"
for i in $* - 1
do
   echo $i
   cat $i >> last argument(file)
done
如何实现这一点?

使用bash:

在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}
使用bash:

在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

符合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

请注意,如果先列出目标文件,然后再列出源文件,则会容易得多。你有:目标=1美元;转移cat$@>$target,它将不依赖于Bash。GNU命令和已修改为支持选项-t destination来指定目标目录,这与我的建议类似。。。感谢您,如果先列出目标文件,然后再列出源文件,会容易得多。你有:目标=1美元;转移cat$@>$target,它将不依赖于Bash。GNU命令和已修改为支持选项-t destination来指定目标目录,这与我的建议类似。。。谢谢