if else 条件を使用したディレクトリの変更

if else 条件を使用したディレクトリの変更

これは私の問題をよりよく理解するために私のコードの小さな抜粋です。ディレクトリ内の各ファイルがループに入ると、ファイル名からem値を抽出し、宣言されたem値と比較して次の操作を実行します。コードを実行した後、最初の条件が機能していることを確認しましたが、Em1ディレクトリから出ると、2番目の条件は確認されなくなりました。 Em2ディレクトリを開いたのですが、ファイルがある間は空だったからです。 em2値で。だから何が問題なのか知りたいです。

em1="first"
em2="second"
for file in *;
do
em=$( echo "$file" | awk -F'[.-]' '{print $1}' )
if [[ "$em" == "$em1" ]];
 then
   cd Em1                    #directory to execute action
   month_range               #function for action
   cd_ret                    #function to come back to current directory
elif [[ "$em" == "$em2" ]];
  then
   cd Em2
   month_range
   cd_ret
else
  echo "Nothing to do"
fi
done

答え1

forループヘッダーに変数名を使用する必要があります。$file元の質問に変数値を使用しましたfile

あなたがやっていることは少し複雑です。一時変更された作業ディレクトリーでコマンドを実行するには、サブシェルを使用できます。

( cd Em1 && month_range )

cdサブシェルの外部の作業ディレクトリは、サブシェルの内部の作業ディレクトリの影響を受けません。関数が実行する操作は明確ではないため、cd_retこれはエラーの別の原因である可能性があります。たとえば、month_range元の範囲で表示する必要がある変数を設定した場合など、これを実行できない場合は、次のようにします。

cd Em1 && { month_range; cd -; }

上記のコードは、をcd入力しEm1て関数を実行し、month_range呼び出しが行われなくなったと仮定してcd返されます。その場合は、現在の作業ディレクトリを変数に保存して使用します。month_rangecdmonth_rangecd

wd=$PWD; cd Em1 && { month_range; cd "$wd"; }

上記は、変数がmonth_range変更または設定解除されていないと想定していますwd

awkUnixのファイル名には技術的に改行文字を含めることができるため、使い方に問題があります。パラメータ置換を使用する方が良いです。

em=${file%%[.-]*}

$file上記のコードは最初に値-または.文字を切り取り、結果の文字列を変数に割り当てますem

これにより、以下が残ります。

em1=first
em2=second

for file in *; do
        em=${file%%[.-]*}

        if [ "$em" = "$em1" ]; then
                ( cd Em1 && month_range )
        elif [ "$em" = "$em2" ]; then
                ( cd Em2 && month_range )
        else
                echo 'Nothing to do'
        fi
done

または

em1=first
em2=second

for file in *; do
        em=${file%%[.-]*}

        case $em in
                "$em1") ( cd Em1 && month_range ) ;;
                "$em2") ( cd Em2 && month_range ) ;;
                *) echo 'Nothing to do'
        esac
done

またはまったくem抽出しないでください$file

em1=first
em2=second

for file in *; do
        case $file in
                "$em1"[.-]*) ( cd Em1 && month_range ) ;;
                "$em2"[.-]*) ( cd Em2 && month_range ) ;;
                *) echo 'Nothing to do'
        esac
done

またはbash構文を使用してください。

em1=first
em2=second

for file in *; do
        if [[ $file == "$em1"[.-]* ]]; then
                ( cd Em1 && month_range )
        elif [[ $file == "$em2"[.-]* ]]; then
                ( cd Em2 && month_range )
        else
                echo 'Nothing to do'
        fi
done

これが期待される結果であれば、month_range関数やスクリプトによって異なります。

関連情報