В bash goto не существует, но есть возможность его симулировать через функцию.
Скрипт создающий 3 вложенных директории или откатывающий действия при ошибке под катом#!/bin/bash
#Variable for folders
vVarPath1=/home/username
vVarPath2=/home/username/1
vVarPath3=/home/username/1/2
vDebug="ls -lR $vVarPath1 | grep username"
rollback () {
#arg $1 : rollback point
#arg $2 : if unset then normal state otherwise exit script with message
#arg $3 : recursion level
#named action when "1" like :label1
if [[ "$1" -eq "1" ]]; then
rm -r "$vVarPath1"
fi
#named action when "2" like :label2
if [[ "$1" -eq "2" ]]; then
rm -r "$vVarPath2"
rollback $1-1 "$2" "$1"
fi
#named action like :label3
if [[ "$1" -eq "3" ]]; then
rm -r "$vVarPath3"
rollback $1-1 "$2" "$1"
fi
#no errors mode
if [[ -z "$2" && -z "$3" ]]; then
return $1
fi
#exit with error mode
if [[ -n "$2" && -z "$3" ]]; then
echo Exit with error: $2
exit $1
fi
}
#try make first directory otherwise exit
echo Step 1
mkdir $vVarPath1 || exit 1
eval "$vDebug"
echo Step 2
#We do not exit because arg 2 is unset
mkdir $vVarPath3 || rollback "1"
echo Look at directory
eval "$vDebug"
echo Its empty because rollback executed
echo Step 3
mkdir $vVarPath1 || exit 1
mkdir $vVarPath2 || rollback "1" "Unable create $vVarPath2"
mkdir $vVarPath3 || rollback "2" "Unable create $vVarPath3"
echo Before rollback
eval "$vDebug"
rollback "3"
echo After rollback
eval "$vDebug"
exit 0
Функция rollback логически состоит из трех секций:
1) Именованные действия вызывающие последовательно предшествующие если таковые есть
2) return если вызов происходил без ошибки
3) exit если была ошибка
Пример вывода результата скрипта:
Step 1
/home/username:
Step 2
mkdir: cannot create directory ‘/home/username/1/2’: No such file or directory
Look at directory
ls: cannot access /home/username: No such file or directory
Its empty because rollback executed
Step 3
Before rollback
/home/username:
/home/username/1:
/home/username/1/2:
After rollback
ls: cannot access /home/username: No such file or directory