验证变量的长度


27

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

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

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


1
您的脚本在标准POSIX中可以正常工作/bin/sh。您应该考虑将shebang行更改为,#!/bin/sh以便它更易于移植并可以在无法使用bash的环境中运行。另外,/bin/sh可能是像dash这样的更轻便的外壳,而没有用于交互式使用的功能。
Celada 2014年

@Celada,在这种情况下,虽然如此,dash${#string}会给你以字节为单位,而不是字符数的长度。
斯特凡Chazelas

Answers:


43

更优雅?没有

更短?是的:)

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

而且,如果您在交易更多的优雅而不是较短的问题上没有问题,则可以使用少两行的脚本:

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

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


3

一个与Bourne兼容的替代方案(${#string}是POSIX,但不是Bourne(这意味着您最近可能不会遇到Bourne外壳)):

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

请注意,对于${#string}????,字节数还是字符数均取决于外壳程序。通常(这是POSIX要求的),它是字符数。但是对于像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

没话题,但是echo Too long与幕后的情况有所不同echo 'Too long'
Steven Penny

而且,如果您仅在“太长”时打印,我可以if选择更多压缩方法:)

2
@StevenPenny,echo Too long传递两个参数(Toolong),以echoecho输出由分离的空间(并跟着一个新行),而在echo 'Too long'中,我们通过一个Too long到参数echo,它显示由一个新行以下。因此,它在功能上是等效的。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.