$ @ Bir konumsal parametre nasıl kaldırılır


13

Temel olarak, -infparametre listesinden ilk kez "koparmak" istiyorum . (Kalan parametreler farklı bir komuta iletilecektir.)

Sahip olduğum komut dosyası aşağıdaki yapıya sahiptir:

#!/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

Bunu yapmanın iyi bir yolu var mı?

BTW, esas olarak uygulanabilir cevaplarla ilgilenmeme rağmen /bin/sh, sadece geçerli cevaplarla da ilgileniyorum /bin/bash.


@cuonglm: Sahte kodun orijinal biçimine döndüm; Deneyimlerime göre, resmi çok fazla basitleştirdiğimde, aşırı basitleştirilmiş dava için işe yarayan cevaplar alıyorum, ancak gerçek olan için değil.
kjo

Yanıtlar:


20

POSIXly:

for arg do
  shift
  [ "$arg" = "-inf" ] && continue
  set -- "$@" "$arg"
done

printf '%s\n' "$@"

Yukarıdaki kod, orijinal Almquist kabuğu (Read Endnote ) dışında POSIX öncesi kabuklarda bile çalışır . forDöngüyü şu şekilde değiştirin :

for arg
do
  ...
done

tüm kabuklarda çalışmayı garanti eder.


Başka bir POSIX:

for arg do
  shift
  case $arg in
    (-inf) : ;;
       (*) set -- "$@" "$arg" ;;
  esac
done

Bu bir ile, ilk çıkarmanız gerekir (içinde (pattern)öncesi POSIX kabuklarda çalışması için.


Teşekkürler. Bu argüman döngüsü tekniği çok güzel. Şu anki parametreyi takip ederek parametreyi incelemeyi çok kolay hale getirdiği ek bir bonusu var (sadece orada oturduğu için $1). Bu özellik ne yaptığım kullanışlı geldi. Ayrıca, döngünün in "$@"; üst kısmındaki bitin forgereksiz olduğunu hatırlattığınız için teşekkürler . Daha önce gördüğüm bir şey, ama unutmaya meyilliyim. , Almquist kabuğu üzerinde sözler İlişkin mu do var sonraki satırda görünmesini, ya da olur for arg; doda işe?
kjo

1
for arg; doAlmquist kabuğunda çalışmak
cuonglm

3
Çünkü birleştirilmemiş için for arg dokestirme bir deyimdir for arg in "$@"; do. Bu beni yaklaşık 5 saniye attı! Bazıları ikincisinin daha okunabilir olduğunu söyleyebilir :)
starfry

0

Benzer bir sorunu çözmeye çalışırken bu soruyu buldum, ancak tüm seçenek olmayan argümanları (başlamıyor -) alınan herhangi bir --ayırıcıya kadar işlemek istedim . Sadece işlenmiş argümanları koparmak ve geri kalanları yerinde verilen sırayla bırakmak istedim.

İşte ortaya çıkardığım şey.

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.