पहले, ध्यान दें कि $@
बिना उद्धरण के कोई मतलब नहीं है और इसका उपयोग नहीं किया जाना चाहिए। $@
केवल उद्धृत ( "$@"
) और सूची संदर्भों में उपयोग किया जाना चाहिए ।
for i in "$@"
सूची के संदर्भ के रूप में अर्हता प्राप्त करता है, लेकिन यहां, स्थितिगत मापदंडों पर लूप करने के लिए, विहित, सबसे पोर्टेबल और सरल रूप है:
for i
do something with "$i"
done
अब, दूसरे से शुरू होने वाले तत्वों पर लूप करने के लिए, विहित और सबसे पोर्टेबल तरीका उपयोग करना है shift
:
first_arg=$1
shift # short for shift 1
for i
do something with "$i"
done
बाद में shift
, जो उपयोग किया जाना था $1
उसे सूची से हटा दिया गया है (लेकिन हमने इसे सहेज लिया है $first_arg
) और जो अभी उपयोग में है $2
वह अब अंदर है $1
। स्थिति मापदंडों को बाईं ओर स्थानांतरित कर दिया गया है 1
( shift 2
2 द्वारा स्थानांतरित करने के लिए उपयोग ...)। तो मूल रूप से, हमारा लूप लूपिंग है जो कि अंतिम तर्क के लिए दूसरा था।
साथ bash
(और zsh
और ksh93
, लेकिन वह यह है), एक वैकल्पिक करने के लिए है:
for i in "${@:2}"
do something with "$i"
done
लेकिन ध्यान दें कि यह मानक sh
वाक्यविन्यास नहीं है इसलिए इसका उपयोग उस स्क्रिप्ट में नहीं किया जाना चाहिए जो इसके साथ शुरू होती है #! /bin/sh -
।
में zsh
या yash
, आप भी कर सकते हैं:
for i in "${@[3,-3]}"
do something with "$i"
done
तीसरी से तीसरी अंतिम तर्क के लिए पाश।
में zsh
, सरणी के $@
रूप में भी जाना जाता है $argv
। तो एरे की शुरुआत या अंत से तत्वों को पॉप करने के लिए, आप यह भी कर सकते हैं:
argv[1,3]=() # remove the first 3 elements
argv[-3,-1]=()
( shift
यह भी लिखा जा सकता है 1=()
में zsh
)
में bash
, आप केवल बिलिन वाले $@
तत्वों को असाइन कर सकते हैं set
, इसलिए अंत में 3 तत्वों को पॉप करने के लिए, यह कुछ इस तरह होगा:
set -- "${@:1:$#-3}"
और तीसरी से तीसरी बार लूप करने के लिए:
for i in "${@:3:$#-5}"
do something with "$i"
done
POSIXly, के अंतिम 3 तत्वों को पॉप करने के लिए "$@"
, आपको एक लूप का उपयोग करना होगा:
n=$(($# - 3))
for arg do
[ "$n" -gt 0 ] && set -- "$@" "$arg"
shift
n=$((n - 1))
done
for ((i=2; i<=$#; i++)); do something with "${!i}"; done