これは私の問題をよりよく理解するために私のコードの小さな抜粋です。ディレクトリ内の各ファイルがループに入ると、ファイル名から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_range
cd
month_range
cd
wd=$PWD; cd Em1 && { month_range; cd "$wd"; }
上記は、変数がmonth_range
変更または設定解除されていないと想定していますwd
。
awk
Unixのファイル名には技術的に改行文字を含めることができるため、使い方に問題があります。パラメータ置換を使用する方が良いです。
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
関数やスクリプトによって異なります。