2013-11-25 121 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