39

ユーザーがワイルドカードを使用してディレクトリ パスを渡すことができるようにする bash スクリプトを作成しようとしています。

例えば、

bash show_files.sh *

このディレクトリ内で実行すると

drw-r--r--  2 root root  4.0K Sep 18 11:33 dir_a
-rw-r--r--  1 root root   223 Sep 18 11:33 file_b.txt
-rw-rw-r--  1 root root   106 Oct 18 15:48 file_c.sql

出力します:

dir_a
file_b.txt
file_c.sql

現在の方法では、次のように出力されます。

dir_a

の内容show_files.sh:

#!/bin/bash

dirs="$1"

for dir in $dirs
do
    echo $dir
done
4

2 に答える 2

58

を呼び出す親シェルは、 をbash show_files.sh *展開*します。

スクリプトでは、次を使用する必要があります。

for dir in "$@"
do
    echo "$dir"
done

二重引用符により、ファイル名の複数のスペースなどが正しく処理されるようになります。

シェル スクリプトで引数を反復処理する方法bashも参照してください。


紛らわしい補遺

スクリプトを展開して*.*処理中 (これは些細なことではありません)。その時点で、私は配列を使用します。

names=( $@ )
for file in "${names[@]}"
do
    echo "$file"
done

二重引用符なしで使用することはあまりありませんが$@、これは多かれ少なかれ正しいことです。注意が必要なのは、スペースを含むワイルドカードをうまく処理できないことです。

検討:

$ > "double  space.c"
$ > "double  space.h"
$ echo double\ \ space.?
double  space.c double  space.h
$

それはうまくいきます。しかし、それをワイルドカードとしてスクリプトに渡してみてください... まあ、その時点でトリッキーになるとだけ言っておきましょう。

個別に抽出する場合は$2、次を使用できます。

names=( $1 )
for file in "${names[@]}"
do
    echo "$file"
done
# ... use $2 ...
于 2013-10-18T20:07:00.330 に答える
11

ワイルドカードを引用します:

bash show_files.sh '*'

または、スクリプトが 1 つだけでなく、引数のリストを受け入れるようにします。

for dir in "$@"
do
    echo "$dir"
done

"$@'それ自体が空白を含む要素を保持する特別な機能を維持するために、別の変数に代入するよりも直接反復する方がよいでしょう。

于 2013-10-18T20:07:15.970 に答える