jak przeglądać argumenty w skrypcie bash

16

Chciałbym napisać skrypt bash z nieznaną ilością argumentów.

Jak mogę przejść przez te argumenty i coś z nimi zrobić?

Zła próba wyglądałaby następująco:

#!/bin/bash
for i in $args; do 
    echo $i
done
rubo77
źródło

Odpowiedzi:

28

Jest do tego specjalna składnia:

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

Mówiąc bardziej ogólnie, lista parametrów bieżącego skryptu lub funkcji jest dostępna poprzez specjalną zmienną $@.

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

Zauważ, że potrzebujesz podwójnych cudzysłowów $@, w przeciwnym razie parametry ulegną rozszerzeniu z użyciem symboli zastępczych i podziałowi pól. "$@"to magia: pomimo podwójnych cudzysłowów, rozszerza się na tyle pól, ile jest parametrów.

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 „SO- przestań być zły”
źródło
5
#! /usr/bin/env bash
for f in "$@"; do
  echo "$f"
done

Powinieneś zacytować, $@ponieważ możliwe jest, że argumenty zawierają spacje (lub znaki nowego wiersza itp.), Jeśli zacytujesz je, lub unikniesz ich za pomocą \. Na przykład:

./myscript one 'two three'

To dwa argumenty zamiast trzech ze względu na cytaty. Jeśli nie zacytujesz $@, argumenty zostaną podzielone w skrypcie.

zła
źródło
2
Jest na to skrótfor f; do ...
glenn jackman