首页 > 解决方案 > 为什么 bash 字符串比较器仅在给定子字符串时才起作用?

问题描述

我正在尝试将用户从 csv 文件添加到在 CentOS 8 上运行的 bash 脚本中的组中。组名是“Faculty”和“Students”,我强制它们为小写。以下没有奏效。它默认为“else”子句,即使 $groupName 是“Faculty”(我会在 if 语句之前“回显”)。

    if [ "$groupName" = "Faculty" ]
    then
        goodGroup="faculty"
    else
        goodGroup="student"
    fi

但是,当我给它一个只有大写字母的子字符串时,它就起作用了:

    if [ "${groupName:0:1}" = "F" ]
    then
        goodGroup="faculty"
    else
        goodGroup="student"
    fi

使用第二种方法可以得到我需要的结果,我只是好奇为什么第一段代码不起作用。我在 StackOverflow 上看到的所有答案都说这是比较字符串的语法,所以我看不出我做错了什么。

标签: linuxstringbash

解决方案


在 bash 中强制变量值小写而无需检查特定值的方法:

#!/usr/bin/env bash

# Using declare to give a variable the lowercase attribute
declare -l groupName1
groupName1=Faculty
printf "%s\n" "$groupName1"

# Using parameter expansion
groupName2=FACULTY
printf "%s\n" "${groupName2,,}" # or "${groupName2@L}"

推荐阅读