news 2026/8/26 22:34:51

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/8/27 11:51:32

38、深入了解 gawk 扩展 API:数据类型、内存管理与功能注册

深入了解 gawk 扩展 API:数据类型、内存管理与功能注册 在使用 gawk 进行扩展开发时,我们会遇到请求类型和实际类型不匹配的情况。此时,访问函数会返回 “false”,并填充实际值的类型,方便扩展程序打印错误信息,例如 “scalar passed where array expected”。虽然可以直…

作者头像 李华
网站建设 2026/8/27 14:52:16

SQL注入漏洞手工检测方法

1 漏洞原理与检测价值 SQL注入&#xff08;SQL Injection&#xff09;作为OWASP Top 10长期上榜的高危漏洞&#xff0c;其本质是攻击者通过构造特殊输入&#xff0c;改变原始SQL查询逻辑的代码注入技术。在自动化工具检测存在盲区的场景下&#xff0c;手工检测展现出不可替代的…

作者头像 李华
网站建设 2026/8/26 17:44:54

算法竞赛备考冲刺必刷题(C++) | AcWing 393 雇佣收银员

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来&#xff0c;并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构&#xff0c;旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…

作者头像 李华
网站建设 2026/8/26 18:07:23

1、深入了解Linux与Unix安全:黑客技术与防御策略

深入了解Linux与Unix安全:黑客技术与防御策略 1. 安全参考的价值与意义 在当今数字化时代,Linux和Unix系统广泛应用于各种企业和机构中,其安全问题至关重要。对于忙碌的管理员和顾问来说,拥有一份简洁实用的安全参考资料能让他们快速了解面临的威胁,并学会利用工具测试环…

作者头像 李华
网站建设 2026/8/26 14:56:11

2、网络技术与安全参考指南

网络技术与安全参考指南 在网络技术和安全领域,掌握一些常用的命令、端口信息、IP 地址知识以及相关的在线资源是非常重要的。下面将为大家详细介绍这些方面的内容。 1. 常用命令 在大多数 Unix 和 Linux 系统的基础安装中,有许多常用命令。这些命令可以帮助用户完成各种系…

作者头像 李华
网站建设 2026/8/27 13:57:15

6、远程服务枚举与安全防护指南

远程服务枚举与安全防护指南 在网络环境中,对各种远程服务进行枚举和安全防护是非常重要的。以下将详细介绍多种常见远程服务的枚举方法、获取服务版本信息的方式以及相应的安全防护措施。 1. SMTP 服务 在 SMTP 服务方面,为了增强安全性,建议关闭 EXPN 和 VRFY 功能。以 …

作者头像 李华