news 2026/3/15 10:29:25

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/3/14 4:12:56

33、gawk高级功能:网络编程、性能分析与国际化应用

gawk高级功能:网络编程、性能分析与国际化应用 1. 使用gawk进行网络编程 gawk不仅能在同一系统上与协进程建立双向管道,还能通过IP网络与其他系统上的进程建立双向连接。gawk通过识别以 /inet/ 、 /inet4/ 或 /inet6/ 开头的特殊文件名来使用TCP/IP网络。 特殊文件名…

作者头像 李华
网站建设 2026/3/12 23:05:49

【完整源码+数据集+部署教程】链条缺陷检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着工业自动化和智能制造的迅速发展&#xff0c;链条作为机械传动系统中不可或缺的组成部分&#xff0c;其质量直接影响到设备的运行效率和安全性。链条的缺陷不仅会导致设备的故障&#xff0c;还可能引发严重的安全事故。因此&#xff0c;及时、准确地检测链条缺…

作者头像 李华
网站建设 2026/3/14 11:08:00

12、系统安全维护与无线安全攻防全解析

系统安全维护与无线安全攻防全解析 1. 系统日志记录与补丁管理 在系统管理中,日志记录和补丁管理是至关重要的环节。日志记录工具如 newsyslog 或 logrotate 可用于管理日志,可通过 cron 守护进程定期调用这些工具。详细信息可查看 newsyslog 或 logrotate 的手册页。 /va…

作者头像 李华
网站建设 2026/3/12 17:34:35

16、Linux 和 Unix 安全技术指南

Linux 和 Unix 安全技术指南 1. 数据资源与文件操作 1.1 数据搜索 可以对数据资源进行搜索,同时也能搜索 dead.letter 文件的内容。 1.2 文件权限 文件权限的设置至关重要,以下是一些关键操作: - 为重要文件分配权限,范围在 147 - 149。 - 保护磁盘分区,操作范围…

作者头像 李华
网站建设 2026/3/15 9:57:43

22、《fwsnort使用与配置全解析》

《fwsnort使用与配置全解析》 1. 运行fwsnort 当fwsnort安装在支持内核字符串匹配的系统上后,我们就可以从命令行启动它。通常,fwsnort需要以root身份执行,因为默认情况下它会查询iptables,以确定运行的内核中可用的扩展,然后相应地调整翻译过程。以下是运行示例(部分输…

作者头像 李华
网站建设 2026/3/13 23:21:55

28、实用 awk 程序指南

实用 awk 程序指南 1. 运行示例程序 在使用 awk 程序时,我们需要掌握如何正确运行这些程序。一般来说,运行一个给定的 awk 程序可以使用以下命令: awk -f program —options files其中, program 是 awk 程序的名称,例如 cut.awk ; options 是程序的命令行选项,…

作者头像 李华