在 POSIX sh 中,字符串替换是未定义的。在尝试做 PASS2="$PASS//[$special_chars]/"

Posted

技术标签:

【中文标题】在 POSIX sh 中,字符串替换是未定义的。在尝试做 PASS2="$PASS//[$special_chars]/"【英文标题】:In POSIX sh, string replacement is undefined. while trying to do PASS2="$PASS//[$special_chars]/"在 POSIX sh 中,字符串替换是未定义的。在尝试做 PASS2="$PASS//[$special_chars]/" 【发布时间】:2020-07-22 01:36:28 【问题描述】:

我的代码是

special_chars='[=!=][=@=][=#=][=$=][=%=][=&=]'
PASS="e@0cc3auZeeSio&G"

PASS2="$PASS//[$special_chars]/"

我希望 PASS2 包含 PASS 中的所有字符 - 特殊字符。 这工作正常,但有外壳检查错误。

PASS2="$PASS//[$special_chars]/"
             ^-- SC2039: In POSIX sh, string replacement is undefined.

我试过了

PASS2=$(printf '%s' "$PASS2" | PASS//["$special_chars"]/)

PASS2=$(printf '%s' "$PASS" | PASS//["$special_chars"]/)

这些在功能上不起作用。

【问题讨论】:

Shellcheck 试图告诉您参数扩展中的 // 构造不是有效的 POSIX(这是一种 bashism)。也不清楚 special_chars 应该做什么。请告诉我们转换后的PASS2应该是什么。是否要删除每个字符 !@$%&? 【参考方案1】:

这个脚本通过了shellcheck:

#!/bin/sh

special='!@#$%&'
PASS="e@0cc3auZeeSio&G"
PASS2=$(printf %s "$PASS" | tr -d "$special")
echo "$PASS2"

【讨论】:

非常感谢@Jens 我用的是 PASS2=$(echo "$PASS" | sed 's/[!@#$&%]//g') @SashankSekharSingh 太棒了。是的,sed 也可以执行字符删除。 *** 的下一步是“接受”和/或通过点击投票数上方的复选标记和/或朝上的三角形来“接受”和/或支持对您最有帮助的答案。

以上是关于在 POSIX sh 中,字符串替换是未定义的。在尝试做 PASS2="$PASS//[$special_chars]/"的主要内容,如果未能解决你的问题,请参考以下文章

如何判断一个字符串是不是包含 POSIX sh 中的另一个字符串?

如何判断一个字符串是不是包含 POSIX sh 中的另一个字符串?

如何使用 Python 或 posix 工具搜索和替换字符串中的匹配括号

ArchLinux下Shell基础学习

sh bash快捷方式,用于在指定目录下的所有文件中查找和替换字符串

命令替换中的 POSIX shell 注释