スクリプトを書く方法を探しています。
次のパターンを持つ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サイトでは、シェルコードの構文エラーを簡単に整理できます。
答え2
どういう意味なのかよくわかりません。私が意図したことを間違って理解した場合は、コメントしてください。
まず、配列を使用して繰り返すことができます。
〜のようにロミオ・ニノフ前述したように、配列と一緒に使用できます。次のコードを考えてみましょう。
ARRAY_VALS={"Cust" "Credit" "Account"}
for value in "${ARRAY_VALS[@]}"; do echo $value; done
2番目:サブシステムサフィックス
サフィックスが複数あると仮定しますが、サブシステムファイルは何に使用されますか?実際にはどこでも使用しません。とにかく、次のコードのようなものを使用して作成できます。
SUB_SYSTEM=${value}"_edw"
またはフルネームを見つける必要がある場合:
SUB_SYSTEM=`find . -maxdepth l -type f -name "*${value}_edw.txt"`
3番目:ファイル名
あなたの例では、「cust *」または「* cust」を含むファイルを検索していますか?ファイル形式が「DailyLoad_Cust.txt」と言われたので、「*cust」を意味します。ただし、この場合は必須プレフィックス(この場合は「DailyLoad」)のみがあることを確認してください。たとえば、変更されたコードが次のような場合:
NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt" | wc -l`
したがって、必要に応じてgrepを使用してフィルタリングできます。
NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt"| grep "DailyLoad" | wc -l`
最終コード
コードを少し変更し、fi(toおよびif条件)と完成(for for)を追加しました。私が間違って理解した場合は、コメントしてください。
Var1="Cust"
Var2="Credit"
var3="Account"
ARRAY_VALS=($Var1 $Var2 $Var3) # Daclare an array
for value in "${ARRAY_VALS[@]}"; do # run the for loop
NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt" | wc -l`
if [[ $NASFileCount -gt 0 ]] && "$Var1"==cust;then
SUB_SYSTEM=${value}"_edw" # not used
sh RunFeed.sh "$SUB_SYSTEM" # Run subscript
fi
done