Приемы написания скриптов на Bash

Это пример для статьи: Приемы написания скриптов в Bash


Оглавление

Библиотека функций

curPath=
cRes=
pYes=
mwSetCurPath()
{
        local a1
        a1="${curScript%/*}"
        pushd "$a1" &> /dev/null
        curPath="$(pwd)"
        popd &> /dev/null
        if [ "$curScript" != "bash" ] && [ "${curScript%/bash}" = "$curScript" ] ; then
                :
        else
                echo "Cannot determine current script name. Aborted." 1>&2
                exit 1
        fi
}
myAskYN()
{  
        local AMSURE
        if [ -n "$1" ] ; then
                read -n 1 -p "$1 (y/[a]): " AMSURE
        else
                read -n 1 AMSURE
        fi
        echo "" 1>&2
        if [ "$AMSURE" = "y" ] ; then
                return 0
        else
                return 1
        fi
}
myAskYNE()
{  
        local AMSURE
        if [ -n "$1" ] ; then
                read -n 1 -p "$1 (y/[a]): " AMSURE
        else
                read -n 1 AMSURE
        fi
        echo "" 1>&2
        if [ "$AMSURE" != "y" ] ; then
                exit
        fi
}
sayWait()
{
   local AMSURE
   [ -n "$1" ] && echo "$@" 1>&2
   read -n 1 -p "(нажмите любую клавишу для продолжения)" AMSURE
   echo "" 1>&2
}
cdAndCheck()
{
   cd "$1"
   if ! [ "$(pwd)" = "$1" ] ; then
      echo "!!Не могу встать в директорию $1 - продолжение невозможно. Выходим." 1>&2
      exit 1
   fi
}
checkDir()
{
   if ! [ -d "$1" ] ; then
      if [ -z "$2" ] ; then
         echo "!!Нет директории $1 - продолжение невозможно. Выходим." 1>&2
      else
         echo "$2" 1>&2
      fi
      exit 1
   fi
}
checkFile()
{
   if ! [ -f "$1" ] ; then
      if [ -z "$2" ] ; then
         echo "!!Нет файла $1 - продолжение невозможно. Выходим." 1>&2
      else
         echo "$2" 1>&2
      fi
      exit 1
   fi
}
checkParm()
{
   if [ -z "$1" ] ; then
                echo "!!$2. Продолжение невозможно. Выходим." 1>&2
      exit 1
   fi
}
input1()
{
        local a1
        if [ -n "$1" ] ; then
                read -p "$1" -sn 1 cRes
        else
                read -sn 1 cRes
        fi
        # Проверка допустимых выборов
        #a1="$2"
        while [ "$2" = "${2#*$cRes}" ] ; do
                read -sn 1 cRes
        done
        echo $cRes 1>&2
}
procParmS()
{
        [ -z "$2" ] && return 1
   if [ "$1" = "$2" ] ; then
                cRes="$3"
                return 0
        fi
        return 1
}
procParmL()
{
        [ -z "$1" ] && return 1
   if [ "${2#$1=}" != "$2" ] ; then
      cRes="${2#$1=}"
                return 0
        fi
        return 1
}
К оглавлению

Пример кода

#!/bin/bash
a1=./myfunc ; source "$a1" ; if [ $? -ne 0 ] ; then echo "Ошибка — нет библиотеки функций $a1" 1>&2 ; exit 1 ; fi
#while [ 1 ] ; do
#   if [ "$1" = "--yes" ] ; then
#      pYes=1
#   elif [ "${1#--source-file=}" != "$1" ] ; then
#      pSourceFile="${1#--source-file=}"
#   elif [ "$1" = "-sf" ] ; then
#               shift ; pSourceFile="$1"
#   elif [ "${1#--dest-file=}" != "$1" ] ; then
#      pDestFile="${1#--dest-file=}"
#   elif [ "$1" = "-df" ] ; then
#               shift ; pDestFile="$1"
#   elif [ -z "$1" ] ; then
#      break # Ключи кончились
#   else
#      echo "Ошибка: неизвестный ключ" 1>&2
#      exit 1
#   fi
#   shift
#done
#
#checkParm "$pSourceFile" "Не задан исходный файл"
#checkParm "$pDestFile" "Не задан выходной файл"
#
#if [ "$pYes" != "1" ] ; then
#       myAskYNE "Ты уверен, что хочешь запустить это?"
#fi
#echo "source=$pSourceFile, destination=$pDestFile"
#
while [ 1 ] ; do
   if [ "$1" = "--yes" ] ; then
      pYes=1
   elif procParmS "-sf" "$1" "$2" ; then
                pSourceFile="$cRes" ; shift
   elif procParmL "--source-file" "$1" ; then
                pSourceFile="$cRes"
   elif procParmS "-df" "$1" "$2" ; then
                pDestFile="$cRes" ; shift
   elif procParmL "--dest-file" "$1" ; then
                pDestFile="$cRes"
   elif [ -z "$1" ] ; then
      break # Ключи кончились
   else
      echo "Ошибка: неизвестный ключ" 1>&2
      exit 1
   fi
   shift
done
checkParm "$pSourceFile" "Не задан исходный файл"
checkParm "$pDestFile" "Не задан выходной файл"
if [ "$pYes" != "1" ] ; then
        myAskYNE "Ты уверен, что хочешь запустить это?"
fi
echo "source=$pSourceFile, destination=$pDestFile"
#cat <<'EOF'
#Выбери желаемое действие:
#------------------------
#   a) Действие 1
#   b) Действие 2
#   .) Выход
#EOF
#input1 "Твой выбор: " "ab."
#echo "Выбор был: $cRes"
К оглавлению
  • Soft Space SIA
    Latvia
  • Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  • +371 25 46 42 49