Условно делать что-то с каждой итерацией / элементом массива команд в bash - PullRequest
0 голосов
/ 27 июня 2019

Итак, у меня есть массив, полный команд, я хочу запустить каждый элемент и вывести выводимые на экран команды, а также проверить, есть ли ошибка в каждой команде, и вывести «Команда не выполнена».Я не могу найти способ сделать это программно. Я в основном хочу запускать команды без вывода ошибок команды, заполняющих экран.

пример:

array=(
"cat something"
"grep something"
"rm something"
"read -r -p 'something' something"
)
length=${#array[@]}
for (( i=1; i<${length}+1; i++ ));
do
    if echo ${array[$i-1]} | sh 2>/dev/null; then
        echo "command succeded"
    else
        echo "command failed"
    fi
done

1 Ответ

0 голосов
/ 27 июня 2019

Я думаю, это то, что вы ищете:

command_list="command1;command2"
       #I tried it with command_list="ls;ls <sub-directory>"
while IFS=';' read -ra command_array; do
      for i in "${command_array[@]}"; do
          # process "$i"
           if ( $i &>/dev/null )
           then
                echo "Success"
           else
                echo "Failed"
           fi
      done
 done <<< $command_list

Если вы хотите узнать, почему используется цикл while, прочитайте: https://stackoverflow.com/a/918931/11571342

РЕДАКТИРОВАТЬ: Как уже упоминалось в комментариях, нет способа узнать exit_status команды в bash заранее. Вам придется выполнить команду, чтобы проверить это. Но есть способ, который мог бы работать (но обычно он терпит неудачу, когда используется rm или insatll)

while IFS=';' read -ra command_array; do
   for i in "${command_array[@]}"; do
          # process "$i"
          $i &>/dev/null 
          exit_status=$?
          if (( exit_status == 0 ))
          then
          $i
          echo "Success...."
          else
          echo "Failed"
          fi
      done
 done <<< $command_list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...