news 2026/4/16 10:55:17

Shell脚本字符串操作功能总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Shell脚本字符串操作功能总结

以下是在Shell脚本中常见的字符串操作功能总结,涵盖了各种处理字符串的场景:

1.基本定义和赋值

str="Hello World" # 双引号(允许变量扩展) str='Hello World' # 单引号(原样输出) str=$'Hello\nWorld' # ANSI-C引用(支持转义字符)

2.字符串长度

${#string} # 获取字符串长度 echo ${#str} # 输出:11

3.子字符串提取

${string:position} # 从指定位置开始提取 ${string:position:length} # 从指定位置提取指定长度 str="Hello World" echo ${str:6} # 输出:World echo ${str:6:3} # 输出:Wor echo ${str: -5} # 输出:World(负数从末尾开始)

4.字符串删除(从开头删除)

${string#substring} # 删除最短匹配的前缀 ${string##substring} # 删除最长匹配的前缀 path="/usr/local/bin/app" echo ${path#/*/} # 输出:local/bin/app echo ${path##/*/} # 输出:app

5.字符串删除(从末尾删除)

${string%substring} # 删除最短匹配的后缀 ${string%%substring} # 删除最长匹配的后缀 file="app.tar.gz" echo ${file%.*} # 输出:app.tar echo ${file%%.*} # 输出:app echo ${file%.gz} # 输出:app.tar

6.字符串替换

${string/pattern/replacement} # 替换第一个匹配 ${string//pattern/replacement} # 替换所有匹配 ${string/#pattern/replacement} # 替换开头的匹配 ${string/%pattern/replacement} # 替换结尾的匹配 str="hello world hello" echo ${str/hello/HI} # 输出:HI world hello echo ${str//hello/HI} # 输出:HI world HI echo ${str/#hello/HI} # 输出:HI world hello

7.大小写转换(Bash 4.0+)

${string^^} # 转大写 ${string,,} # 转小写 ${string^} # 首字母大写 ${string,} # 首字母小写 str="hello World" echo ${str^^} # 输出:HELLO WORLD echo ${str,,} # 输出:hello world echo ${str^} # 输出:Hello World

8.字符串查找(位置)

# 查找子字符串位置 expr index "$string" "$substring" # 返回字符位置 expr match "$string" "$pattern" # 返回匹配长度 expr substr "$string" $position $length # 子串截取 str="hello world" expr index "$str" "wo" # 输出:7 expr match "$str" "hello" # 输出:5 expr substr "$str" 2 3 # 输出:ell

9.字符串比较

[[ $str1 == $str2 ]] # 相等比较 [[ $str1 != $str2 ]] # 不等比较 [[ $str1 < $str2 ]] # 按字典序小于 [[ $str1 > $str2 ]] # 按字典序大于 [[ -z $str ]] # 是否为空 [[ -n $str ]] # 是否非空 [[ $str =~ regex ]] # 正则匹配 if [[ "hello" =~ ^h.*o$ ]]; then echo "匹配" fi

10.字符串分割

# 使用IFS分割为数组 IFS=',' read -ra array <<< "a,b,c,d" echo ${array[1]} # 输出:b # 使用参数展开 str="one:two:three" arr=(${str//:/ }) # 将冒号替换为空格再转换为数组

11.字符串拼接

str1="Hello" str2="World" result="$str1 $str2" # 输出:Hello World result=$str1$str2 # 输出:HelloWorld result=${str1}_${str2} # 输出:Hello_World

12.去除空白字符

# 去除开头空白 ${string#${string%%[![:space:]]*}} # 去除结尾空白 ${string%${string##*[![:space:]]}} # 使用sed echo "$str" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'

13.字符串包含判断

# 方法1:使用通配符 if [[ $str == *"substring"* ]]; then echo "包含" fi # 方法2:使用正则 if [[ $str =~ "substring" ]]; then echo "包含" fi # 方法3:使用grep if echo "$str" | grep -q "substring"; then echo "包含" fi

14.字符串反转

str="hello" rev=$(echo $str | rev) # 需要rev命令支持 echo $rev # 输出:olleh ######################################### # 纯Bash实现 reverse() { local str="$1" local rev="" for ((i=${#str}-1; i>=0; i--)); do rev="$rev${str:$i:1}" done echo "$rev" }

15.字符串统计

# 统计字符出现次数 str="hello world" char="l" count=$(echo "${str}" | awk -F"${char}" '{print NF-1}') echo $count # 输出:3 # 统计单词数 echo "$str" | wc -w

16.进制转换

# 十进制转十六进制 printf "%x\n" 255 # 输出:ff # 十六进制转十进制 echo $((0xff)) # 输出:255 # 二进制转十进制 echo $((2#11111111)) # 输出:255

17.使用外部命令处理字符串

# 使用awk echo "hello:world" | awk -F: '{print $2}' # 使用sed echo "hello world" | sed 's/hello/HI/' # 使用cut echo "hello:world" | cut -d: -f2 # 使用tr(字符转换) echo "HELLO" | tr 'A-Z' 'a-z' # 转小写 echo "hello" | tr 'a-z' 'A-Z' # 转大写 echo "hello" | tr -d 'aeiou' # 删除元音字母

18.特殊字符处理

# URL编码/解码 urlencode() { local string="${1}" local strlen=${#string} local encoded="" for (( pos=0 ; pos<strlen ; pos++ )); do c=${string:$pos:1} case "$c" in [-_.~a-zA-Z0-9] ) o="${c}" ;; * ) printf -v o '%%%02x' "'$c" esac encoded+="${o}" done echo "${encoded}" } # Base64编码/解码 echo "hello" | base64 # 编码 echo "aGVsbG8=" | base64 -d # 解码

19.字符串填充和对齐

# 使用printf格式化 printf "%-10s" "hello" # 左对齐,宽度10 printf "%10s" "hello" # 右对齐,宽度10 printf "%010d" 123 # 用0填充:0000000123 # 在字符串前后添加固定字符 printf "%0.s-" {1..10} # 生成10个连字符

20.多行字符串处理

# Here Document cat << EOF 第一行 第二行 第三行 EOF # 删除多行字符串中的空行 echo -e "line1\n\nline2\n\nline3" | sed '/^$/d'

实用示例组合

#!/bin/bash # 综合示例:处理文件名 filename="myfile.tar.gz" # 获取不同部分 basename="${filename%.*}" # myfile.tar extension="${filename##*.}" # gz name="${basename%.*}" # myfile full_extension="${filename#*.}" # tar.gz echo "文件名: $filename" echo "基本名: $basename" echo "扩展名: $extension" echo "名称: $name" echo "完整扩展名: $full_extension"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:55:14

39、gawk 扩展编程:API 功能详解与应用实践

gawk 扩展编程:API 功能详解与应用实践 1. 打印信息 在扩展中,可以打印不同类型的警告信息。使用这些函数时,必须传入扩展加载时从 gawk 接收到的扩展 ID。以下是相关函数: - void fatal(awk_ext_id_t id, const char *format, ...); :打印一条消息,然后使 gawk 立即…

作者头像 李华
网站建设 2026/4/5 20:14:18

基于Miniconda的AI开发环境搭建最佳实践

基于Miniconda的AI开发环境搭建最佳实践 在人工智能研发日益复杂的今天&#xff0c;一个常见的场景是&#xff1a;你从GitHub上克隆了一份热门论文的代码&#xff0c;满怀期待地运行python train.py&#xff0c;却立刻被一连串的ImportError或CUDA版本不兼容的报错拦下。更糟的…

作者头像 李华
网站建设 2026/4/12 11:24:22

43、gawk:发展、安装与使用指南

gawk:发展、安装与使用指南 1. gawk的正则范围解释与发展历程 在gawk的发展过程中,正则表达式范围解释曾是一个令人困扰的问题。早期,gawk使用的正则匹配代码不支持本地化,范围具有传统的解释方式。然而,当gawk转向使用支持本地化的正则匹配器时,问题便接踵而至。特别是…

作者头像 李华
网站建设 2026/4/13 0:00:23

13、无线安全与夏普Zaurus PDA黑客工具

无线安全与夏普Zaurus PDA黑客工具 无线安全威胁与防护 在无线网络环境中,存在着诸多安全威胁。例如,当接入点接收到无效信息数据包时,会对地址被伪造的客户端进行取消认证操作,受害者客户端必须重新与接入点进行认证。这就使得恶意用户可以利用此漏洞,借助相关工具对网…

作者头像 李华
网站建设 2026/4/12 8:37:06

19、fwsnort:Snort规则转换与入侵检测的高效解决方案

fwsnort:Snort规则转换与入侵检测的高效解决方案 1. IDS中的应用与fwsnort特性 在入侵检测系统(IDS)领域,IDS可借助操作系统和应用程序信息,排除潜在的误报,或者提升所报告攻击的严重程度。例如,针对Microsoft IIS Web服务器缓冲区溢出的攻击,如果目标是Apache Web服…

作者头像 李华
网站建设 2026/4/12 18:30:09

24、网络攻击检测与防御:fwsnort 与 psad 的协同应用

网络攻击检测与防御:fwsnort 与 psad 的协同应用 在网络安全领域,有效检测和防御攻击是至关重要的任务。本文将深入探讨 fwsnort 和 psad 这两款工具,以及它们如何协同工作以增强网络安全防护能力。 1. fwsnort 与 Snort 社区的关联 Snort 社区为检测网络攻击提供了一种有…

作者头像 李华