По сути, я хочу «вырвать» первое вхождение -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
.
Ответы:
POSIXly:
Приведенный выше код работает даже в оболочках до POSIX, за исключением оригинальной оболочки Almquist (Read Endnote ). Измените
for
цикл на:гарантия на работу во всех снарядах.
Еще один POSIX:
С этим, вы должны удалить первый
(
в ,(pattern)
чтобы заставить его работать в предварительно POSIX оболочек.источник
$1
). Это свойство пригодилось в том, что я делаю. Также спасибо за напоминание, чтоin "$@";
бит в верхней частиfor
цикла не нужен. Это то, что я видел раньше, но я склонен забывать это. Что касается вашего замечания по оболочке Almquist,do
должен ли он отображаться на следующей строке илиfor arg; do
тоже будет работать?for arg; do
работа в оболочке Almquistfor arg do
это сокращенная идиомаfor arg in "$@"; do
. Это бросило меня на 5 секунд! Кто-то скажет, что последнее более читабельно :)Я нашел этот вопрос, пытаясь решить аналогичную проблему, однако я хотел обработать все неопционные аргументы (те, которые не начинаются с
-
) до любого полученного--
разделителя. Я хотел вынуть только обработанные аргументы и оставить оставшиеся на месте в указанном порядке.Вот что я придумал.
источник