Bash for ループは、1 つを除いてフォルダ内のすべてのファイルを処理します。 [重複]

Bash for ループは、1 つを除いてフォルダ内のすべてのファイルを処理します。 [重複]

9つのRobot Frameworkテストファイルを含むフォルダがあります。そのうち8個だけを実行すればよい。最後は他のすべてを設定するために使用されるからです(私たちはこれをと呼びますconfig.robot)。

これらすべてのテストを実行する必要がある場合は、次のことを行います。

for test_file in folder/*.robot; do
    robot -b debug.log -d log/ $test_file.robot;
done

しかし、この場合は実行も可能であるという意味ですが、config.robotこれは私が望んでいません。

1つを除いて、フォルダ内のすべてのファイルに対してforループを実行する方法は?

これが役立つ場合、config.robot除くすべてのファイルは次の命名構文に従います。すべて実行順で始まり、その後に実際の名前が続きます01__init-connection.robot


編集する:この質問を投稿する前に、提供された回答を見てみました。グローバルマッチングからパターンを除外そして次のようなことを書いた

shopt -s extglob
for test_file in folder/!(config).robot; do ...

ただし、Robot Frameworkはファイル名を認識しません。

Parsing 'folder/!(config).robot' failed: Data source does not exist.

だからロボットフレームワークはこの構文が好きではないようです。
私のファイル名構造に一致する正規表現に基づいて検索結果を使用して変数を設定し、その変数に対してforループを実行しようとしています。

SUITES=$(find . -regex '^[0-9][0-9][a-zA-Z_-]*')
for SUITE in $SUITES; do robot -b ...

しかし、何らかの理由で私がechoバスルームにいるときは何も返しません。私がここで何を見逃しているのかわかりません。

答え1

Bashでは、タグは次のようになります。

shopt -s extglob
for test_file in folder/!(config).robot; do robot -b debug.log -d log/ "$test_file".robot; done

応答の更新:

shopt -s extglob
for test_file in folder/!(config).robot; do ...

次に続く:

'folder/!(config).robot' 解析に失敗しました: データソースが存在しません。

「フォルダ」に「config.robot」以外に「.robot」ファイルがない場合、この現象が発生する可能性があります。考慮する:

$ mkdir folder
$ touch folder/config.robot
$ shopt -s extglob
$ shopt -u nullglob
$ for f in folder/!(config).robot; do ls --- "$f"; done
ls: cannot access folder/!(config).robot: No such file or directory

コントラスト(新しいスタート):

$ mkdir folder
$ touch folder/config.robot
$ shopt -s extglob
$ shopt -s nullglob
$ for f in folder/!(config).robot; do ls -- "$f"; done
$

ここで、forワイルドカードはどのファイルにも拡張されないため、ループはコマンドを実行しません。

または代替としてはい非config.robotファイルは次のとおりです。

$ mkdir folder
$ touch folder/config.robot
$ touch folder/01__init-connection.robot
$ shopt -s extglob
$ shopt -s nullglob
$ for f in folder/!(config).robot; do ls -- "$f"; done
folder/01__init-connection.robot

答え2

このコマンドを使用できますcontinue

また、この変数はフルパスを選択することに注意してください。

for f in folder/*.robot; do
    test "$f" = folder/config.robot && continue 
    robot -b debug.log -d log/ "$f"
done

答え3

この試み、

for test_file in folder/*.robot; 
do 
    [ "$test_file" != "config.robot" ] && robot -b debug.log -d log/ $test_file.robot;
done
  • robot$test_file以下のような場合にのみ実行されます。config.robot

または単に使用find

find folder/*.robot ! -name "config.robot" -exec robot -b debug.log -d log/ {} +

関連情報