bashスクリプトで$ 1を使用して*ファイルを繰り返します。

bashスクリプトで$ 1を使用して*ファイルを繰り返します。

$ 1変数を使用して、スクリプトに提供されているファイルに対して操作を実行するスクリプトを作成しています。このファイルを繰り返す最善の方法は何ですか?現在、私は次のようなものを使ってスクリプトをハードコーディングしています。

for file in *.pdf
do 
   act on $file
done

しかし、私はこれを行うために$ 1変数を使用したいと思います。ありがとう Barry

答え1

$1シェルスクリプトに渡された最初の引数。したがって、スクリプトがある場合はmyscriptこれを次のように呼び出します。

myscript somefile

そう$1すればなりますsomefile。私がこう呼んだら:

myscript *

そして、現在のディレクトリに次のファイルがあります。

foo bar baz

そう$1すればなりますfoo。どちらの場合も$1値が1つだけで、繰り返す項目はありません。

パラメータを繰り返すにはいくつかの方法があります。最も一般的なものは次のとおりです。

for file in "$@"; do
  echo doing something with "$file"
done

これは以下とは$@異なります。"$@"後者は、スペースを含むファイル名を正しく処理する特別な構造です。次のこともできます。

while [ -n "$1" ]; do
  echo doing something with "$1"
  shift
done

ここでshiftコマンドは最初の引数を削除し、次のように$2なります。空でない$1限り$1繰り返されます。以下も使用できます$#(コマンドライン引数の数を含む変数)。

while [ $# -gt 0 ]; do
    echo arg: "$1"
    shift
done

答え2

そうすれば

script *.pdf

*.pdfすでにコマンドラインから拡張されており、$1最初のファイルのみを参照してください。

for file in $1

したがって、必要な作業を実行しません。使用できる

for file in "$@"

代わりに。

リソースセクションを参照してください。特殊パラメータ内部にman bash

関連情報