Raam Dev
Raam Dev

Reputation: 175

How can I ensure a Bash string is alphanumeric, without an underscore?

I'm adding a feature to an existing script that will allow the user to configure the hostname of a Linux system. The rules I'm enforcing are as follows:

I've solved the first two in the list, but I'm having trouble figuring out how to check if a bash string contains only letters, digits, and hyphens. I think I can do this with a regex, but I'm having trouble figuring out how (I've spent the past hour searching the web and reading man pages).

I'm open to using sed, grep, or any of the other standard tools, but not Perl or Python.

Upvotes: 9

Views: 49783

Answers (4)

Welbog
Welbog

Reputation: 60398

Seems like this ought to do it:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$

Match any one alphanumeric character, then match up to 61 alphanumeric characters (including hyphens), then match any one alphanumeric character. The minimum string length is 2, the maximum is 63. It doesn't work with Unicode. If you need it to work with Unicode you'll need to add different character classes in place of a-zA-Z0-9 but the principle will be the same.

I believe the correct grep expression that will work with Unicode is:

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$

Example Usage:


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:]]$'

Upvotes: 21

ghostdog74
ghostdog74

Reputation: 342353

you can do it with just 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

Upvotes: 2

js.
js.

Reputation: 1867

This is a bash script testing the first parameter whether it contains only alphanumerics or hyphens. It "pipes" the contents of $1 into grep:

#!/bin/bash
if grep '^[-0-9a-zA-Z]*$' <<<$1 ;
  then echo ok;
  else echo ko;
fi

Upvotes: 3

Alberto Zaccagni
Alberto Zaccagni

Reputation: 31560

This is for the last one you need: sed -e 's/[^[:alnum:]|-]//g'

Upvotes: 1

Related Questions