-inf
基本上,我想从参数列表中“取出”第一次出现的。 (其余参数将传递给不同的命令。)
我的脚本具有以下结构:
#!/bin/sh
<CODE>
for POSITIONAL_PARAM in "$@"
do
<CODE>
if [ "$POSITIONAL_PARAM" = '-inf' ]
then
<PLUCK $POSITIONAL_PARAM FROM $@>
break
fi
<CODE>
done
<CODE>
some-other-command "$@"
# end of script
有没有好的方法可以做到这一点?
顺便说一句,尽管我主要对适用于 的答案感兴趣/bin/sh
,但我也对仅适用于 的答案感兴趣/bin/bash
。
答案1
POSIXly:
for arg do
shift
[ "$arg" = "-inf" ] && continue
set -- "$@" "$arg"
done
printf '%s\n' "$@"
上面的代码甚至可以在 POSIX 之前的 shell 中运行,除了原始的 Almquist shell(阅读尾注)。将循环更改for
为:
for arg
do
...
done
保证在所有 shell 中工作。
另一个 POSIX:
for arg do
shift
case $arg in
(-inf) : ;;
(*) set -- "$@" "$arg" ;;
esac
done
对于这个,您需要删除第一个(
以(pattern)
使其在 POSIX 之前的 shell 中工作。
答案2
我在尝试解决类似问题时发现了这个问题,但是我想处理所有非选项参数(那些不以 开头的参数-
)直到任何收到的--
分隔符。我只想取出已处理的参数,并将剩余的参数按提供的顺序留在原处。
这是我想出的。
parse=true
for arg do
[ "$arg" == '--' ] && parse=false
shift
if $parse && [ "${arg:0:1}" != '-' ]
then
echo handling $arg
else
set -- "$@" "$arg"
fi
done