Bash

驗證變數的長度

  • July 5, 2021

我必須驗證變數讀取的長度(我的腳本限制為五個插入的字元),我想這樣的事情:

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

有沒有更“優雅”的解決方案?

更優雅?不

更短?是的 :)

#!/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"

如果您認為它更安全,可以使用雙括號。在這裡解釋

與 Bourne 兼容的替代方案(${#string}是 POSIX 但不是 Bourne(不是說你現在可能會遇到 Bourne shell)):

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

請注意,對於${#string}????,它是字節數還是字元數將取決於外殼。通常(並且它是 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

引用自:https://unix.stackexchange.com/questions/145150