乐闻世界logo
搜索文章和话题

What are the common string operations in Shell scripts? How to perform string concatenation, slicing, and replacement?

3月6日 21:33

Common string operations in Shell scripts include concatenation, slicing, replacement, comparison, and length calculation.

String Definition

Basic Definition

bash
# Define strings str1="Hello World" str2='Hello World' str3=Hello # Multi-line string str4="Line 1 Line 2 Line 3"

String Concatenation

Simple Concatenation

bash
# Direct concatenation str1="Hello" str2="World" str3=$str1" "$str2 echo $str3 # Output: Hello World # Use quotes str4="${str1} ${str2}" echo $str4 # Output: Hello World # Multiple string concatenation str5="Hello" " " "World" echo $str5 # Output: Hello World

Dynamic Concatenation

bash
# Concatenate variables and text name="John" greeting="Hello, $name!" echo $greeting # Output: Hello, John! # Concatenate command output date_str="Current date: $(date)" echo $date_str # Concatenate array elements arr=("apple" "banana" "cherry") str="${arr[0]}, ${arr[1]}, ${arr[2]}" echo $str # Output: apple, banana, cherry

String Length

Calculate Length

bash
# Calculate string length str="Hello World" echo ${#str} # Output: 11 # Use expr expr length "$str" # Output: 11 # Use awk echo "$str" | awk '{print length}'

String Slicing

Basic Slicing

bash
str="Hello World" # Slice from specified position echo ${str:0} # Output: Hello World echo ${str:6} # Output: World # Slice specified length from position echo ${str:0:5} # Output: Hello echo ${str:6:5} # Output: World # Slice from end echo ${str: -5} # Output: World echo ${str: -5:3} # Output: Wor

Delete Substrings

bash
str="Hello World" # Delete shortest matching prefix echo ${str#He} # Output: llo World echo ${str#*o} # Output: World # Delete longest matching prefix echo ${str##*o} # Output: rld # Delete shortest matching suffix echo ${str%ld} # Output: Hello Wor echo ${str%o*} # Output: Hello W # Delete longest matching suffix echo ${str%%o*} # Output: Hell

Extract Filename and Path

bash
filepath="/path/to/file.txt" # Extract filename filename=${filepath##*/} echo $filename # Output: file.txt # Extract directory dirname=${filepath%/*} echo $dirname # Output: /path/to # Extract extension extension=${filepath##*.} echo $extension # Output: txt # Remove extension basename=${filename%.*} echo $basename # Output: file

String Replacement

Basic Replacement

bash
str="Hello World" # Replace first match echo ${str/World/Bash} # Output: Hello Bash # Replace all matches echo ${str//o/O} # Output: HellO WOrld # Delete matches echo ${str/o/} # Output: Hell World echo ${str//o/} # Output: Hell Wrld

Prefix and Suffix Replacement

bash
str="Hello World" # Replace prefix echo ${str/#Hello/Hi} # Output: Hi World # Replace suffix echo ${str/%World/Bash} # Output: Hello Bash

Case Conversion

bash
str="Hello World" # Convert to uppercase echo ${str^^} # Output: HELLO WORLD # Convert to lowercase echo ${str,,} # Output: hello world # Capitalize first letter echo ${str^} # Output: Hello world

String Comparison

Basic Comparison

bash
str1="Hello" str2="World" # Equality comparison if [ "$str1" = "$str2" ]; then echo "Strings are equal" fi # Inequality comparison if [ "$str1" != "$str2" ]; then echo "Strings are not equal" fi # Use [[ ]] if [[ "$str1" == "$str2" ]]; then echo "Strings are equal" fi

Pattern Matching

bash
str="Hello World" # Check if starts with specified string if [[ "$str" == Hello* ]]; then echo "Starts with Hello" fi # Check if ends with specified string if [[ "$str" == *World ]]; then echo "Ends with World" fi # Check if contains specified string if [[ "$str" == *lo* ]]; then echo "Contains 'lo'" fi

Regular Expression Matching

bash
str="Hello123" # Use =~ for regex matching if [[ "$str" =~ ^[A-Za-z]+$ ]]; then echo "Only letters" fi if [[ "$str" =~ ^[A-Za-z0-9]+$ ]]; then echo "Letters and numbers" fi # Extract matched substring if [[ "$str" =~ ([A-Za-z]+)([0-9]+) ]]; then echo "Letters: ${BASH_REMATCH[1]}" echo "Numbers: ${BASH_REMATCH[2]}" fi

String Splitting

Split Using IFS

bash
str="apple,banana,cherry" # Set IFS and split IFS=',' read -ra arr <<< "$str" echo "${arr[0]}" # Output: apple echo "${arr[1]}" # Output: banana echo "${arr[2]}" # Output: cherry # Iterate over split array for item in "${arr[@]}"; do echo "Item: $item" done

Split Using cut

bash
str="apple:banana:cherry" # Split by delimiter echo "$str" | cut -d: -f1 # Output: apple echo "$str" | cut -d: -f2 # Output: banana echo "$str" | cut -d: -f3 # Output: cherry

String Whitespace Removal

Remove Whitespace Characters

bash
str=" Hello World " # Remove leading whitespace str="${str#"${str%%[![:space:]]*}"}" # Remove trailing whitespace str="${str%"${str##*[![:space:]]}"}" echo "$str" # Output: Hello World

Remove Whitespace Using sed

bash
str=" Hello World " # Remove leading whitespace echo "$str" | sed 's/^[[:space:]]*//' # Remove trailing whitespace echo "$str" | sed 's/[[:space:]]*$//' # Remove all whitespace echo "$str" | sed 's/[[:space:]]//g'

Practical Application Examples

Validate Input

bash
# Validate email format validate_email() { local email="$1" if [[ "$email" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ ]]; then echo "Valid email" return 0 else echo "Invalid email" return 1 fi } validate_email "user@example.com"

Format Output

bash
# Format string format_string() { local name="$1" local age="$2" local city="$3" printf "Name: %-20s Age: %3d City: %s\n" "$name" "$age" "$city" } format_string "John Doe" 25 "New York"

Batch Rename

bash
# Batch change file extensions for file in *.txt; do new_name="${file%.txt}.bak" mv "$file" "$new_name" done

Log Parsing

bash
# Parse log line log_line="[2024-01-01 10:00:00] [INFO] User logged in" # Extract time time="${log_line#\[}" time="${time%%\]*}" echo "Time: $time" # Extract log level level="${log_line#*\[}" level="${level%%\]*}" echo "Level: $level" # Extract message message="${log_line#*\] }" echo "Message: $message"

String Operation Best Practices

  1. Always use quotes: Prevent issues with spaces and special characters
  2. Use ${} instead of $(): More efficient for string operations
  3. Check string length: Avoid empty string errors
  4. Use regex to validate input: Improve data quality
  5. Use printf for formatted output: More flexible than echo
  6. Be aware of case sensitivity: Use ^ and , for conversion
  7. Use arrays to store split results: Easier for subsequent processing
标签:Shell