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
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
#! /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.
for f; do ...