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
rubo77
sumber

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
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.

Evilsoup
sumber
2
Ada singkatan untuk inifor f; do ...
glenn jackman