我必须验证变量读取的长度(我的脚本限制为插入的五个字符),我想这样的事情:
#!/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