como percorrer argumentos em um script bash

16

Eu gostaria de escrever um script bash com uma quantidade desconhecida de argumentos.

Como posso percorrer esses argumentos e fazer algo com eles?

Uma tentativa errada seria assim:

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

Respostas:

28

Há uma sintaxe especial para isso:

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

De maneira mais geral, a lista de parâmetros do script ou função atual está disponível através da variável especial $@.

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

Observe que você precisa de aspas duplas $@, caso contrário, os parâmetros passam por expansão de curinga e divisão de campo. "$@"é mágico: apesar das aspas duplas, ele se expande em tantos campos quanto em parâmetros.

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- parar de ser mau'
fonte
5
#! /usr/bin/env bash
for f in "$@"; do
  echo "$f"
done

Você deve citar, $@porque é possível que os argumentos contenham espaços (ou novas linhas, etc.) se você os citar ou escapar com a \. Por exemplo:

./myscript one 'two three'

São dois argumentos em vez de três, devido às aspas. Se você não citar $@, esses argumentos serão divididos no script.

evilsoup
fonte
2
Há um atalho para estefor f; do ...
glenn jackman