#!/bin/bash # String Module # Provides string manipulation, validation, and formatting utilities module_version string 1.0.0 # String length strlen() { local str="$1" echo "${#str}" } length() { strlen "$@" } # String manipulation substr() { local str="$1" local start="$2" local length="${3:-}" if [[ -n "$length" ]]; then echo "${str:$start:$length}" else echo "${str:$start}" fi } substring() { substr "$@" } # String concatenation concat() { local result="" for str in "$@"; do result="${result}${str}" done echo "$result" } # String repetition repeat_str() { local str="$1" local count="$2" local result="" for ((i=0; i=0; i--)); do reversed="${reversed}${str:$i:1}" done echo "$reversed" } shuffle() { local str="$1" local chars=() local shuffled="" # Convert to array for ((i=0; i<${#str}; i++)); do chars+=("${str:$i:1}") done # Fisher-Yates shuffle local len=${#chars[@]} for ((i=len-1; i>0; i--)); do local j=$((RANDOM % (i + 1))) local temp="${chars[$i]}" chars[$i]="${chars[$j]}" chars[$j]="$temp" done # Convert back to string for char in "${chars[@]}"; do shuffled="${shuffled}${char}" done echo "$shuffled" } # String counting count_chars() { local str="$1" local char="$2" local count=0 for ((i=0; i<${#str}; i++)); do if [[ "${str:$i:1}" == "$char" ]]; then ((count++)) fi done echo "$count" } count() { count_chars "$@" } count_substrings() { local str="$1" local substr="$2" local count=0 local pos=0 while [[ $pos -lt ${#str} ]]; do local found=$(indexof "$str" "$substr" "$pos") if [[ "$found" -eq -1 ]]; then break fi ((count++)) pos=$((found + ${#substr})) done echo "$count" } # String formatting center() { local str="$1" local width="$2" local pad_char="${3:- }" local str_len="${#str}" if [[ "$str_len" -ge "$width" ]]; then echo "$str" return fi local total_pad=$((width - str_len)) local left_pad=$((total_pad / 2)) local right_pad=$((total_pad - left_pad)) local left_padding=$(repeat_str "$pad_char" "$left_pad") local right_padding=$(repeat_str "$pad_char" "$right_pad") echo "${left_padding}${str}${right_padding}" } # String escaping escape_regex() { local str="$1" echo "$str" | sed 's/[][\.()*?{}|^$+]/\\&/g' } escape_shell() { local str="$1" printf '%q' "$str" } escape_html() { local str="$1" local result="$str" result="${result//&/&}" result="${result///>}" result="${result//\"/"}" result="${result//'/'}" echo "$result" } unescape_html() { local str="$1" local result="$str" result="${result//&/&}" result="${result//</}" result="${result//"/\"}" result="${result//'/'}" echo "$result" } # String comparison (case-insensitive) equals_ignore_case() { local str1="$1" local str2="$2" [[ "${str1,,}" == "${str2,,}" ]] } contains_ignore_case() { local str="$1" local substr="$2" local lower_str="${str,,}" local lower_substr="${substr,,}" [[ "$lower_str" == *"$lower_substr"* ]] } # String hashing (simple) hash_string() { local str="$1" local hash=0 for ((i=0; i<${#str}; i++)); do local char_code=$(printf "%d" "'${str:$i:1}") hash=$(((hash * 31 + char_code) % 2147483647)) done echo "$hash" } # String to array conversion to_chars() { local str="$1" local -a result result=() for ((i=0; i<${#str}; i++)); do result+=("${str:$i:1}") done printf '%s\n' "${result[@]}" } to_words() { local str="$1" local -a result read -ra result <<< "$str" printf '%s\n' "${result[@]}" } # String utilities uuid() { if command -v uuidgen > /dev/null; then uuidgen elif [[ -f /proc/sys/kernel/random/uuid ]]; then cat /proc/sys/kernel/random/uuid else # Fallback: simple UUID-like string printf "%04x%04x-%04x-%04x-%04x-%04x%04x%04x" \ $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM fi } random_string() { local length="${1:-10}" local charset="${2:-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789}" local result="" for ((i=0; i