From dc65cc6abd7672139c47e721efde282391579a9d Mon Sep 17 00:00:00 2001 From: Tesi Date: Tue, 27 Jan 2026 05:42:48 +0000 Subject: [PATCH] Fix bash 3.2 compatibility: replace case conversion syntax Replace ${var^^} and ${var,,} with helper functions that use tr. These bash 4+ case conversion operators fail on macOS default bash 3.2. Changes: - Add _mt_uppercase() and _mt_lowercase() helper functions - Replace all ${var^^} with $(_mt_uppercase "$var") - Replace all ${var,,} with $(_mt_lowercase "$var") Files changed: - lib/functions.sh: 5 replacements + helper functions - lib/prompt.sh: 8 replacements Tested on macOS Tahoe (arm64) with bash 3.2.57. Co-Authored-By: Claude Opus 4.5 --- lib/functions.sh | 26 +++++++++++++++++++++----- lib/prompt.sh | 34 +++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/lib/functions.sh b/lib/functions.sh index 40fc2fb..167876b 100644 --- a/lib/functions.sh +++ b/lib/functions.sh @@ -1,6 +1,16 @@ # Set default log level if not specified : "${MT_LOG_LEVEL:=INFO}" +# Bash 3.2 compatible case conversion helpers +# These replace ${var^^} and ${var,,} which require bash 4+ +_mt_uppercase() { + echo "$1" | tr '[:lower:]' '[:upper:]' +} + +_mt_lowercase() { + echo "$1" | tr '[:upper:]' '[:lower:]' +} + # Columnise - format tab-separated output into aligned columns # Usage: command | columnise [--force] # Options: @@ -56,7 +66,9 @@ _mt_log() { local message="$*" # Convert level to number for comparison - case "${level^^}" in + local level_upper + level_upper=$(_mt_uppercase "$level") + case "$level_upper" in ERROR) level_num=0 ;; WARNING) level_num=1 ;; INFO) level_num=2 ;; @@ -65,7 +77,9 @@ _mt_log() { esac # Convert MT_LOG_LEVEL to number - case "${MT_LOG_LEVEL^^}" in + local log_level_upper + log_level_upper=$(_mt_uppercase "$MT_LOG_LEVEL") + case "$log_level_upper" in ERROR) log_level_num=0 ;; WARNING) log_level_num=1 ;; INFO) log_level_num=2 ;; @@ -78,7 +92,7 @@ _mt_log() { local color prefix # Set color and prefix based on level - case "${level^^}" in + case "$level_upper" in ERROR) color=$MT_COLOR_ERROR prefix="🚫" @@ -109,7 +123,7 @@ _mt_log() { fi # Output to appropriate stream - if [[ "${level^^}" == "ERROR" || "${level^^}" == "WARNING" ]]; then + if [[ "$level_upper" == "ERROR" || "$level_upper" == "WARNING" ]]; then printf "%b\n" "$formatted_msg" >&2 else printf "%b\n" "$formatted_msg" @@ -551,7 +565,9 @@ _mt_init_ln_command() { echo -n "Would you like to install it now? (Y)es/(N)o [N]: " read -r response - if [[ "${response,,}" == "y" || "${response,,}" == "yes" ]]; then + local response_lower + response_lower=$(_mt_lowercase "$response") + if [[ "$response_lower" == "y" || "$response_lower" == "yes" ]]; then _mt_info "Running: brew install coreutils" if brew install coreutils; then # Check again after installation diff --git a/lib/prompt.sh b/lib/prompt.sh index 1bebe46..a3a9a1a 100644 --- a/lib/prompt.sh +++ b/lib/prompt.sh @@ -24,8 +24,8 @@ _mt_confirm() { fi # Make the default option uppercase - default_upper="${default^^}" - + default_upper=$(_mt_uppercase "$default") + # Prepare prompt options (no colors) local prompt_options="(Y)eah/(N)ah/(A)bort/(D)on't ask again [${default_upper}]:" @@ -37,7 +37,9 @@ _mt_confirm() { response="${response:-$default}" # Process response - case "${response,,}" in + local response_lower + response_lower=$(_mt_lowercase "$response") + case "$response_lower" in y|yeah) return 0 ;; @@ -51,7 +53,9 @@ _mt_confirm() { # Prompt for which value to remember echo "Remember which response?" read -p "(Y)eah/(N)ah/(C)ancel: " remember - case "${remember,,}" in + local remember_lower + remember_lower=$(_mt_lowercase "$remember") + case "$remember_lower" in y|yeah) export $don_t_ask_var="yeah" _mt_info "Will automatically choose 'Yeah' for future prompts in this session" @@ -72,7 +76,9 @@ _mt_confirm() { ;; *) # For any other response, use the default - if [[ "${default,,}" == "yeah" ]]; then + local default_lower + default_lower=$(_mt_lowercase "$default") + if [[ "$default_lower" == "yeah" ]]; then return 0 else return 1 @@ -105,8 +111,8 @@ _mt_confirm_multiple() { fi # Make the default option uppercase - default_upper="${default^^}" - + default_upper=$(_mt_uppercase "$default") + # Prepare prompt options (no colors) local prompt_options="(Y)eah/(N)ah/(A)ll/(Q)uit/(D)on't ask again [${default_upper}]:" @@ -120,7 +126,9 @@ _mt_confirm_multiple() { response="${response:-$default}" # Process response - case "${response,,}" in + local response_lower + response_lower=$(_mt_lowercase "$response") + case "$response_lower" in y|yeah) return 0 ;; @@ -139,7 +147,9 @@ _mt_confirm_multiple() { echo -n "(Y)eah/(N)ah/(A)ll/(C)ancel: " read -n1 -s remember echo # Add newline after character input - case "${remember,,}" in + local remember_lower + remember_lower=$(_mt_lowercase "$remember") + case "$remember_lower" in y|yeah) export $don_t_ask_var="yeah" _mt_info "Will automatically choose 'Yeah' for future prompts in this session" @@ -165,9 +175,11 @@ _mt_confirm_multiple() { ;; *) # For any other response, use the default - if [[ "${default,,}" == "yeah" ]]; then + local default_lower + default_lower=$(_mt_lowercase "$default") + if [[ "$default_lower" == "yeah" ]]; then return 0 - elif [[ "${default,,}" == "all" ]]; then + elif [[ "$default_lower" == "all" ]]; then return 2 else return 1