
私は次のスクリプトを持っています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つの区切られた文字列を変数として読み込み、スクリプトOrg
のRepo
標準入力ストリームから読み込みます(より多くの文字があっても行Repo
の残りの部分を取得します)。/
この状況を避けるためにダミー変数を追加)。入力ストリームで処理したいデータを渡すことはユーザーの役割であり、スクリプト自体はこれがどのように行われるのか気にしません。
-n
echo
終了していない最後の行を含むファイルを渡すかどうかをテストします(質問のスクリプトにデータを供給して確認したいようです)。
ファイルを読みたい場合は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
答え2
可能ですか?
おそらく(man bash)「パラメータ拡張;デフォルト値の使用」と「コマンドの置き換え」を使用することもできます。次のことを試してください
for Dependency in ${1:-$(< Dependencies)}
do echo $Dependency
done