複数変数のコード部分の繰り返し

複数変数のコード部分の繰り返し

スクリプトを書く方法を探しています。

次のパターンを持つ3つのファイルがあります。

DailyLoad_Cust.txt
DailyLoad_Credit.txt
DailyLoad_Account.txt

これらの各ファイルにリンクされていますsub_systemcustcus_edwcreditcred_edwaccountacc_edw

ファイルがNASの場所で利用可能で、0より大きい場合(または)をインポートRunFeed.sh <<sub_system>>して実行する一般的なロードスクリプトがあります。sub_systemcus_edwcred_edwacc_edwcount

これに使用できる最善のアプローチは何ですか?

$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現在のディレクトリにあるすべてのファイルに対応するサブシステム文字列を引数として使用して実行するとします。_edwDailyLoad_*.txt

名前が存在するかどうかをテストするには、-etestを使用してください。値セットに対してこれを行うには、ループを使用します。

#!/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-maxdepthfind

  • ステートメントがif欠落しており、ループの末尾にありませんfifordone

  • 未使用の変数があり、値が割り当てられていない他の変数を使用します。

  • 二重引用符が必要な拡張は引用しません。

あなたは見つけることができます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

関連情報