親シェルでサブシェルの値を使用する方法

親シェルでサブシェルの値を使用する方法

私はLinuxスクリプトに慣れておらず、今回は初めてLinuxスクリプトを使用するので、次の問題が発生します。

パスワード:

while [ $pct -gt 80 ]; do
    flag=1;
    ls -tr | while read file; do
        if [[ $file =~ .+\.log[0-9]+ ]]; then
            printf "File deleted:\n";
            stat $file; 
            rm -r $file;
            flag=1;
            break;
        else
            flag=0;
        fi;
    done;

    if [ $flag -eq 0]; then
        break;
    fi;

    pct= # get the new pct;
done;

アクションは、上記の正規表現でキャプチャされた特定のログファイルを最も古いファイルから削除することであるため、ls -trを使用します。 whileループを使用してファイルのリストを繰り返し、ファイルが指定された正規表現と一致する場合は削除します。削除するたびに、使用しているアプリケーションファイルシステムの割合を確認し、その割合が80%を超える場合(外部whileループ条件に表示されている)プロセスを繰り返します。

これで、ファイルを削除しても、指定された正規表現パターンのファイルが残っていなくても、使用率が80%以下に低下せず、同じフォルダに残っている他のファイルを削除することはできません。したがって、無限ループに陥るので、この場合には無限ループを破るためにフラグ変数を使用しようとしました。しかし、ファイルを繰り返すためにパイプを使用しているため、サブシェルやサブプロセスになり、親プロセスのflags変数を使用できなくなります(サブシェルのフラグの更新された値は親シェルに反映されません)。私は(パイプに関するこの記事で読んだように)行っているので、無限ループは決して中断されません。

ベストアンサー1

zsh代わりに使用してくださいbash

while
  pct= # get the new pct

  (( pct > 80 )) &&
    oldest_log_file=( *.log<->(N.Om[1]) ) &&
    (( $#oldest_log_file ))
do
  print -r Removing $oldest_log_file
  rm -f -- $oldest_log_file
done

または:

log_files_from_oldest_to_newest=( *.log<->(N.Om) )
while
  pct= # get the new pct

  (( pct > 80 )) &&
    (( $#log_files_from_oldest_to_newest ))
do
  print -r Removing $log_files_from_oldest_to_newest[1]
  rm -f -- $log_files_from_oldest_to_newest[1]
  shift 1 log_files_from_oldest_to_newest
done

または:

zmodload zsh/stat
for log_file in *.log<->(N.Om); do
  pct= # get the new pct
  (( pct > 80 )) || break

  stat -F %FT%T%z -LH s -- $log_file || continue
  print -r Removing $log_file of size $s[size] last modified on $s[mtime]
  rm -f -- $log_file
done

おすすめ記事