我正在编写一个脚本,用于读取用户输入的颜色十六进制代码,即
我还需要检查该字符串的长度是否等于7(1个哈希符号+6个数字)并且#34;#"符号作为第一个字符。这是我的代码:
read color
until [ ${#color} -ge 7 ] && [ ${color:0:1} -eq "#" ]
do
echo "Color code must be 7 characters long and start with '#'!"
read color
done
但是当我尝试时,我收到错误
[: #: integer expression expected
如果字符串不是以哈希开头的话,那就完美了。
有没有办法让它发挥作用?
答案 0 :(得分:3)
您正在尝试进行数字比较-eq
,而不是字符串比较:
${color:0:1} -eq "#"
应该是
"${color:0:1}" = "#"
代替。
INTEGER1 -eq INTEGER2 - INTEGER1等于INTEGER2
STRING1 = STRING2 - 字符串相等
( man test )
答案 1 :(得分:2)
如果您只需要在bash
中使用它,请使用正则表达式匹配:
color=
until [[ $color =~ ^\#[[:xdigit:]]{6}$ ]]; do
IFS= read -r color
done
对于任何POSIX shell,使用case
语句来允许模式匹配
color=
until :; do
IFS= read -r color
case $color in
\#[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]) break ;;
esac
done
或使用expr
命令:
color=
until IFS= read -r color && expr "$color" : "#[[:xdigit:]]\{6\}$"; do
:
done
答案 2 :(得分:0)
Bash scripts use =
for string comparison,所以您的代码应为:
read color
until [ ${#color} -ge 7 ] && [ ${color:0:1} = "#" ]
do
echo "Color code must be 7 characters long and start with '#'!"
read color
done
它是integer expression expected
,因为-eq
用于整数比较