Приемы написания скриптов на 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
Big-IP Edge Client openconnect client cisco secure client download netextender download for mac wisenet viewer download admanager plus download globalprotect download citrix secure access watchguard ssl vpn download Qfinder Pro fortinet vpn forticlient mac