一尘不染

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

javascript

有没有办法进去重击bash将字符串转换为小写字符串?

例如,如果我有:

a="Hi all"

我想将其转换为:

"hi all"

阅读 138

收藏
2022-02-22

共1个答案

一尘不染

有多种方式:

POSIX standard

tr

$ echo "$a" | tr '[:upper:]' '[:lower:]'
hi all

AWK

$ echo "$a" | awk '{print tolower($0)}'
hi all

非 POSIX

您可能会遇到以下示例的可移植性问题:

bash 4.0

$ echo "${a,,}"
hi all

sed

$ echo "$a" | sed -e 's/\(.*\)/\L\1/'
hi all
# this also works:
$ sed -e 's/\(.*\)/\L\1/' <<< "$a"
hi all

Perl

$ echo "$a" | perl -ne 'print lc'
hi all

重击

lc(){
    case "$1" in
        [A-Z])
        n=$(printf "%d" "'$1")
        n=$((n+32))
        printf \\$(printf "%o" "$n")
        ;;
        *)
        printf "%s" "$1"
        ;;
    esac
}
word="I Love Bash"
for((i=0;i<${#word};i++))
do
    ch="${word:$i:1}"
    lc "$ch"
done

注意:YMMV 关于这一点。即使使用shopt -u nocasematch;. 取消设置 nocasematch 会导致 [[ “fooBaR” == “FOObar” ]] 匹配正常,但奇怪的是 [bz] 与 [AZ] 不正确匹配。Bash 被双重否定(“unsetting nocasematch”)弄糊涂了!:-)

2022-02-22