スクリプトを書く方法を探しています。
次のパターンを持つ3つのファイルがあります。
DailyLoad_Cust.txt
DailyLoad_Credit.txt
DailyLoad_Account.txt
これらの各ファイルにリンクされていますsub_system
。cust
cus_edw
credit
cred_edw
account
acc_edw
ファイルがNASの場所で利用可能で、0より大きい場合(または)をインポートRunFeed.sh <<sub_system>>
して実行する一般的なロードスクリプトがあります。sub_system
cus_edw
cred_edw
acc_edw
count
これに使用できる最善のアプローチは何ですか?
$Var1="Cust"
$Var2="Credit"
$var3="Account"
SUB_SYSTEM="";
for i in $VAR1; do
NASFileCount=`find . -maxdepth l -type f -name "${var}*.txt" | wc -l
if [[ $NASFileCount -gt 0 ]] && $Var1=cust;then
Sub_System=cust_edw
sh RunFeed.sh $Var
上記の方法(元であり、これまで実行されていない)で上記のすべての変数に対してループをどのように実行しますか?
誰でも私を案内してもらえますか?より良い方法はありますか?私はUnixに初めて触れ、まだ学んでいます。
ベストアンサー1
RunFeed.sh
現在のディレクトリにあるすべてのファイルに対応するサブシステム文字列を引数として使用して実行するとします。_edw
DailyLoad_*.txt
名前が存在するかどうかをテストするには、-e
testを使用してください。値セットに対してこれを行うには、ループを使用します。
#!/bin/bash
for string in account credit cust; do
if [ -e "DailyLoad_${string^}.txt" ]; then
sh RunFeed.sh "${string}_edw"
fi
done
ここで何が起こるのかは、3つの文字列、account
およびcredit
を繰り返すことですcust
。の各文字列に対して、文字列の最初の文字を大文字で表示する名前が$string
存在するかどうかをテストします。DailyLoad_${string^}.txt
${string^}
$string
RunFeed.sh
名前が存在する場合は、シェルスクリプトを${string}_edw
唯一の引数として実行します。
ファイルの存在だけでなく空でないかをテストするには、上記のテストで代わりに使用してください-s
。長さ0のファイルの場合、テストは失敗します-e
。-s
コードにはいくつかの基本的な構文エラーがあります。
プレフィックスが付いた変数に割り当てられます
$
。特定の難読化された状況では、これは構文的に有効なシェルコードですが、期待どおりに機能しません。通常、variable=value
変数()の拡張ではなく変数名()に割り当てることをお勧めします。$variable=value
find
周囲のコマンドの置き換えとwc
最後のバックティックがありません。optionsに(one)の
l
代わりに(ell)を使用しています。1
-maxdepth
find
ステートメントが
if
欠落しており、ループの末尾にありませんfi
。for
done
未使用の変数があり、値が割り当てられていない他の変数を使用します。
二重引用符が必要な拡張は引用しません。
あなたは見つけることができますhttps://www.shellcheck.net/Webサイトでは、シェルコードの構文エラーを簡単に整理できます。