我正在为现有脚本添加一项功能,允许用户配置Linux系统的主机名。我正在执行的规则如下:
我已经解决了列表中的前两个问题,但是我无法弄清楚如何检查bash字符串是否只包含字母,数字和连字符。我想我可以使用正则表达式做到这一点,但我无法弄清楚如何(我过去一小时在网上搜索并阅读手册页)。
我愿意使用sed,grep或任何其他标准工具,但不能使用Perl或Python。
答案 0 :(得分:16)
似乎应该这样做:
^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$
匹配任何一个字母数字字符,然后匹配最多61个字母数字字符(包括连字符),然后匹配任何一个字母数字字符。最小字符串长度为2,最大值为63.它不适用于Unicode。如果你需要它来使用Unicode,你需要添加不同的字符类来代替a-zA-Z0-9
,但原则是相同的。
我相信适用于Unicode的正确grep
表达式是:
^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$
示例用法:
echo 123-abc-098-xyz | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$'
result=$(grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$' <<< "this-will-work"); echo $result;
echo "***_this_will_not_match_***" | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$'
答案 1 :(得分:2)
这是一个测试第一个参数的bash脚本,它是否只包含字母数字或连字符。它将$ 1的内容“管道”为grep:
#!/bin/bash
if grep '^[-0-9a-zA-Z]*$' <<<$1 ;
then echo ok;
else echo ko;
fi
答案 2 :(得分:1)
这是您需要的最后一个:sed -e 's/[^[:alnum:]|-]//g'
答案 3 :(得分:0)
你可以用bash
来做string="-sdfsf"
length=${#string}
if [ $length -lt 2 -o $length -gt 63 ] ;then
echo "length invalid"
exit
fi
case $string in
-* ) echo "not ok : start with hyphen";exit ;;
*- ) echo "not ok : end with hyphen";exit ;;
*[^a-zA-Z0-9-]* ) echo "not ok : special character";exit;;
esac