Приемы написания скриптов на 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