Forループとそうでない場合は無限変数を使用する

Forループとそうでない場合は無限変数を使用する

私は現在bashのいくつかの機能を使用しています。しかし、今まで私は混乱しています。まず、私がやりたいことを説明します。

目標出力:

2016-11-18T05:48:01 NFS="NFS1" MOUNT_STATUS=True RUN_TIME=0.1

したがって、このターゲット出力を取得するには、df -hPを使用してすべてのNFSマウントストレージを確認する必要があります。インストールされている場合はTRUEと表示され、それ以外の場合はFALSEと表示されます。したがって、ここで実際に難しいのは、スクリプトがインストールパスにテストファイルを生成する必要があることです。

たとえば、df -hPを実行し(出力は次のようになります)、/ devがマウントされていることを確認します(マウントされている場合)。スクリプトは/ devにテストファイルを生成し、テストファイルを削除して開始時間を記録します。ファイル作成とファイル削除までの終了時間(約0.5ms)

Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/centos-root        8.5G  3.7G  4.9G  44% /
devtmpfs                       902M     0  902M   0% /dev
tmpfs                          913M     0  913M   0% /dev/shm

これは私の現在のスクリプトです。

now="$(date +%Y-%m-%dT%H:%M:%S)"
sp=" "
NFS="NFS1 NFS2  NFS3"
MOUNT_STATUS="$TRUE FALSE" #TRUE or FALSE
RUN_TIME="" #Start time to endtime of script per NFS
if [ $# -eq 0 ]; then
echo $now
set -e
else
for i in "$@"; do
echo -n "$now" ;
echo -n NFS=$(df -hP "$i" | awk '{print $NF}' | sed -n '1!p')  2>&1 | sed 's/^/ /'  ;
echo    $(if [[ "$i" == "/media /a/nbackup201 /a/ndt301" ]] ;
echo -n MOUNT_STATUS=;
then
echo 'TRUE' ;
else
echo $([[ "$i" != "/media /a/nbackup201 /a/ndt301" ]])    ;
echo 'FALSE' ; fi) |  sed 's/^/ /'             
done
fi

現時点では、スクリプトにまだいくつかの部分がありませんが、私の質問の1つは次のとおりです。

[root@strg ~]# sh script.sh /dev /run /boot a
2016-11-21T08:50:51 NFS=/dev MOUNT_STATUS=TRUE
2016-11-21T08:50:51 NFS=/run MOUNT_STATUS=TRUE
2016-11-21T08:50:51 NFS=/boot MOUNT_STATUS=TRUE
2016-11-21T08:50:51df: ‘a’: No such file or directory
NFS= MOUNT_STATUS=TRUE
[root@strg ~]#

したがって、スクリプトを実行して間違ったマウントポイントを入力しても、まだ「NFS = MOUNT_STATUS = TRUE」と表示されている場合は、NFS = a STATUS = FALSEとマークする必要があるため、ループに何が問題なのか混乱しています。 ?

とても親切でしたら、ファイルの作成/削除を挿入して時間を記録できる場所を教えてください。ファイルを生成するための最良のオプション/コマンドは何ですか?混乱が多すぎる場合はお知らせください。私はそれをよりよく説明しようとします。

答え1

問題は、スクリプトが各パラメータを繰り返し、パラメータが正しいマウントポイントであるかどうかにかかわらず、すべてのコマンドを実行することです。テストしていませんが、以下の解決策を使用すると、目的の結果が得られます。

now="$(date +%Y-%m-%dT%H:%M:%S)"
sp=" "
NFS="NFS1 NFS2  NFS3"
MOUNT_STATUS="$TRUE FALSE" #TRUE or FALSE
RUN_TIME="" #Start time to endtime of script per NFS
if [ $# -eq 0 ]; then
echo $now
set -e
else
for i in "$@"; do
echo -n "$now" ;
if [ -d $i ]; then
echo -n NFS=$(df -hP "$i" | awk '{print $NF}' | sed -n '1!p')  2>&1 | sed 's/^/ /'  ;
echo    $(if [[ "$i" == "/media /a/nbackup201 /a/ndt301" ]] ;
echo -n MOUNT_STATUS=;
then
echo 'TRUE' ;
else
echo $([[ "$i" != "/media /a/nbackup201 /a/ndt301" ]])    ;
echo 'FALSE' ; fi) |  sed 's/^/ /'             
else
echo -n NFS=$i MOUNT_STATUS=false
done
fi

関連情報