MacOS下Bash脚本中tr命令无法保留撇号的问题排查
问题原因与解决方法
问题出在你脚本里的撇号不是普通ASCII单引号,而是「智能弯撇号」(’)——MacOS自带的文本编辑器(比如TextEdit)默认会把普通单引号自动替换成这种弯引号,但tr命令只识别ASCII编码的单引号('),所以脚本里的弯撇号不在你指定的保留列表里,自然会被移除。而终端里直接输入的是普通单引号,所以能正常生效。
解决步骤
- 替换撇号类型:把脚本里的弯撇号(’)换成键盘直接输入的普通ASCII单引号(')。
- 优化命令写法:推荐用现代的
$(...)代替反引号做命令替换,可读性更强;同时给变量加双引号避免空格拆分问题:# 写法1:用双引号包裹tr的保留字符集合 pword=$(echo "$word" | tr '[:upper:]' '[:lower:]' | tr -cd "[:alpha:]'") # 写法2:转义单引号(单引号包裹时需要转义) pword=$(echo "$word" | tr '[:upper:]' '[:lower:]' | tr -cd '[:alpha:]'\''') - 更高效的写法(Bash 4.0+):利用Bash的参数展开直接转小写,不用调用
echo和额外的tr进程:# 先转小写,再过滤字符 pword=${word,,} pword=$(tr -cd "[:alpha:]'" <<< "$pword") # 或者合并成一步 pword=$(tr '[:upper:]' '[:lower:]' -cd "[:alpha:]'" <<< "$word")
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

