2014-11-23 3 views
0

У меня есть функция 'exit_status', которая принимает два аргумента. $ 1 - это каталог (для резервного скрипта rsync) и $ 2 (getStatus) используется для установки статуса выхода ls на $ 1 и возврата значения вызывающему. Если статус выхода равен 0, начнется резервное копирование.Выход из команды ls по позиционным параметрам

Я хотел бы переписать эту функцию, чтобы получить не менее 3 позиционных параметров, путь источника и назначения и вернуть статус выхода. Я хотел бы, чтобы функция могла обрабатывать событие, в котором я хочу передать более двух каталогов для проверки. Возможно, я могу передать несколько исходных каталогов и пункт назначения.

Я не настроен на функцию, возвращающую статус выхода, но я просто ищу лучший способ проверить, что все каталоги имеют статус выхода 0, чтобы вызывающий выполнял резервную копию. Если один или несколько каталогов имеют ненулевой возврат к выходу.

#!/usr/bin/bash 

# Drive paths 
testOffSiteBkup1="/mnt/hotswp/testoffsitebkup1/" 

exit_status() { 
    local _cmd="/bin/ls -al $1 > /dev/null" 
    local _getStatus=$2 
    eval $_cmd 
    local _status=$? 
    eval $_getStatus=$_status 
} 

exit_status $testOffSiteBkup1 getStatus 
if [ $getStatus -eq 0 ] ; then 
    echo "$testOffSiteBkup1 is present." 
    rsync ...... 
else 
    echo "$testOffSiteBkup1 is NOT present." 
    exit 
fi 
+0

Как Фирма вы используете bash? Я считаю, что чистые сценарии оболочки начинают разваливаться по мере увеличения сложности, когда использование чего-то вроде Perl или Python приходит в свои руки. – Sobrique

+0

Нет причины * поместить эту команду 'ls' в строку, а затем использовать' eval' it. Не делай этого. Также почему вы беспокоитесь об этом, если можете просто вернуть значение из функции напрямую? –

+0

Вы знаете переменную '$?' В оболочке? Это возвращаемое значение (0-255) из ранее выполненного cmd. Вы всегда можете захватить это и обработать его логикой состояния. В качестве минимального случая: '/ bin/ls notesuch; ls_stat = $ ?; case $ ls_stat in 0) echo ok ;; *) echo err = $ ls_stat ;; esac' Удачи. – shellter

ответ

0

Вы можете сделать это без функции и ls -l команду, используя тестовую команду

Например, чтобы проверить, является ли как исходный каталог и каталог назначения существует вы можете использовать следующие две строки

test -d $source && test -d $destination 
status=$(echo $?) 
Смежные вопросы