验证变量的长度

验证变量的长度

我必须验证变量读取的长度(我的脚本限制为插入的五个字符),我想这样的事情:

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

有更“优雅”的解决方案吗?

答案1

更优雅?不

更短?是的 :)

#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

如果您不介意用更优雅来换取更短的长度,那么您可以编写一个少 2 行的脚本:

#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"

如果您认为更安全,可以使用双括号。解释在这里

答案2

与 Bourne 兼容的替代方案(${#string}是 POSIX,但不是 Bourne(并不是说您现在可能遇到过 Bourne shell)):

case $string in
  ?????*) echo >&2 Too long; exit 1;;
       *) echo OK
esac

请注意,对于 和${#string}????它是字节数还是字符数将取决于 shell。一般来说(POSIX 要求),它是字符数。但对于某些像这样的 shell 来说dash,它不支持多字节,而是字节。

对于mksh,您需要set -o utf8-mode(在 UTF-8 语言环境中)让它理解多字节字符:

$ string=€€€ bash -c 'echo "${#string}"'
3
$ string=€€€ dash -c 'echo "${#string}"'
9
$ string=€€€ mksh -c 'echo "${#string}"'
9
$ string=€€€ mksh -o utf8-mode -c 'echo "${#string}"'
3
$ locale charmap
UTF-8

相关内容