як перебирати аргументи в скрипті 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 ...
glenn jackman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.