Сценарий оболочки для выполнения набора команд в заданных каталогах - PullRequest
0 голосов
/ 01 июня 2018

Я написал следующий скрипт оболочки для выполнения заданного набора команд в каталоге каждого пакета.Предполагается, что остановится , если какая-либо команда не выполнится.Также должен отображаться вывод команды на консоли.

Требуется 3 аргумента с опциями

  1. '- b' базовый каталог пакетов
  2. '- c'Разделенный запятыми список команд
  3. '- p' Разделенный запятыми список пакетов (отдельные каталоги)

Shell Script

#!/bin/bash

#Function to execute a command
executeCommand(){
  printf "\n**** Executing Command: '$1' *****\n\n"
  $1
  return $?
}


  #Initialize the variables with command line arguments
  while getopts "c:p:b:" options; do
    case $options in
        b ) set -f # disable glob
            IFS=, # split on space characters
            base_directory=$OPTARG ;; # use the split+glob operator    
        c ) set -f # disable glob
            IFS=, # split on space characters
            commands=($OPTARG) ;; # use the split+glob operator
        p ) set -f # disable glob
            IFS=, # split on space characters
            packages=($OPTARG) ;; # use the split+glob operator    
    esac
  done

  #Iterate over all packages
  for (( i = 0; i < ${#packages[@]} ; i++ )); do

    #Go to each package directory
    if executeCommand "cd ${base_directory}${packages[$i]}"; then

      #Execute all the commands one by one for current package
      for (( j = 0; j < ${#commands[@]} ; j++ )); do
        if executeCommand "${commands[$j]}"; then
          echo "Successfully Executed the Command"
        else
          break 2;
        fi  
      done
    else
      break;
    fi 
  done  

Если я выполняю его со следующими аргументами, это выдает ошибку, что Нет такого файла или каталога Однако, если я вручную выполняю cd /local/workplace/directory1, он переходит к выполнению directory1

и Ошибка

~/bb-slds.sh \
    -c "build clean","build package"  \
    -p directory1,directory1 \
    -b /local/workplace/

**** Executing Command: 'cd /local/workplace/directory1' *****

/home/jramay/bb-slds.sh: line 6: cd /local/workplace/directory1: No such file or directory

Это работает нормально, если я не использую getopts и вместо этого инициализирую переменные, как показано ниже.

base_directory="/local/workplace/"

declare -a commands=(
  "build clean"
  "build package"  
  )

declare -a packages=(
  "directory1"
  "directory2"
  )

1 Ответ

0 голосов
/ 01 июня 2018

Это было сложно.:)

Вы изменили IFS во время цикла getopts и никогда не возвращали его к старому значению.Поэтому, когда вы пишете:

$1

в executeCommand, он не обрабатывает пробел как разделитель между cd и его аргументом.

Вам необходимо установить его обратно взначение по умолчанию после выполнения getopts:

IFS=$' \t\n'

Изменения set -f сохраняются и после getopts.Вы, вероятно, должны просто сделать это один раз перед циклом, а затем поставить

set +f

после него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...