/bin/sh:提取命令行参数



我使用dash作为/bin/sh

我的脚本接受任意数量的参数,我需要这样处理它们,一个变量只包含最后一个参数,另一个变量包含除最后一个参数之外的所有参数。

我知道如何在zsh中做到这一点,但不幸的是,这与dash不兼容:

last="${@[-1]}"
rest=( ${@[1,-2]} )

如何在/bin/sh中实现这一点?

您可以简单地旋转现有的参数,直到最后一个参数是第一个,此时您可以删除它,留下剩余的n-1参数在它们的原始位置

n=$#  # Number of arguments
# Rotate the aruguments until the last element is the first
while [ "$n" -gt 1 ]; do
curr=$1
shift
set -- "$@" "$curr"
n=$((n-1))
done
lastarg=$1
shift
# Now $@ is the same as it started, minus its final element.

以上代码适用于1个或多个参数。如果没有参数,可以在处理之前检查,或者只是等待最终的shift失败。(在后一种情况下,lastarg将被设置为空字符串,如果最后一个参数确实是空字符串,也可能发生这种情况。)

Posix标准(破折号实现的)甚至没有数组。

你唯一真正的方法是使用shift内置和普通的参数访问:当$2被设置时,$1不是最后一个参数。当$2没有设置时,我们知道$1是最后一个参数。现在在循环中执行此操作并相应地处理参数

使用类似这样的循环(假设至少有一个位置参数):

rest=""
while [ $# != 1 ]; do
rest="$rest $1"
shift
done
last=$1

最新更新