我想检查 shell 脚本上的输入是字母字符还是字符。我怎样才能做到这一点?
答案1
你的问题很模糊,所以这里有一些猜测:
#!/bin/bash
input=$1
if [[ -z "$input" || $input == *[^[:digit:]]* ]]; then
echo "your input '$input' is not a number" >&2
exit 1
fi
echo "congrats, '$input' is a number"
在 bash 中,[[...]]
运算符内部==
是模式匹配操作员,所以我们正在寻找那里的任何非数字字符。
答案2
如果您的输入是 $VAR...
if [ -z "${VAR//[0-9]/}" -a ! -z "$VAR" ]; then
echo only has digits
fi
答案3
检查字母字符只需执行以下操作:
case $input in
([[:alpha:]]) echo one alpha character;;
(*) echo 'non-alpha or not one character (or non-character)';;
esac
根据语言环境的字符集/编码对字符进行解码,并再次查询语言环境以检查它是否在按字母顺序排列的字符类。
检查是否$input
是一个角色比较棘手。
case $input in
(?) echo one character
esac
是为了检查这一点。然而,对于大多数 shell,如果$input
包含一个不形成有效字符的字节,也会返回 true 。为了解决这个问题,你可以这样做:
case $input in
([[:alpha:]]) echo one alpha character;;
(?)
n_chars=$(($(printf %s "$input" | wc -m)))
if [ "$n_char" -eq 1 ]; then
echo one character
else
echo one byte that is not a character
fi;;
("") echo empty;;
(*) echo anything else
esac
答案4
虽然其他答案都很好,但这里有一个一行解决方案
grep -q '^[[:alnum:]]*$' <<< "$mybar" && success_command || failure_command
如果您想在空字符串上返回 do failure 命令,请使用以下命令
grep -q '^[[:alnum:]]\+$' <<< "$mybar" && echo "success" || echo "failure"