2013-11-25 3 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 и запустить каждую команду найти в конфе файл по одному. После выполнения команды результат будет «True» или «False»

конф файл формируется 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 заявлении работает Eval в субоболочке, так что линии не могут мешать друг с другом установка переменных или выход из всего цикла.

+0

Подтвержденное решение. Благодаря! – GerogeGZ

Смежные вопросы