如何更改变量中字符串的大小写(大写和小写)?

Zac*_*Zac 1 shell bash string variable

"Enter test: "
read test

if [[ $test == "a" ]]; then
    echo "worked"
else
    echo "failed"
fi
Run Code Online (Sandbox Code Playgroud)

这是我正在做的测试的一个简单说明,但如果我输入“A”,它将失败。我可以在变量阶段做些什么来将其全部更改为小写,以便测试匹配?

Sté*_*las 7

只需使用标准sh(POSIX 和 Bourne)语法:

case $answer in
  a|A) echo OK;;
  *)   echo >&2 KO;;
esac
Run Code Online (Sandbox Code Playgroud)

或者:

case $answer in
  [aA]) echo OK;;
  *)    echo >&2 KO;;
esac
Run Code Online (Sandbox Code Playgroud)

使用bash, kshor zsh(支持该非标准[[...]]语法的 3 个 shell ),您可以声明一个小写变量:

typeset -l test
printf 'Enter test: '
read test
if [ "$test" = a ]; then...
Run Code Online (Sandbox Code Playgroud)

(请注意,bash在某些语言环境中,大小写转换是错误的)。


Hau*_*ing 5

有几种有用的方法可以实现这一点(在 中bash):

两次检查

echo -n "Enter test: "
read test

if [[ $test == "a" || $test == "A" ]]; then
    echo "worked"
else
    echo "failed"
fi
Run Code Online (Sandbox Code Playgroud)

使输入小写

echo -n "Enter test: "
read test
test="${test,,}"

if [[ $test == "a" ]]; then
    echo "worked"
else
    echo "failed"
fi
Run Code Online (Sandbox Code Playgroud)

两种情况的正则表达式

echo -n "Enter test: "
read test

if [[ $test =~ ^[aA]$ ]]; then
    echo "worked"
else
    echo "failed"
fi
Run Code Online (Sandbox Code Playgroud)

使外壳忽略大小写

echo -n "Enter test: "
read test

shopt -s nocasematch
if [[ $test == a ]]; then
    echo "worked"
else
    echo "failed"
fi
Run Code Online (Sandbox Code Playgroud)

  • (2) 的扩展:`[[ "${test,,}" == "a" ]]`。 (2认同)