ワイルドカードを含む変数として $1 を含む Bash シェルスクリプト

ワイルドカードを含む変数として $1 を含む Bash シェルスクリプト

現在指定されているファイルの入力を変数として探して空の場合は、ディレクトリ全体を処理するデフォルトのbashスクリプトがあります。

実行時にファイルを指定すると、そのファイルがscript.sh file1.txt処理されます。

私が望んでいるが不明なのは、ワイルドカードを使用して複数のファイルを指定する方法です。たとえば、

script.sh file*.txt

単純なループが必要になるようですが、このシナリオと一致する例が見つかりません。

ループを実行しようとすると、最初の一致のみが処理されます。

#!/bin/bash
if [ $# -eq 0 ]; then
    echo "no argument supplied, pulling all file from tick_tock"

    for i in /var/tank/tick_tock/*.txt; do
        cp "$i" /var/tank/awaiting/
    done
fi
echo "you supplied $1"
cp "$1" /var/tank/awaiting/

ベストアンサー1

以下を使用してスクリプトを呼び出す場合:

$ script.sh file*.txt

一致するものがある場合、シェルは glob をファイル一致リストに展開します。たとえば、 、file1.txt、 がfile2.txtあると仮定すると、file3.txt上記のコマンドは次のようになります。

$ script.sh file1.txt file2.txt file3.txt

順序は異なる場合がありますが、重要ではありません。

この状況でファイルを処理する1つのオプションは、次のループです。

while [[ $# -ne 0 ]]; do
    # process ${1}
    shift
done

shift古い${1}ものを捨てる移動する残りのパラメータは1だけ「左に移動」されます(2は1になり、3は2になります)。またshift更新されました$#

たとえば、

#!/bin/bash

while [[ $# -ne 0 ]]; do
    echo ${1}
    shift
done

スクリプトを実行すると、以下が表示されます。

$ ./script.sh a b c
a
b
c
$

おすすめ記事