【问题标题】: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应该是什么。是否要删除每个字符 !@$%&?

标签: posix shellcheck


【解决方案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 也可以执行字符删除。 Stackoverflow 的下一步是“接受”和/或通过点击投票数上方的复选标记和/或朝上的三角形来“接受”和/或支持对您最有帮助的答案。
猜你喜欢
  • 1970-01-01
  • 2021-10-04
  • 2021-05-14
  • 2012-02-21
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多