在Bash中如何将字符串转换为小写

在Bash中如何将字符串转换为小写

技术背景

在Bash脚本编程中,经常会遇到需要将字符串转换为小写的需求,比如在处理用户输入、文件名或者进行字符串比较时。不同的Bash版本和系统环境提供了多种实现字符串大小写转换的方法。

实现步骤

POSIX标准方法

  • tr命令tr 命令可以对字符进行替换、删除和压缩操作。
1
2
a="HI ALL"
echo "$a" | tr '[:upper:]' '[:lower:]'
  • AWK命令AWK 是一种强大的文本处理工具,可以使用 tolower 函数将字符串转换为小写。
1
2
a="HI ALL"
echo "$a" | awk '{print tolower($0)}'

非POSIX方法

  • Bash 4.0及以上:可以使用 ${parameter,,}${parameter,,pattern} 语法进行大小写转换。
1
2
string="A FEW WORDS"
echo "${string,,}"
  • sed命令sed 是一个流编辑器,可以使用替换命令将字符串转换为小写。
1
2
a="HI ALL"
echo "$a" | sed -e 's/\(.*\)/\L\1/'
  • Perl命令Perl 是一种通用的脚本语言,可以使用 lc 函数将字符串转换为小写。
1
2
a="HI ALL"
echo "$a" | perl -ne 'print lc'

自定义函数方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

# Prints the lowercase version of a char
lowercaseChar(){
case "$1" in
[A-Z])
n=$(printf "%d" "'$1")
n=$((n+32))
printf \\$(printf "%o" "$n")
;;
*)
printf "%s" "$1"
;;
esac
}

# Prints the lowercase version of a sequence of strings
lowercase() {
word="$@"
for((i=0;i<${#word};i++)); do
ch="${word:$i:1}"
lowercaseChar "$ch"
done
}

# 使用示例
lowercase "I AM the Walrus!"

核心代码

以下是一个综合的示例代码,包含了多种字符串大小写转换的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

# POSIX标准方法 - tr
a="HI ALL"
tr_result=$(echo "$a" | tr '[:upper:]' '[:lower:]')
echo "tr result: $tr_result"

# POSIX标准方法 - AWK
awk_result=$(echo "$a" | awk '{print tolower($0)}')
echo "awk result: $awk_result"

# Bash 4.0及以上
string="A FEW WORDS"
bash4_result="${string,,}"
echo "Bash 4.0 result: $bash4_result"

# sed命令
sed_result=$(echo "$a" | sed -e 's/\(.*\)/\L\1/')
echo "sed result: $sed_result"

# Perl命令
perl_result=$(echo "$a" | perl -ne 'print lc')
echo "perl result: $perl_result"

# 自定义函数方法
lowercase "I AM the Walrus!"

最佳实践

  • 性能考虑:在处理大量数据时,tr 命令通常是最快的,因为它是一个简单的字符替换操作。而使用外部命令(如 perlpython 等)可能会有额外的启动开销。
  • 兼容性考虑:如果需要在不同的Bash版本和系统环境中运行脚本,建议使用POSIX标准的方法,如 trAWK
  • 代码可读性:对于简单的字符串转换,可以使用Bash 4.0及以上的语法,如 ${parameter,,},代码更简洁易读。

常见问题

  • 字符编码问题:在处理非ASCII字符时,某些方法可能会出现问题。例如,tr 命令在处理国际字符时可能无法正确转换。可以使用 pythonruby 等支持Unicode的语言来处理。
1
echo "ABCÆØÅ" | python -c "print(open(0).read().lower())"
  • Bash版本问题:Bash 4.0及以上的语法(如 ${parameter,,})在早期版本中不支持。在编写脚本时,需要考虑目标系统的Bash版本。可以使用条件判断来处理不同版本的兼容性问题。
1
2
3
4
5
if (( BASH_VERSINFO[0] >= 4 )); then
result="${string,,}"
else
result=$(echo "$string" | tr '[:upper:]' '[:lower:]')
fi

在Bash中如何将字符串转换为小写
https://119291.xyz/posts/how-to-convert-a-string-to-lower-case-in-bash/
作者
ww
发布于
2025年5月26日
许可协议