$ @ से एक स्थितिगत पैरामीटर कैसे निकालें


13

मूल रूप से, मैं -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

क्या ऐसा करने का कोई अच्छा तरीका है?

BTW, भले ही मैं मुख्य रूप से लागू उत्तरों में दिलचस्पी रखता /bin/shहूं, मैं भी केवल लागू होने वाले उत्तरों में दिलचस्पी रखता हूं /bin/bash


@ cuonglm: मैं छद्म कोड के मूल रूप में वापस आ गया हूं; मेरे अनुभव में, जब भी मैं तस्वीर को बहुत सरल करता हूं, मुझे ऐसे उत्तर मिलते हैं जो ओवरसिम्प्लीफाइड केस के लिए काम करते हैं, लेकिन वास्तविक के लिए नहीं।
कोजो

जवाबों:


20

POSIXly:

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

printf '%s\n' "$@"

उपर्युक्त कोड भी पूर्व-पॉसिक्स शेल में काम करता है, मूल अल्मक्विस्ट शेल (रीड एंडनोट ) को छोड़कर । forलूप को इसमें बदलें :

for arg
do
  ...
done

सभी गोले में काम करने की गारंटी।


एक और पोसिक्स एक:

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

इस एक के साथ, आप पहले हटाने की जरूरत (में (pattern)यह पूर्व POSIX गोले में काम करने के लिए।


धन्यवाद। यह तर्क साइकिल तकनीक बहुत अच्छा है। इसमें जोड़ा बोनस है कि यह वर्तमान एक के बाद पैरामीटर का निरीक्षण करना बहुत आसान बनाता है (क्योंकि यह अभी वहीं बैठा है $1)। यह संपत्ति मेरे काम में आई है। इसके अलावा, मुझे याद दिलाने के लिए धन्यवाद कि लूप in "$@"; के शीर्ष पर बिट forअनावश्यक है। यह कुछ ऐसा है जो मैंने पहले देखा है, लेकिन मैं इसे भूल जाता हूं। , Almquist खोल पर अपनी टिप्पणी के बारे में है do है अगली पंक्ति पर प्रकट करने के लिए, या होगा for arg; doभी काम?
15

1
for arg; doकाम अल्मक्विस्ट खोल में
congongl

3
बिन बुलाए के for arg doलिए एक छोटा मुहावरा है for arg in "$@"; do। यह मुझे लगभग 5 सेकंड के लिए फेंक दिया! कुछ लोग कह सकते हैं कि उत्तरार्द्ध अधिक पठनीय है :)
starfry

0

मैंने इस सवाल को इसी तरह की समस्या को हल करने की कोशिश करते हुए पाया, हालांकि मैं -किसी भी अलग --विभाजक तक सभी गैर-विकल्प तर्कों (जिनके साथ शुरुआत नहीं कर रहा हूं) को संसाधित करना चाहता था । मैं केवल संसाधित तर्कों को समाप्त करना चाहता था और आपूर्ति किए गए आदेश में शेष लोगों को सीटू में छोड़ देना चाहता था।

यहां वह है जो मैंने जुटाया।

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.