我有一个脚本,我需要循环遍历传递的参数,如果参数以 开头,-
我需要将其放入字符串中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;