Skip to content
Snippets Groups Projects

Ask all questions at the beginning wrt #177

Merged Julian Ospald requested to merge issue-177 into master
2 files
+ 429
234
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 335
190
@@ -5,8 +5,12 @@
@@ -5,8 +5,12 @@
# * BOOTSTRAP_HASKELL_NO_UPGRADE - any nonzero value to not trigger the upgrade
# * BOOTSTRAP_HASKELL_NO_UPGRADE - any nonzero value to not trigger the upgrade
# * GHCUP_USE_XDG_DIRS - any nonzero value to respect The XDG Base Directory Specification
# * GHCUP_USE_XDG_DIRS - any nonzero value to respect The XDG Base Directory Specification
# * BOOTSTRAP_HASKELL_VERBOSE - any nonzero value for more verbose installation
# * BOOTSTRAP_HASKELL_VERBOSE - any nonzero value for more verbose installation
# * BOOTSTRAP_HASKELL_GHC_VERSION
# * BOOTSTRAP_HASKELL_GHC_VERSION - the ghc version to install
# * BOOTSTRAP_HASKELL_CABAL_VERSION
# * BOOTSTRAP_HASKELL_CABAL_VERSION - the cabal version to install
 
# * BOOTSTRAP_HASKELL_INSTALL_STACK - whether to install latest stack
 
# * BOOTSTRAP_HASKELL_INSTALL_HLS - whether to install latest hls
 
# * BOOTSTRAP_HASKELL_ADJUST_BASHRC - whether to adjust PATH in bashrc (prepend)
 
# * BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG - whether to adjust mingw paths in cabal.config on windows
# License: LGPL-3.0
# License: LGPL-3.0
@@ -19,6 +23,8 @@ arch=$(uname -m)
@@ -19,6 +23,8 @@ arch=$(uname -m)
ghver="0.1.15.2"
ghver="0.1.15.2"
base_url="https://downloads.haskell.org/~ghcup"
base_url="https://downloads.haskell.org/~ghcup"
 
export GHCUP_SKIP_UPDATE_CHECK=yes
 
case "${plat}" in
case "${plat}" in
MSYS*|MINGW*)
MSYS*|MINGW*)
: "${GHCUP_INSTALL_BASE_PREFIX:=/c}"
: "${GHCUP_INSTALL_BASE_PREFIX:=/c}"
@@ -60,6 +66,28 @@ warn() {
@@ -60,6 +66,28 @@ warn() {
esac
esac
}
}
 
yellow() {
 
case "${plat}" in
 
MSYS*|MINGW*)
 
echo -e "\\033[0;33m$1\\033[0m"
 
;;
 
*)
 
printf "\\033[0;33m%s\\033[0m\\n" "$1"
 
;;
 
esac
 
}
 
 
green() {
 
case "${plat}" in
 
MSYS*|MINGW*)
 
echo -e "\\033[0;32m$1\\033[0m"
 
;;
 
*)
 
printf "\\033[0;32m%s\\033[0m\\n" "$1"
 
;;
 
esac
 
}
 
edo() {
edo() {
"$@" || die "\"$*\" failed!"
"$@" || die "\"$*\" failed!"
}
}
@@ -80,40 +108,42 @@ _eghcup() {
@@ -80,40 +108,42 @@ _eghcup() {
}
}
_done() {
_done() {
 
echo
 
echo "==============================================================================="
case "${plat}" in
case "${plat}" in
MSYS*|MINGW*)
MSYS*|MINGW*)
echo
green
echo "All done!"
green "All done!"
echo
green
echo "In a new powershell or cmd.exe session, now you can..."
green "In a new powershell or cmd.exe session, now you can..."
echo
green
echo "Start a simple repl via:"
green "Start a simple repl via:"
echo " ghci"
green " ghci"
echo
green
echo "Start a new haskell project in the current directory via:"
green "Start a new haskell project in the current directory via:"
echo " cabal init --interactive"
green " cabal init --interactive"
echo
green
echo "Install other GHC versions and tools via:"
green "Install other GHC versions and tools via:"
echo " ghcup list"
green " ghcup list"
echo " ghcup install <tool> <version>"
green " ghcup install <tool> <version>"
echo
green
echo "To install system libraries and update msys2/mingw64,"
green "To install system libraries and update msys2/mingw64,"
echo "open the \"Mingw haskell shell\""
green "open the \"Mingw haskell shell\""
echo "and the \"Mingw package management docs\""
green "and the \"Mingw package management docs\""
echo "desktop shortcuts."
green "desktop shortcuts."
;;
;;
*)
*)
echo
green
echo "All done!"
green "All done!"
echo
green
echo "To start a simple repl, run:"
green "To start a simple repl, run:"
echo " ghci"
green " ghci"
echo
green
echo "To start a new haskell project in the current directory, run:"
green "To start a new haskell project in the current directory, run:"
echo " cabal init --interactive"
green " cabal init --interactive"
echo
green
echo "To install other GHC versions and tools, run:"
green "To install other GHC versions and tools, run:"
echo " ghcup tui"
green " ghcup tui"
;;
;;
esac
esac
@@ -213,7 +243,9 @@ download_ghcup() {
@@ -213,7 +243,9 @@ download_ghcup() {
eghcup upgrade
eghcup upgrade
}
}
adjust_bashrc() {
# Figures out the users login shell and sets
 
# GHCUP_PROFILE_FILE and MY_SHELL variables.
 
find_shell() {
case $SHELL in
case $SHELL in
*/zsh) # login shell is zsh
*/zsh) # login shell is zsh
GHCUP_PROFILE_FILE="$HOME/.zshrc"
GHCUP_PROFILE_FILE="$HOME/.zshrc"
@@ -237,75 +269,38 @@ adjust_bashrc() {
@@ -237,75 +269,38 @@ adjust_bashrc() {
MY_SHELL="fish" ;;
MY_SHELL="fish" ;;
*) return ;;
*) return ;;
esac
esac
 
}
# Ask user if they want to adjust the bashrc.
warn ""
ask_bashrc() {
warn "Detected ${MY_SHELL} shell on your system..."
if [ -n "${BOOTSTRAP_HASKELL_ADJUST_BASHRC}" ] ; then
warn "Do you want ghcup to automatically add the required PATH variable to \"${GHCUP_PROFILE_FILE}\"?"
return 1
warn ""
fi
warn "[P] Yes, prepend [A] Yes, append [N] No [?] Help (default is \"P\")."
warn ""
while true; do
while true; do
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
read -r next_answer </dev/tty
echo "-------------------------------------------------------------------------------"
 
 
warn ""
 
warn "Detected ${MY_SHELL} shell on your system..."
 
warn "Do you want ghcup to automatically add the required PATH variable to \"${GHCUP_PROFILE_FILE}\"?"
 
warn ""
 
warn "[P] Yes, prepend [A] Yes, append [N] No [?] Help (default is \"P\")."
 
warn ""
 
 
read -r bashrc_answer </dev/tty
else
else
next_answer="prepend"
return 1
fi
fi
case $bashrc_answer in
case $next_answer in
[Pp]* | "")
[Pp]* | "")
cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file"
return 1
export PATH="\$HOME/.cabal/bin:${GHCUP_BIN}:\$PATH"
EOF
;;
;;
[Aa]*)
[Aa]*)
cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file"
return 2
export PATH="\$HOME/.cabal/bin:\$PATH:${GHCUP_BIN}"
EOF
;;
;;
*) ;;
esac
case $next_answer in
[Nn]*)
[Nn]*)
return ;;
return 0;;
[Pp]* | [Aa]* | "")
case $MY_SHELL in
"") break ;;
fish)
mkdir -p "${GHCUP_PROFILE_FILE%/*}"
sed -i -e '/# ghcup-env$/ s/^#*/#/' "${GHCUP_PROFILE_FILE}"
case $next_answer in
[Pp]* | "")
echo "set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX \$HOME ; set -gx PATH \$HOME/.cabal/bin $GHCUP_BIN \$PATH # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
;;
[Aa]*)
echo "set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX \$HOME ; set -gx PATH \$HOME/.cabal/bin \$PATH $GHCUP_BIN # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
;;
esac
break ;;
bash)
sed -i -e '/# ghcup-env$/ s/^#*/#/' "${GHCUP_PROFILE_FILE}"
echo "[ -f \"${GHCUP_DIR}/env\" ] && source \"${GHCUP_DIR}/env\" # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
case "${plat}" in
"Darwin"|"darwin")
if ! grep -q "ghcup-env" "${HOME}/.bash_profile" ; then
echo "[[ -f ~/.bashrc ]] && source ~/.bashrc # ghcup-env" >> "${HOME}/.bash_profile"
fi
;;
esac
break ;;
zsh)
sed -i -e '/# ghcup-env$/ s/^#*/#/' "${GHCUP_PROFILE_FILE}"
echo "[ -f \"${GHCUP_DIR}/env\" ] && source \"${GHCUP_DIR}/env\" # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
break ;;
esac
warn "OK! ${GHCUP_PROFILE_FILE} has been modified. Restart your terminal for the changes to take effect,"
warn "or type \"source ${GHCUP_DIR}/env\" to apply them in your current terminal session."
return
;;
*)
*)
echo "Possible choices are:"
echo "Possible choices are:"
echo
echo
@@ -317,8 +312,216 @@ adjust_bashrc() {
@@ -317,8 +312,216 @@ adjust_bashrc() {
;;
;;
esac
esac
done
done
 
 
unset bashrc_answer
}
}
 
# Needs 'find_shell' to be called beforehand.
 
adjust_bashrc() {
 
case $1 in
 
1)
 
cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file"
 
export PATH="\$HOME/.cabal/bin:${GHCUP_BIN}:\$PATH"
 
EOF
 
;;
 
2)
 
cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file"
 
export PATH="\$HOME/.cabal/bin:\$PATH:${GHCUP_BIN}"
 
EOF
 
;;
 
*) ;;
 
esac
 
 
case $1 in
 
1 | 2)
 
case $MY_SHELL in
 
"") break ;;
 
fish)
 
mkdir -p "${GHCUP_PROFILE_FILE%/*}"
 
sed -i -e '/# ghcup-env$/ s/^#*/#/' "${GHCUP_PROFILE_FILE}"
 
case $1 in
 
1)
 
echo "set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX \$HOME ; set -gx PATH \$HOME/.cabal/bin $GHCUP_BIN \$PATH # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
 
;;
 
2)
 
echo "set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX \$HOME ; set -gx PATH \$HOME/.cabal/bin \$PATH $GHCUP_BIN # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
 
;;
 
esac
 
break ;;
 
bash)
 
sed -i -e '/# ghcup-env$/ s/^#*/#/' "${GHCUP_PROFILE_FILE}"
 
echo "[ -f \"${GHCUP_DIR}/env\" ] && source \"${GHCUP_DIR}/env\" # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
 
case "${plat}" in
 
"Darwin"|"darwin")
 
if ! grep -q "ghcup-env" "${HOME}/.bash_profile" ; then
 
echo "[[ -f ~/.bashrc ]] && source ~/.bashrc # ghcup-env" >> "${HOME}/.bash_profile"
 
fi
 
;;
 
esac
 
break ;;
 
 
zsh)
 
sed -i -e '/# ghcup-env$/ s/^#*/#/' "${GHCUP_PROFILE_FILE}"
 
echo "[ -f \"${GHCUP_DIR}/env\" ] && source \"${GHCUP_DIR}/env\" # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
 
break ;;
 
esac
 
warn "OK! ${GHCUP_PROFILE_FILE} has been modified. Restart your terminal for the changes to take effect,"
 
warn "or type \"source ${GHCUP_DIR}/env\" to apply them in your current terminal session."
 
return
 
;;
 
*)
 
;;
 
esac
 
}
 
 
adjust_cabal_config() {
 
edo cabal user-config -a "extra-prog-path: $(cygpath -w "$GHCUP_BIN"), $(cygpath -w "$HOME"/AppData/Roaming/cabal/bin), $(cygpath -w "$GHCUP_MSYS2"/usr/bin), $(cygpath -w "$GHCUP_MSYS2"/mingw64/bin)" -a "extra-include-dirs: $(cygpath -w "$GHCUP_MSYS2"/mingw64/include)" -a "extra-lib-dirs: $(cygpath -w "$GHCUP_MSYS2"/mingw64/lib)" -f init
 
}
 
 
ask_cabal_config_init() {
 
case "${plat}" in
 
MSYS*|MINGW*)
 
if [ -n "${BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG}" ] ; then
 
return 1
 
fi
 
 
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
 
echo "-------------------------------------------------------------------------------"
 
warn "Create an initial cabal.config including relevant msys2 paths (recommended)?"
 
warn "[Y] Yes [N] No [?] Help (default is \"Y\")."
 
echo
 
while true; do
 
read -r mingw_answer </dev/tty
 
 
case $mingw_answer in
 
[Yy]* | "")
 
return 1 ;;
 
[Nn]*)
 
return 0 ;;
 
*)
 
echo "Possible choices are:"
 
echo
 
echo "Y - Yes, create a cabal.config with pre-set paths to msys2/mingw64 (default)"
 
echo "N - No, leave the current/default cabal config untouched"
 
echo
 
echo "Please make your choice and press ENTER."
 
;;
 
esac
 
done
 
else
 
return 1
 
fi
 
;;
 
esac
 
 
unset mingw_answer
 
 
return 0
 
}
 
 
do_cabal_config_init() {
 
case "${plat}" in
 
MSYS*|MINGW*)
 
case $1 in
 
1)
 
adjust_cabal_config
 
;;
 
0)
 
echo "Make sure that your global cabal.config references the correct mingw64 paths (extra-prog-path, extra-include-dirs and extra-lib-dirs)."
 
echo "And set the environment variable GHCUP_MSYS2 to the root path of your msys2 installation."
 
sleep 5
 
return ;;
 
*) ;;
 
esac
 
esac
 
}
 
 
ask_hls() {
 
if [ -n "${BOOTSTRAP_HASKELL_INSTALL_HLS}" ] ; then
 
return 1
 
fi
 
 
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
 
echo "-------------------------------------------------------------------------------"
 
 
warn "Do you want to install haskell-language-server (HLS)?"
 
warn "HLS is a language-server that provides IDE-like functionality"
 
warn "and can integrate with different editors, such as Vim, Emacs, VS Code, Atom, ..."
 
warn "Also see https://github.com/haskell/haskell-language-server/blob/master/README.md"
 
warn ""
 
warn "[Y] Yes [N] No [?] Help (default is \"N\")."
 
warn ""
 
 
while true; do
 
read -r hls_answer </dev/tty
 
 
case $hls_answer in
 
[Yy]*)
 
return 1
 
;;
 
[Nn]* | "")
 
return 0
 
;;
 
*)
 
echo "Possible choices are:"
 
echo
 
echo "Y - Yes, install the haskell-langauge-server"
 
echo "N - No, don't install anything more (default)"
 
echo
 
echo "Please make your choice and press ENTER."
 
;;
 
esac
 
done
 
else
 
return 0
 
fi
 
 
unset hls_answer
 
}
 
 
ask_stack() {
 
if [ -n "${BOOTSTRAP_HASKELL_INSTALL_STACK}" ] ; then
 
return 1
 
fi
 
 
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
 
echo "-------------------------------------------------------------------------------"
 
 
warn "Do you want to install stack?"
 
warn "Stack is a haskell build tool similar to cabal that is used by some projects."
 
warn "Also see https://docs.haskellstack.org/"
 
warn ""
 
warn "[Y] Yes [N] No [?] Help (default is \"N\")."
 
warn ""
 
 
while true; do
 
read -r stack_answer </dev/tty
 
 
case $stack_answer in
 
[Yy]*)
 
return 1 ;;
 
[Nn]* | "")
 
return 0 ;;
 
*)
 
echo "Possible choices are:"
 
echo
 
echo "Y - Yes, install stack"
 
echo "N - No, don't install anything more (default)"
 
echo
 
echo "Please make your choice and press ENTER."
 
;;
 
esac
 
done
 
else
 
return 0
 
fi
 
 
unset stack_answer
 
}
 
 
 
find_shell
 
echo
echo
echo "Welcome to Haskell!"
echo "Welcome to Haskell!"
@@ -350,12 +553,20 @@ echo
@@ -350,12 +553,20 @@ echo
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
warn "Press ENTER to proceed or ctrl-c to abort."
warn "Press ENTER to proceed or ctrl-c to abort."
warn "Note that this script can be re-run at any given time."
warn "Note that this script can be re-run at any given time."
echo
# Wait for user input to continue.
# Wait for user input to continue.
# shellcheck disable=SC2034
# shellcheck disable=SC2034
read -r answer </dev/tty
read -r answer </dev/tty
fi
fi
 
ask_bashrc
 
ask_bashrc_answer=$?
 
ask_cabal_config_init
 
ask_cabal_config_init_answer=$?
 
ask_hls
 
ask_hls_answer=$?
 
ask_stack
 
ask_stack_answer=$?
 
edo mkdir -p "${GHCUP_BIN}"
edo mkdir -p "${GHCUP_BIN}"
if command -V "ghcup" >/dev/null 2>&1 ; then
if command -V "ghcup" >/dev/null 2>&1 ; then
@@ -385,118 +596,52 @@ eghcup --cache install ghc "${BOOTSTRAP_HASKELL_GHC_VERSION}"
@@ -385,118 +596,52 @@ eghcup --cache install ghc "${BOOTSTRAP_HASKELL_GHC_VERSION}"
eghcup set ghc "${BOOTSTRAP_HASKELL_GHC_VERSION}"
eghcup set ghc "${BOOTSTRAP_HASKELL_GHC_VERSION}"
eghcup --cache install cabal "${BOOTSTRAP_HASKELL_CABAL_VERSION}"
eghcup --cache install cabal "${BOOTSTRAP_HASKELL_CABAL_VERSION}"
adjust_cabal_config() {
do_cabal_config_init $ask_cabal_config_init_answer
edo cabal user-config -a "extra-prog-path: $(cygpath -w "$GHCUP_BIN"), $(cygpath -w "$HOME"/AppData/Roaming/cabal/bin), $(cygpath -w "$GHCUP_MSYS2"/usr/bin), $(cygpath -w "$GHCUP_MSYS2"/mingw64/bin)" -a "extra-include-dirs: $(cygpath -w "$GHCUP_MSYS2"/mingw64/include)" -a "extra-lib-dirs: $(cygpath -w "$GHCUP_MSYS2"/mingw64/lib)" -f init
}
case "${plat}" in
MSYS*|MINGW*)
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
warn "Create an initial cabal.config including relevant msys2 paths (recommended)?"
warn "[Y] Yes [N] No [?] Help (default is \"Y\")."
echo
while true; do
read -r mingw_answer </dev/tty
case $mingw_answer in
[Yy]* | "")
adjust_cabal_config
break ;;
[Nn]*)
echo "Make sure that your global cabal.config references the correct mingw64 paths (extra-prog-path, extra-include-dirs and extra-lib-dirs)."
echo "And set the environment variable GHCUP_MSYS2 to the root path of your msys2 installation."
sleep 5
break ;;
*)
echo "Possible choices are:"
echo
echo "Y - Yes, create a cabal.config with pre-set paths to msys2/mingw64 (default)"
echo "N - No, leave the current/default cabal config untouched"
echo
echo "Please make your choice and press ENTER."
;;
esac
done
else
adjust_cabal_config
fi
;;
esac
edo cabal new-update
edo cabal new-update
 
case $ask_hls_answer in
 
1)
 
_eghcup --cache install hls || warn "HLS installation failed, continuing anyway"
 
;;
 
*) ;;
 
esac
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
case $ask_stack_answer in
warn "Do you want to install haskell-language-server (HLS) now?"
1)
warn "HLS is a language-server that provides IDE-like functionality"
_eghcup --cache install stack || warn "Stack installation failed, continuing anyway"
warn "and can integrate with different editors, such as Vim, Emacs, VS Code, Atom, ..."
;;
warn "Also see https://github.com/haskell/haskell-language-server/blob/master/README.md"
*) ;;
warn ""
esac
warn "[Y] Yes [N] No [?] Help (default is \"N\")."
warn ""
while true; do
read -r hls_answer </dev/tty
case $hls_answer in
[Yy]*)
_eghcup --cache install hls || warn "HLS installation failed, continuing anyway"
break ;;
[Nn]* | "")
break ;;
*)
echo "Possible choices are:"
echo
echo "Y - Yes, install the haskell-langauge-server"
echo "N - No, don't install anything more (default)"
echo
echo "Please make your choice and press ENTER."
;;
esac
done
warn "Do you want to install stack now?"
warn "Stack is a haskell build tool similar to cabal that is used by some projects."
warn "Also see https://docs.haskellstack.org/"
warn ""
warn "[Y] Yes [N] No [?] Help (default is \"N\")."
warn ""
while true; do
read -r stack_answer </dev/tty
case $stack_answer in
[Yy]*)
_eghcup --cache install stack || warn "Stack installation failed, continuing anyway"
break ;;
[Nn]* | "")
break ;;
*)
echo "Possible choices are:"
echo
echo "Y - Yes, install stack"
echo "N - No, don't install anything more (default)"
echo
echo "Please make your choice and press ENTER."
;;
esac
done
fi
# short-circuit script based on platform
# short-circuit script based on platform
case "${plat}" in
case "${plat}" in
MSYS*|MINGW*)
MSYS*|MINGW*)
# For windows we always adjust bashrc, since it's inside msys2
# For windows we always adjust bashrc, since it's inside msys2
adjust_bashrc
adjust_bashrc $adjust_bashrc_answer
;;
;;
*)
*)
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
echo "In order to run ghc and cabal, you need to adjust your PATH variable."
case $ask_bashrc_answer in
echo "You may want to source '$GHCUP_DIR/env' in your shell"
1 | 2)
echo "configuration to do so (e.g. ~/.bashrc)."
echo
echo "==============================================================================="
adjust_bashrc
echo
 
yellow "In order to run ghc and cabal, start a new shell or"
 
yellow "run 'source $GHCUP_DIR/env' in your current shell session."
 
adjust_bashrc $adjust_bashrc_answer
 
;;
 
*)
 
echo
 
echo "==============================================================================="
 
echo
 
yellow "In order to run ghc and cabal, you need to adjust your PATH variable."
 
yellow "You may want to source '$GHCUP_DIR/env' in your shell"
 
yellow "configuration to do so (e.g. ~/.bashrc)."
 
;;
 
esac
fi
fi
;;
;;
esac
esac
Loading