从 $@ 中删除参数(如果它是一个选项)

从 $@ 中删除参数(如果它是一个选项)

我有一个脚本,我需要循环遍历传递的参数,如果参数以 开头,-我需要将其放入字符串中opts并将其从$@.这就是我到目前为止所拥有的

opts=""
for arg in "$@"
do
    if [[ "$arg" == -* ]]; then
        opts="${opts} ${arg}"
        # remove arg from $@ ??
    fi
done

echo $@
echo $args

如何arg从传递的参数数组中删除$@

答案1

如果以 开头的选项-从不带参数,那么只需使用opts 大批

for a; do
   shift
   case $a in
   -*) opts+=("$a");;
   *) set -- "$@" "$a";;
   esac
done

(如果您想成为字符串,请更改opts+=("$a")为,这将使代码片段适用于任何标准 shell)。opts="$opts$a "opts

答案2

在 bash、ksh、zsh 中,一次扩展将清除所有以 开头的参数-

echo "${@##-*}"

请注意,这并不消除参数,只需将它们设为空即可。

然而,获取不以开头的参数列表-同时能够处理空格和换行符变得相当困难。

最好使用简单的循环:

unset args opts;
for a; do
    if [[ $a == [-]* ]]; then
        opts+=("$a");
    else 
        args+=("$a");
    fi;
done;

printf '<%s> ' "${args[@]}"; echo;
printf '<%s> ' "${opts[@]}"; echo;

相关内容