我目前正在使用 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
截至目前,脚本仍然缺少几个部分,但我的问题之一如下
[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