2013-11-25 70 views
1

我需要使用不同格式(其中使用配置文件和循环)替换以下脚本的帮助。条件语句bash脚本

[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文件中的一个找到的每个命令。执行后,命令的输出将是“真”或“假”

的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 [email protected]; 
    do $i 
     if [ $i -eq 0 ]; then 
    echo "Passed" 
     else 
    echo "Failed" 
fi 
    done 

而是显示基于条件语句的输出,该脚本从conf1中逐一运行每条线路,而不会看到回显消息。

请问我能否得到一些帮助。

回答

0

试试这个:

#! bin/bash 
while read L; do 
    echo $L'; exit $?'|sh 
    if [ $? -eq 0 ]; then 
     echo Pass 
    else 
     echo Failed 
    fi 
done < conf1 
+0

确认的解决方案。谢谢! – GerogeGZ

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,让线不能互相干扰通过设置变量或退出整个循环。

+0

确认的解决方案。谢谢! – GerogeGZ