Article 57J5G [SOLVED] Bash script select loop does not pause for user input as expected.

[SOLVED] Bash script select loop does not pause for user input as expected.

by
DoorDaesh
from LinuxQuestions.org on (#57J5G)
I have a bash script which contains this select loop:
Code:echo 'Are the above scripts safe?'
select answer in Build Skip; do
case "$answer" in
Build)
build_and_add_package "$1"
break
;;
Skip)
echo "Skipping build."
break
;;
*)
echo "Invalid selection."
;;
esac
doneBut when the execution reaches that section, it doesn't wait for user input; it gets stuck in an infinite loop like this:

Code:Are the above scripts safe?
1) Build
2) Skip
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#? Invalid selection.
#? Invalid selection.
#? 1) Build
2) Skip
#?WTF?

Here is the entire script for context:

Code:#!/bin/bash
###################################################################################################

repo_name='localrepo'
repo_conf_file='/home/me/Backup/localrepo.conf'
pkg_signing_key='localrepo'
repo_dir='/var/opt'
AUR_dir='/opt/AUR'
pkg_dir='/opt/pkg'

yellow='\033[38;5;11m'
purple='\033[38;5;13m'
no_color=$(tput sgr0)
danger_code_header_color="$yellow"
danger_code_body_color="$purple"
hr='###################################################################################################'
countdown=20

###################################################################################################

blecho() {
echo ""
echo "<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>"
echo "[${0##*/}] INFO: $1"
echo "<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>"
echo ""
}

die() {
blecho "$1" & exit 1
}

## arg1 database name
look_for_outofdate_pkgs() {
attention=name_next
while read line; do
case "$attention" in
name_next)
[[ "$line" == '%NAME%' ]] && attention=name
;;
name)
name="$line"
attention=version_next
;;
version_next)
[[ "$line" == '%VERSION%' ]] && attention=version
;;
version)
version="$line"
analyze_db_entry "$name" "$version"
attention=name_next
;;
esac
done < "$1"
}

## arg1 package name
## arg2 package version
analyze_db_entry() {
[[ "${AURs[@]}" =~ "$1" ]] && AUR_hit=true || AUR_hit=false
[[ "${pkgs[@]}" =~ "$1" ]] && pkg_hit=true || pkg_hit=false
[[ "$AUR_hit" == true && "$pkg_hit" == true ]] && die "ERROR: Custom package name collision."
if [[ "$AUR_hit" == false && "$pkg_hit" == false ]]; then
blecho "$1 will be removed from the database."
repo-remove -v -s -k "$pkg_signing_key" "$repo_dir/$repo_name.db.tar" "$1" || blecho "Error removing $1 from database."
else
[[ "$AUR_hit" == true ]] && update_AUR "$1"
[[ "$pkg_hit" == true ]] && update_pkg "$1"
[[ -n "$epoch" ]] && latestversion="$epoch:$pkgver-$pkgrel" || latestversion="$pkgver-$pkgrel"
if [[ "$2" == "$latestversion" ]]; then
echo "$1 $2 is up to date."
else
blecho "$1 $2 is out of date. The latest version is $latestversion."
[[ "$AUR_hit" == true ]] && interactive_safety_check_before_build "$AUR_dir/$1"
[[ "$pkg_hit" == true ]] && build_and_add_package "$pkg_dir/$1"
fi
fi
}

update_AUR() {
cd "$AUR_dir"
if [[ ! -d "$1" ]]; then
git clone "https://aur.archlinux.org/$1.git"
else
cd "$1"
git pull --rebase=false origin master &> /dev/null
fi
unset -v pname epoch pkgname pkgver esc_pkgver pkgrel
. "$AUR_dir/$1/PKGBUILD"
}

update_pkg() {
unset -v pname epoch pkgname pkgver esc_pkgver pkgrel
. "$pkg_dir/$1/PKGBUILD"
}

interactive_safety_check_before_build() {
cd "$1"
echo -e "$danger_code_header_color"
echo "$hr"
echo "# $pkgname PKGBUILD"
echo "$hr"
echo -ne ""$danger_code_body_color""
cat PKGBUILD
echo -ne ""$danger_code_header_color""
if [[ -f *.install ]]; then
install_filename=$(*.install)
echo "$hr"
echo "# $pkgname $install_filename"
echo "$hr"
echo -ne "$danger_code_header_color"
cat "$install_filename"
fi
echo "$hr"
echo -e "$no_color"
echo 'Are the above scripts safe?'
select answer in Build Skip; do
case "$answer" in
Build)
build_and_add_package "$1"
break
;;
Skip)
echo "Skipping build."
break
;;
*)
echo "Invalid selection."
;;
esac
done
}

## Need to run update_{AUR,pkg} beforehand
build_and_add_package() {
cd "$1"
## Check if pkg already exists
esc_pkgver="$(echo "$pkgver" | sed 's/[^-A-Za-z0-9_]/\\&/g')"
pname=$(find . -maxdepth 1 -regex "\.\/$pkgname.*$esc_pkgver-$pkgrel.*\.pkg\.tar\.\(xz\|zst\)$")
if [[ -z "$pname" ]]; then
blecho "Commencing build of $pkgname."
if makepkg -sc --sign --key "$pkg_signing_key" --noconfirm; then
pname=$(find . -maxdepth 1 -regex "\.\/$pkgname.*$esc_pkgver-$pkgrel.*\.pkg\.tar\.\(xz\|zst\)$")
if [[ -z "$pname" ]]; then
blecho "Can't find the package file for $pkgname."
return 1
fi
else
blecho "Build of $pkgname version $pkgver-$pkgrel failed."
return 1
fi
fi
if repo-add -n -v -s -k "$pkg_signing_key" "$repo_dir/$repo_name.db.tar" "$pname"; then
blecho "$1 version $pkgver-$pkgrel has been added to the database."
mv "$pname" "$repo_dir" || blecho "Failed to move $pname."
mv "$pname.sig" "$repo_dir" || blecho "Failed to move $pname.sig."
else
blecho "Failed to add $pname to repository."
fi
}

## arg1 package name
## arg2 database name
is_it_in_the_db() {
attention=name_next
while read line; do
case "$attention" in
name_next)
[[ "$line" == '%NAME%' ]] && attention=name
;;
name)
[[ "$line" == "$1" ]] && return 0 || attention=name_next
;;
esac
done < "$2"
return 1
}

###################################################################################################

[[ $EUID -eq 0 ]] && die "This script cannot be run as root."

check-mounts || die "Error: something isn't mounted."

[[ -f "$repo_conf_file" ]] || die "Repository configuration file not found."

if [[ ! -d "$AUR_dir" ]]; then
sudo mkdir "$AUR_dir"
sudo chown $USER:$USER "$AUR_dir"
fi

## Read the repo configuration file to get the list of AURs
AURs=()
attention=false
while read line; do
if [[ -n "$line" ]] && [[ "${line::1}" != '#' ]]; then
AURs+=("$line")
fi
done < "$repo_conf_file"

## Look for custom packages
cd "$pkg_dir"
pkgs=(*)

## Make a copy of the database to parse
db_copy=$(mktemp)
cat "$repo_dir/$repo_name.db" >> "$db_copy"

echo "Looking for any packages that need to be updated..."
look_for_outofdate_pkgs "$db_copy"

echo "Looking for any AURs that need to be added..."
for a in "${AURs[@]}"; do
## Look for packages not in the database
if ! is_it_in_the_db "$a" "$db_copy"; then
update_AUR "$a"
interactive_safety_check_before_build "$AUR_dir/$a"
fi
done

echo "Looking for any custom packages that need to be added..."
for p in "${pkgs[@]}"; do
## Look for packages not in the database
if ! is_it_in_the_db "$p" "$db_copy"; then
update_pkg "$p"
build_and_add_package "$pkg_dir/$p"
fi
done

echo "Looking for any extraneous directories in $AUR_dir to clean up..."
cd "$AUR_dir"
AUR_subdirs=(*)
for a in "${AUR_subdirs[@]}"; do
if [[ ! "${AURs[@]}" =~ "$a" ]]; then
echo "Removing the $a AUR directory."
rm -rf "$a"
fi
done

echo "Looking for any extraneous packages in $repo_dir to clean up..."
cd "$repo_dir"
repofiles=(*)
for f in "${repofiles[@]}"; do
## Skip metadata files by ignoring files beginning with the repository name
if [[ "${f:0:9}" != "$repo_name" ]]; then
## Remove any .sig extension
if [[ "${f:(-4)}" == '.sig' ]]; then
f2="${f/.sig/}"
else
f2="$f"
fi
## Look for files not in the database
if ! cat "$repo_dir/$repo_name.db" | grep -q "$f2"; then
echo "Removing $f from the repository directory."
rm "$f"
fi
fi
done

blecho "Finished updating $repo_name."latest?d=yIl2AUoC8zA latest?i=rBfhyAGSvDI:d1-V5Tqvp3w:F7zBnMy latest?i=rBfhyAGSvDI:d1-V5Tqvp3w:V_sGLiP latest?d=qj6IDK7rITs latest?i=rBfhyAGSvDI:d1-V5Tqvp3w:gIN9vFwrBfhyAGSvDI
External Content
Source RSS or Atom Feed
Feed Location https://feeds.feedburner.com/linuxquestions/latest
Feed Title LinuxQuestions.org
Feed Link https://www.linuxquestions.org/questions/
Reply 0 comments