पहले, ध्यान दें कि $@बिना उद्धरण के कोई मतलब नहीं है और इसका उपयोग नहीं किया जाना चाहिए। $@केवल उद्धृत ( "$@") और सूची संदर्भों में उपयोग किया जाना चाहिए ।
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 22 द्वारा स्थानांतरित करने के लिए उपयोग ...)। तो मूल रूप से, हमारा लूप लूपिंग है जो कि अंतिम तर्क के लिए दूसरा था।
साथ 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