在 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 工具搜索和替换字符串中的匹配括号