Bagaimana menangani lebih dari 10 parameter di shell


101

Saya menggunakan bash shell di linux dan ingin menggunakan lebih dari 10 parameter dalam skrip shell


8
Perhatikan bahwa memiliki 10 parameter akan membuatnya cukup membingungkan. Mungkin lebih baik menggunakan opsi (misalnya -a 1atau --foo=bar) sebagai gantinya. Lihat man getopt,, man getoptsdan man bashuntuk beberapa opsi untuk melakukan itu.
Mikel

Jawaban:


158

Gunakan kurung kurawal untuk memulainya:

echo "${10}"

Anda juga dapat melakukan iterasi pada parameter posisi seperti ini:

for arg

atau

for arg in "$@"

atau

while (( $# > 0 ))    # or [ $# -gt 0 ]
do
    echo "$1"
    shift
done

2
Perhatikan bahwa $ {10} akan bekerja dalam bash, tetapi akan membatasi portabilitas Anda karena banyak implementasi sh hanya mengizinkan spesifikasi satu digit.
William Pursell

1
@William: Ada beberapa shell yang tidak menerimanya, seperti shell Bourne warisan asli, tetapi selain shell yang saya cantumkan di komentar lain (Bash, dash, ksh, dan zsh), ini juga berfungsi di csh, tcsh dan abu Busybox.
Dijeda sampai pemberitahuan lebih lanjut.

1
@WilliamPursell ${10}ditentukan oleh POSIX
Steven Penny

2
Khawatir tentang ${10}pekerjaan hanya diperlukan saat menggunakan implementasi yang sangat lama yang tidak memenuhi standar. Mungkin hanya untuk kepentingan sejarah ... namun saya belum pernah menggunakannya! Saya kira karena praktik terbaik menyatakan bahwa 10 argumen terlalu banyak kecuali jika diulang, dalam hal ini Anda akan mengulanginya dengan "$@"daripada menghitungnya.
William Pursell

22

Anda dapat memiliki hingga 256 parameter dari 0 hingga 255 dengan:

${255}

5
Saya pikir batas itu tergantung pada cangkangnya. Bash, dash, ksh, dan zsh sepertinya tidak memilikinya. sh -c 'echo ${333}' /usr/bin/*
Dijeda sampai pemberitahuan lebih lanjut.

3
Cangkang saya dengan nyaman naik hingga 2 jutaset $(seq 2097152); echo ${2097152}
Steven Penny
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.