以"#"开头的字符串的Bash长度

时间:2017-07-01 20:13:35

标签: linux bash sh

我正在编写一个脚本,用于读取用户输入的颜色十六进制代码,即

#FFFFFF

我还需要检查该字符串的长度是否等于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

如果字符串不是以哈希开头的话,那就完美了。

有没有办法让它发挥作用?

3 个答案:

答案 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用于整数比较