我需要帮助,使用不同的格式替换以下脚本,其中使用配置文件和循环。
[FedoraC]$ cat script.sh
#!/bin/bash
grep -q /tmp /etc/fstab
if [ $? -eq 0 ]; then
echo "True"
else
echo "False"
fi
mount | grep ' /tmp' | grep nodev
if [ $? -eq 0 ]; then
echo "True"
else
echo "False"
fi
mount | grep /tmp | grep nosuid
if [ $? -eq 0 ]; then
echo "True"
else
echo "False"
fi
到目前为止,我有以下脚本应该从源/ conf文件中获取值并逐个运行conf文件中的每个命令。执行命令后,输出将为“True”或“False”
conf文件由Unix命令组成:/ opt / conf1
[FedoraC]$ cat conf1
grep -q /tmp /etc/fstab
mount | grep /tmp | grep nodev
mount | grep /tmp | grep nosuid
mount | grep /tmp | grep noexec
[FedoraC]$ cat new_script.sh
#!/bin/bash
. conf1
for i in $@;
do $i
if [ $i -eq 0 ]; then
echo "Passed"
else
echo "Failed"
fi
done
脚本不是根据条件语句显示输出,而是从conf1逐个运行每一行,而不是看到回显消息。
请问我能得到一些帮助。
答案 0 :(得分:0)
试试这个:
#! bin/bash
while read L; do
echo $L'; exit $?'|sh
if [ $? -eq 0 ]; then
echo Pass
else
echo Failed
fi
done < conf1
答案 1 :(得分:0)
执行此操作的更强大和规范的方法是拥有目录/opt/conf1.d/
,并将每个行作为可执行脚本放在此目录中。然后你可以做
for file in /opt/conf1.d/*
do
[[ -x $file ]] || continue
if "$file"
then
echo "Passed"
else
echo "Failed"
fi
done
这具有支持多行脚本或具有更复杂逻辑的脚本的优点。它还允许您以任何语言编写检查脚本,并允许脚本和包轻松且非交互地添加和删除内容。
如果你真的想坚持你的设计,你可以用:
while IFS= read -r line
do
if ( eval "$line" )
then
echo "Passed"
else
echo "Failed"
fi
done < /opt/conf1
if
语句中的括号在子shell中运行eval,因此通过设置变量或退出整个循环,行不会相互干扰。