Shell 脚本中常用的字符串操作有哪些?如何进行字符串拼接、截取和替换?
Shell 脚本中常用的字符串操作包括字符串拼接、截取、替换、比较和长度计算等。字符串定义基本定义# 定义字符串str1="Hello World"str2='Hello World'str3=Hello# 多行字符串str4="Line 1Line 2Line 3"字符串拼接简单拼接# 直接拼接str1="Hello"str2="World"str3=$str1" "$str2echo $str3 # 输出: Hello World# 使用引号str4="${str1} ${str2}"echo $str4 # 输出: Hello World# 多个字符串拼接str5="Hello" " " "World"echo $str5 # 输出: Hello World动态拼接# 拼接变量和文本name="John"greeting="Hello, $name!"echo $greeting # 输出: Hello, John!# 拼接命令输出date_str="Current date: $(date)"echo $date_str# 拼接数组元素arr=("apple" "banana" "cherry")str="${arr[0]}, ${arr[1]}, ${arr[2]}"echo $str # 输出: apple, banana, cherry字符串长度计算长度# 计算字符串长度str="Hello World"echo ${#str} # 输出: 11# 使用 exprexpr length "$str" # 输出: 11# 使用 awkecho "$str" | awk '{print length}'字符串截取基本截取str="Hello World"# 从指定位置开始截取echo ${str:0} # 输出: Hello Worldecho ${str:6} # 输出: World# 从指定位置截取指定长度echo ${str:0:5} # 输出: Helloecho ${str:6:5} # 输出: World# 从末尾截取echo ${str: -5} # 输出: Worldecho ${str: -5:3} # 输出: Wor删除子串str="Hello World"# 删除最短匹配的前缀echo ${str#He} # 输出: llo Worldecho ${str#*o} # 输出: World# 删除最长匹配的前缀echo ${str##*o} # 输出: rld# 删除最短匹配的后缀echo ${str%ld} # 输出: Hello Worecho ${str%o*} # 输出: Hello W# 删除最长匹配的后缀echo ${str%%o*} # 输出: Hell提取文件名和路径filepath="/path/to/file.txt"# 提取文件名filename=${filepath##*/}echo $filename # 输出: file.txt# 提取目录dirname=${filepath%/*}echo $dirname # 输出: /path/to# 提取扩展名extension=${filepath##*.}echo $extension # 输出: txt# 去除扩展名basename=${filename%.*}echo $basename # 输出: file字符串替换基本替换str="Hello World"# 替换第一个匹配echo ${str/World/Bash} # 输出: Hello Bash# 替换所有匹配echo ${str//o/O} # 输出: HellO WOrld# 删除匹配echo ${str/o/} # 输出: Hell Worldecho ${str//o/} # 输出: Hell Wrld前缀和后缀替换str="Hello World"# 替换前缀echo ${str/#Hello/Hi} # 输出: Hi World# 替换后缀echo ${str/%World/Bash} # 输出: Hello Bash大小写转换str="Hello World"# 转换为大写echo ${str^^} # 输出: HELLO WORLD# 转换为小写echo ${str,,} # 输出: hello world# 首字母大写echo ${str^} # 输出: Hello world字符串比较基本比较str1="Hello"str2="World"# 相等比较if [ "$str1" = "$str2" ]; then echo "Strings are equal"fi# 不等比较if [ "$str1" != "$str2" ]; then echo "Strings are not equal"fi# 使用 [[ ]]if [[ "$str1" == "$str2" ]]; then echo "Strings are equal"fi模式匹配str="Hello World"# 检查是否以指定字符串开头if [[ "$str" == Hello* ]]; then echo "Starts with Hello"fi# 检查是否以指定字符串结尾if [[ "$str" == *World ]]; then echo "Ends with World"fi# 检查是否包含指定字符串if [[ "$str" == *lo* ]]; then echo "Contains 'lo'"fi正则表达式匹配str="Hello123"# 使用 =~ 进行正则匹配if [[ "$str" =~ ^[A-Za-z]+$ ]]; then echo "Only letters"fiif [[ "$str" =~ ^[A-Za-z0-9]+$ ]]; then echo "Letters and numbers"fi# 提取匹配的子串if [[ "$str" =~ ([A-Za-z]+)([0-9]+) ]]; then echo "Letters: ${BASH_REMATCH[1]}" echo "Numbers: ${BASH_REMATCH[2]}"fi字符串分割使用 IFS 分割str="apple,banana,cherry"# 设置 IFS 并分割IFS=',' read -ra arr <<< "$str"echo "${arr[0]}" # 输出: appleecho "${arr[1]}" # 输出: bananaecho "${arr[2]}" # 输出: cherry# 遍历分割后的数组for item in "${arr[@]}"; do echo "Item: $item"done使用 cut 分割str="apple:banana:cherry"# 按分隔符分割echo "$str" | cut -d: -f1 # 输出: appleecho "$str" | cut -d: -f2 # 输出: bananaecho "$str" | cut -d: -f3 # 输出: cherry字符串去空去除空白字符str=" Hello World "# 去除前导空格str="${str#"${str%%[![:space:]]*}"}"# 去除尾部空格str="${str%"${str##*[![:space:]]}"}"echo "$str" # 输出: Hello World使用 sed 去空str=" Hello World "# 去除前导空格echo "$str" | sed 's/^[[:space:]]*//'# 去除尾部空格echo "$str" | sed 's/[[:space:]]*$//'# 去除所有空格echo "$str" | sed 's/[[:space:]]//g'实际应用示例验证输入# 验证邮箱格式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_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"批量重命名# 批量修改文件扩展名for file in *.txt; do new_name="${file%.txt}.bak" mv "$file" "$new_name"done日志解析# 解析日志行log_line="[2024-01-01 10:00:00] [INFO] User logged in"# 提取时间time="${log_line#\[}"time="${time%%\]*}"echo "Time: $time"# 提取日志级别level="${log_line#*\[}"level="${level%%\]*}"echo "Level: $level"# 提取消息message="${log_line#*\] }"echo "Message: $message"字符串操作最佳实践始终使用引号: 防止空格和特殊字符问题使用 ${} 而不是 $(): 字符串操作更高效检查字符串长度: 避免空字符串错误使用正则表达式验证输入: 提高数据质量使用 printf 格式化输出: 比 echo 更灵活注意大小写敏感: 使用 ^ 和 , 进行转换使用数组存储分割结果: 便于后续处理