Я хотел бы написать сценарий bash с неизвестным количеством аргументов.
Как я могу пройти через эти аргументы и что-то с ними сделать?
Неправильная попытка будет выглядеть так:
#!/bin/bash
for i in $args; do
echo $i
done
Для этого есть специальный синтаксис:
for i do
printf '%s\n' "$i"
done
В общем, список параметров текущего скрипта или функции доступен через специальную переменную $@
.
for i in "$@"; do
printf '%s\n' "$i"
done
Обратите внимание, что вам нужны двойные кавычки $@
, в противном случае параметры подвергаются расширению по шаблону и разделению поля. "$@"
это волшебство: несмотря на двойные кавычки, оно расширяется до столько полей, сколько есть параметров.
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
Вы должны $@
заключать в кавычки, потому что аргументы могут содержать пробелы (или символы новой строки и т. Д.), Если вы их цитируете или экранируете их с помощью символа \
. Например:
./myscript one 'two three'
Это два аргумента, а не три, из-за кавычек. Если вы не цитируете $@
, эти аргументы будут разбиты в сценарии.
for f; do ...