как перебрать аргументы в скрипте bash


16

Я хотел бы написать сценарий bash с неизвестным количеством аргументов.

Как я могу пройти через эти аргументы и что-то с ними сделать?

Неправильная попытка будет выглядеть так:

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

Ответы:


28

Для этого есть специальный синтаксис:

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

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

Вы должны $@заключать в кавычки, потому что аргументы могут содержать пробелы (или символы новой строки и т. Д.), Если вы их цитируете или экранируете их с помощью символа \. Например:

./myscript one 'two three'

Это два аргумента, а не три, из-за кавычек. Если вы не цитируете $@, эти аргументы будут разбиты в сценарии.


2
Для этого есть сокращениеfor f; do ...
Гленн Джекман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.