Bash如何将字符串转为小写并将变更存储到更新后的变量中
问题原因
原代码转换逻辑失效的核心原因有两点:
- 管道
|两侧的命令运行在独立子shell中,子shell内的变量变更不会回传到当前主shell,无法直接通过管道给当前环境的变量赋值 - 管道仅传递前序命令的标准输出,原写法里的
response="$response"只是单纯的变量赋值操作,没有任何输出内容,后续的tr命令根本接收不到待转换的字符串
可用修复方案
方案1:全环境兼容写法(支持所有POSIX标准shell)
用命令替换$()捕获tr命令的转换结果,再赋值回变量,替换原有转换行即可,兼容性最好:
response=$(echo "$response" | tr '[:upper:]' '[:lower:]')
方案2:Bash原生写法(Bash 4.0及以上版本支持)
直接用Bash内置的参数扩展语法完成转换,不需要调用外部进程,执行效率更高:
# 字符串全转小写 response=${response,,} # 补充:如果需要全转大写可使用 ${response^^}
修正后完整可运行代码
额外给变量引用加上了双引号包裹,避免用户直接回车输入空内容时,条件判断语句报语法错误:
#!/usr/bin/env bash -e echo "To reset cluster on existing EKS cluster, we must first destroy the existing cluster." read -p "Do you want to auto-approve the terraform destroy (y/n): " response # 两种转换写法二选一即可,示例用兼容性最广的tr方案 response=$(echo "$response" | tr '[:upper:]' '[:lower:]') echo "$response" if [ "$response" = 'y' ]; then echo "Destroy is auto-approved." else echo "Destroy is not auto-approved" fi
内容的提问来源于stack exchange,提问作者Hofbr
相关产品推荐
相关产品推荐

