Bir aralık belirtmek için bashParametre Genişletme'yi kullanabilirsiniz , bu konumsal parametrelerle de çalışır. Çünkü $3… $nolurdu:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Her ikisinin de farkında olun $@ve $*ilk argümanı görmezden gelin $0. Eğer durumunda kullanılacak hangisini merak edin: bu kadar çok bir alıntı istediğiniz muhtemel $@. Kullanmayın $*açıkça sürece yok argümanlar tek tek alıntı istiyorum.
Aşağıdaki gibi deneyebilirsiniz:
$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6
İlk örnekte $0, 0bir komut dosyasında kullanıldığında $0, ikinci örnekte gösterildiği gibi komut dosyasının adıyla doldurulurken ilk argümanla doldurulduğunu unutmayın. İçin komut dosyasının adını bashkursu ait olduğunu normalde gibi algılanan değil sadece, ilk argüman - Bir senaryo yürütülebilir yaptı ve “doğrudan” olarak adlandırılan aynı gider. Yani ilk örnekte $0= 0, $1= 1vb. Var, ikincisinde ise $0= script_file, $1= 0, $2= 1vb .; ${@:3}ile başlayan her argümanı seçer $3.
Olası aralıklar için bazı ek örnekler:
# two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
# every argument starting with the second to last one
# a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
# two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3
Daha fazla okuma:
shiftyaklaşımın erişmeyi imkansız hale getireceğini$1ve$2siz değiştirdikten sonra bahsetmeye değer . Komut dosyanızda$2birlikte kullandığınız komut dosyasında$variable_in_question, bunu değiştirmeniz veya Parametre Genişletme yaklaşımını kullanmanız gerekir.