whileループを条件付きでどのように供給しますか?

whileループを条件付きでどのように供給しますか?

私は次のスクリプトを持っていますCompare.sh

function Compare()
{
    echo 'Comparing here'
}

while read Dependency; do  
    
    Org=$(echo $Dependency | cut -d'/' -f1)
    Repo=$(echo $Dependency | cut -d'/' -f2)

    echo "Comparing $Repo ...";
    Compare $Repo
    
done <<< "$({ cat "$PWD/Dependencies"; echo; })"

コンテンツはDependencies依存関係のリストです。

Infra/Logging
Infra/Geo
Infra/Accounts
Company/Services
Company/Employees

この関数を呼び出すと、ファイルを./Compare.sh読み取り、Dependencies繰り返します。

しかし、今は1つの項目だけをパラメータとして提供できるようにしたいです。./Compare.sh Infra/Accounts。パラメータが提供されたら、これを繰り返したいと思います。デフォルトでは一度だけ繰り返されます。それ以外の場合はファイルを読む必要がありますDependencies

擬似コード:

 done <<< if $1 then $1 else "$({ cat "$PWD/Dependencies"; echo; })"

可能ですか?

ベストアンサー1

1つのアプローチは、スクリプト内のファイルを無視することです。

#!/bin/bash

Compare () {
   # some code
}

while IFS=/ read -r Org Repo || [ -n "$Repo" ]; do
   printf 'Comparing "%s"\n' "$Repo"
   Compare "$Repo"
done

次のように呼び出すことができます。

$ ./script <Dependencies

または次のようになります。

$ ./script <<<"Infra/Accounts"

または次のようになります。

$ some-command | ./script

または次のようになります。

$ ./script <<'END'
some/data
more/stuff
last/line
END

または同様の方法がたくさんあります。

このスクリプトのループは、/最初の2つの区切られた文字列を変数として読み込み、スクリプトOrgRepo標準入力ストリームから読み込みます(より多くの文字があっても行Repoの残りの部分を取得します)。/この状況を避けるためにダミー変数を追加)。入力ストリームで処理したいデータを渡すことはユーザーの役割であり、スクリプト自体はこれがどのように行われるのか気にしません。

-necho終了していない最後の行を含むファイルを渡すかどうかをテストします(質問のスクリプトにデータを供給して確認したいようです)。


ファイルを読みたい場合はDependencies基本的に、コマンドライン引数のみをデータとして使用し(提供されている場合)、次を使用します。

#!/bin/bash

Compare () {
   # some code
}

if [ "$#" -eq 0 ]; then
    cat Dependencies
else
    printf '%s\n' "$@"
fi |
while IFS=/ read -r Org Repo || [ -n "$Repo" ]; do
   printf 'Comparing "%s"\n' "$Repo"
   Compare "$Repo"
done

つまり、catコマンドライン引数がない場合はファイルが表示され、それ以外の場合はコマンドライン引数が別の行に印刷されます。何が行われても、このifステートメントはソリューションの最初のバリエーションと同じループに入力を提供します。

このスクリプトは次のように使用できます。

$ ./script

または

$ ./script 'some/data' 'more/stuff' 'last/line'

2番目のスクリプトは、最初のスクリプトの周りのラッパーとして作成できますscript1

#!/bin/sh

if [ "$#" -eq 0 ]; then
    cat Dependencies
else
    printf '%s\n' "$@"
fi |
./script1

おすすめ記事