条件语句bash脚本

时间:2013-11-25 00:57:44

标签: 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文件中的每个命令。执行命令后,输出将为“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逐个运行每一行,而不是看到回显消息。

请问我能得到一些帮助。

2 个答案:

答案 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,因此通过设置变量或退出整个循环,行不会相互干扰。