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

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

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

次のパターンを持つ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サイトでは、シェルコードの構文エラーを簡単に整理できます。

おすすめ記事