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'

引用のため、これは3つではなく2つの引数です。あなたが引用していない場合は$@、これらの引数は、スクリプト内で分割されます。


2
これには速記がありますfor f; do ...
グレンジャックマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.