2013-03-14 1 views
3

У меня есть функция, которая проверяет состояние выхода предыдущей команды и должны запустить несколько команд, если не 0 (успех)передачи команд с пробелами в качестве аргументов функции

revert() 
{ 
if [ $? -ne 0 ] 
then 
    echo $# 
    for c in [email protected] 
    do 
    Execute command contained in passed string 
    done 
    echo "Operation failed. Reverting..." 
    exit 1 
fi 
} 

Я пытаюсь вызвать эту функцию и я получаю этот выход:

revert "ls" "ls -la" 
2 
ls ls -la 
auten.py canReach.sh chpass.sh newUser.sh popo secdir.sh 
auten.py canReach.sh chpass.sh newUser.sh popo secdir.sh 
No command '-la' found, did you mean: 
Command 'tla' from package 'tla' (universe) 
-la: command not found 

Очевидно, что пространство является проблемой, и я попытался несколько решений на этой странице, но все, что я получил тот же вывод, и один ОГРОМНАЯ БОЛЬ.
Итак, прежде чем отвечать, попробуйте мою функцию и посмотрите, сможете ли вы получить желаемый результат. Спасибо.

+0

Что делать, если одна из команд на самом деле должна содержать пробел? возможно, вам нужен мета-синтаксис, например 'find' для команд:' revert ls \; ls -la'? – Eevee

ответ

3

Используйте "[email protected]" с кавычками, а затем выполните команду с eval "$c".

revert() 
{ 
    (($? == 0)) && return 0 

    for c in "[email protected]" 
    do 
     eval "$c" 
    done 

    echo "Operation failed. Reverting..." >&2 
    exit 1 
} 

Вы можете читать x && y как «если x, то y». Это обычная сценария. Эта первая строка эквивалентна:

if (($? == 0)); then return 0; fi 
+0

спасибо, это было быстро и очень ясно. Не могли бы вы объяснить это? (($?)) || возврат 0' line? Похоже на OR .. –

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