Я написал следующий скрипт оболочки для выполнения заданного набора команд в каталоге каждого пакета.Предполагается, что остановится , если какая-либо команда не выполнится.Также должен отображаться вывод команды на консоли.
Требуется 3 аргумента с опциями
- '- b' базовый каталог пакетов
- '- c'Разделенный запятыми список команд
- '- 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"
)