web-dev-qa-db-ja.com

bashスクリプトで引数をループする方法

引数の数が不明なbashスクリプトを書きたいのですが。

これらの議論を通り抜けて、どうすればよいですか?

間違った試みは次のようになります。

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

これには特別な構文があります:

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'

引用符が原因で、これは3つではなく2つの引数です。 $@を引用符で囲まないと、それらの引数はスクリプト内で分割されます。

5
evilsoup