come eseguire il loop degli argomenti in uno script bash


16

Vorrei scrivere uno script bash con una quantità sconosciuta di argomenti.

Come posso esaminare questi argomenti e fare qualcosa con loro?

Un tentativo sbagliato sarebbe simile al seguente:

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

Risposte:


28

C'è una sintassi speciale per questo:

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

Più in generale, l'elenco dei parametri dello script o della funzione corrente è disponibile tramite la variabile speciale $@.

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

Si noti che sono necessarie le doppie virgolette $@, altrimenti i parametri subiscono espansione con caratteri jolly e divisione dei campi. "$@"è magico: nonostante le doppie virgolette, si espande in tanti campi quanti sono i parametri.

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

Dovresti citare $@perché è possibile che gli argomenti contengano spazi (o newline, ecc.) Se li citi o li elimini con a \. Per esempio:

./myscript one 'two three'

Sono due argomenti anziché tre, a causa delle virgolette. Se non citate $@, tali argomenti verranno suddivisi all'interno dello script.


2
C'è una scorciatoia per questofor f; do ...
Glenn Jackman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.