在本地使用函数检查空白字符串

Using a function locally to checks blank strings

无法理解函数 myfunc 失败的原因。我在 srcdst 中放置了一个字符串,然后我收到消息

src is blank
dst is blank 

这是代码

zblank ()
{

 local  s=""

 declare -i f=1 num=0
 [[ $s =~ ^[[:space:]]*$ ]] && num=1
 return $num
 
}

myfunc
{
  src="angio"
  dst="angio"
  (
    function myzblank() { zblank "$@"; }

    myzblank "$src" && printf '%s\n' "src is blank"
    myzblank "$dst" && printf '%s\n' "dst is blank"
  )
}   

当您使用 return $num 时,结果被解释为退出状态。

退出状态0表示成功。 每个非零退出状态都意味着失败。

因此,当您仅在 [[ $s =~ ^[[:space:]]*$ ]] 时设置 num=1 时,除非发生这种情况,否则您将报告成功,因此执行 && b运行ch。


如果您希望 zblank 到 return 只有当您传递给它的变量为空时才成功,它应该看起来像:

zblank() { [[  =~ ^[[:space:]]*$ ]]; }
  • 您不需要 return:默认情况下,函数的 return 值是最后一个命令的值 运行。
  • 您不需要 $s:它不会比 </code> 更简洁或更清晰。</li> <li>您不需要 <code>declare -i:当在算术上下文中使用变量时,即使它之前是字符串,它的值也会被视为数字。

并且如果您希望它 return 仅在 </code> 是 <em> 而不是 </em> 全空格的情况下成功,您可以将其写为:</p> <pre><code>znonblank() { ! [[ =~ ^[[:space:]]*$ ]]; }

...添加前导 ! 是唯一需要的更改。


综上所述——您根本不需要像 [[ ]] 这样的 bash 扩展来执行此操作。 POSIX sh 对你在这里做的事情来说足够强大了:

zblank() {
  case  in
    *[![:space:]]*) return 1;; # At least one non-space character exists
    *)              return 0;; # No non-spaces exist; success.
  esac
}