5月30日 00:10
How to define and use arrays in Shell scripts? What are the common array operations?
Array operations in Shell scripts include array definition, access, iteration, and common operations.
Array Definition
Regular Arrays
bash# Define empty array arr=() # Define array (space separated) arr=(apple banana cherry) # Define individually arr[0]="apple" arr[1]="banana" arr[2]="cherry" # Define using command output arr=($(ls *.txt))
Associative Arrays (Bash 4.0+)
bash# Declare associative array declare -A arr # Define associative array arr[name]="John" arr[age]=25 arr[city]="Beijing" # Define all at once declare -A arr=([name]="John" [age]=25 [city]="Beijing")
Array Access
Access Single Element
basharr=(apple banana cherry) # Access element at specific index echo ${arr[0]} # Output: apple echo ${arr[1]} # Output: banana echo ${arr[2]} # Output: cherry # Access last element echo ${arr[-1]} # Output: cherry # Access non-existent index echo ${arr[10]} # Output: (empty)
Access All Elements
bash# Access all elements echo ${arr[@]} # Output: apple banana cherry echo ${arr[*]} # Output: apple banana cherry # Access all element indices echo ${!arr[@]} # Output: 0 1 2 # Access array length echo ${#arr[@]} # Output: 3 echo ${#arr[*]} # Output: 3
Access Partial Elements
bash# Access all elements starting from index 1 echo ${arr[@]:1} # Output: banana cherry # Access 2 elements starting from index 1 echo ${arr[@]:1:2} # Output: banana cherry # Access starting from 2nd to last element echo ${arr[@]: -2} # Output: banana cherry
Array Iteration
Iterate All Elements
basharr=(apple banana cherry) # Method 1: Use for loop for item in "${arr[@]}"; do echo "Item: $item" done # Method 2: Use index iteration for i in "${!arr[@]}"; do echo "Index $i: ${arr[$i]}" done # Method 3: Use C-style loop for ((i=0; i<${#arr[@]}; i++)); do echo "Index $i: ${arr[$i]}" done
Iterate Associative Array
bashdeclare -A arr=([name]="John" [age]=25 [city]="Beijing") # Iterate keys for key in "${!arr[@]}"; do echo "Key: $key" done # Iterate key-value pairs for key in "${!arr[@]}"; do echo "$key: ${arr[$key]}" done
Array Operations
Add Elements
basharr=(apple banana) # Add to end arr+=(cherry) arr+=("date" "fig") # Add to specific position arr[2]="cherry" # Replace or add # Add using index arr[${#arr[@]}]="grape" # Add to end
Delete Elements
basharr=(apple banana cherry date fig) # Delete element at specific index unset arr[2] # Delete element at index 2 # Delete entire array unset arr # Delete associative array element declare -A arr=([name]="John" [age]=25) unset arr[name]
Modify Elements
basharr=(apple banana cherry) # Modify element at specific index arr[0]="orange" arr[1]="pear" # Batch modify for i in "${!arr[@]}"; do arr[$i]="${arr[$i]}_modified" done
Array Slicing
basharr=(one two three four five) # Slicing echo ${arr[@]:1:3} # Output: two three four # Slice and assign new_arr=(${arr[@]:1:3})
Array Sorting
Simple Sorting
basharr=(banana apple cherry date) # Lexicographic sort sorted=($(echo "${arr[@]}" | tr ' ' '\n' | sort)) echo "${sorted[@]}" # Numeric sort nums=(5 2 8 1 9) sorted_nums=($(echo "${nums[@]}" | tr ' ' '\n' | sort -n)) echo "${sorted_nums[@]}" # Reverse sort sorted_rev=($(echo "${arr[@]}" | tr ' ' '\n' | sort -r)) echo "${sorted_rev[@]}"
Deduplication
basharr=(apple banana apple cherry banana) # Remove duplicates unique=($(echo "${arr[@]}" | tr ' ' '\n' | sort -u)) echo "${unique[@]}"
Array Search
Find Element
basharr=(apple banana cherry) # Check if element exists if [[ " ${arr[@]} " =~ " banana " ]]; then echo "Found banana" fi # Use function to find contains_element() { local e match="$1" shift for e; do [[ "$e" == "$match" ]] && return 0; done return 1 } if contains_element "banana" "${arr[@]}"; then echo "Found banana" fi
Find Index
basharr=(apple banana cherry) # Find element index get_index() { local element=$1 shift local arr=("$@") for i in "${!arr[@]}"; do if [[ "${arr[$i]}" == "$element" ]]; then echo $i return 0 fi done return 1 } index=$(get_index "banana" "${arr[@]}") echo "Index of banana: $index"
Practical Application Examples
File Processing
bash# Get all .txt files files=($(ls *.txt)) # Iterate and process for file in "${files[@]}"; do echo "Processing: $file" # Process file done # Check if files exist if [ ${#files[@]} -eq 0 ]; then echo "No .txt files found" fi
Parameter Processing
bash# Store parameters in array args=("$@") # Iterate parameters for arg in "${args[@]}"; do echo "Argument: $arg" done # Check for specific parameter if [[ " ${args[@]} " =~ " --verbose " ]]; then verbose=true fi
Data Statistics
bash# Read data into array readarray -t lines < data.txt # Count lines echo "Total lines: ${#lines[@]}" # Count lines containing specific content count=0 for line in "${lines[@]}"; do if [[ "$line" =~ "pattern" ]]; then ((count++)) fi done echo "Matching lines: $count"
Configuration Management
bash# Parse config file to associative array declare -A config while IFS='=' read -r key value; do config[$key]="$value" done < config.txt # Access configuration echo "Database: ${config[db_host]}" echo "Port: ${config[db_port]}"
Array Best Practices
- Always use quotes:
"${arr[@]}"prevents issues with spaces and special characters - Use ${#arr[@]} for length: Instead of ${#arr}
- Use ${!arr[@]} for indices: Safer when iterating
- Declare associative arrays: Use
declare -Afor associative arrays - Avoid uninitialized indices: Check if index exists
- Encapsulate complex operations in functions: Improve code readability
- Note array indices start at 0: Consistent with other programming languages