cara mengulang argumen di skrip bash


16

Saya ingin menulis skrip bash dengan jumlah argumen yang tidak diketahui.

Bagaimana saya bisa berjalan melalui argumen ini dan melakukan sesuatu dengannya?

Upaya yang salah akan terlihat seperti ini:

#!/bin/bash
for i in $args; do 
    echo $i
done

Jawaban:


28

Ada sintaks khusus untuk ini:

for i do
  printf '%s\n' "$i"
done

Secara umum, daftar parameter skrip atau fungsi saat ini tersedia melalui variabel khusus $@.

for i in "$@"; do
  printf '%s\n' "$i"
done

Perhatikan bahwa Anda memerlukan tanda kutip ganda di sekitar $@, jika tidak, parameter mengalami ekspansi wildcard dan pemisahan bidang. "$@"adalah sihir: meskipun ada tanda kutip ganda, ia mengembang menjadi bidang sebanyak ada parameter.

print_arguments () {
  for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special  !\characters' '-n' # prints 4 lines
print_arguments ''                                             # prints one empty line
print_arguments                                                # prints nothing

5
#! /usr/bin/env bash
for f in "$@"; do
  echo "$f"
done

Anda harus mengutip $@karena ada kemungkinan argumen mengandung spasi (atau baris baru, dll.) Jika Anda mengutipnya, atau menghindarinya dengan a \. Sebagai contoh:

./myscript one 'two three'

Itu dua argumen daripada tiga, karena kutipan. Jika Anda tidak mengutip $@, argumen itu akan dipecah dalam skrip.


2
Ada singkatan untuk inifor f; do ...
glenn jackman
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.