0

I have hostname like following

www-foo-1001-1-1.example.com

I am writing script to which should deploy application which has following string match 1001-<any digit>-<any digit>

Example: script should match following hostname.

www-foo-1001-1-49
www-foo-1001-4-37
www-foo-1001-2-12
www-foo-1001-8-4

Ignore this pattern in hostname.

www-foo-1001-1-2-49
www-foo-1001-1-1-49
www-foo-1001-1
www-foo-1001

it has to match this pattern 1001-N-N and ignore anything else.

More details i want to do if then.. and return exit status code with $? to throw error who are not matching standard hostname.

  • @JeffSchaller yes you are correct, i am writing script with will take hostname as an argument and validate host before start installation. – Satish Sep 12 '18 at 14:50
2

bash extended patterns are enabled within [[ ... ]]; so you can do

hosts=( www-foo-1001-1-49 www-foo-1001-4-37 www-foo-1001-2-12 www-foo-1001-8-4 www-foo-1001-1-2-49 www-foo-1001-1-1-49 www-foo-1001-1 www-foo-1001 )
pattern='*-1001-+([[:digit:]])-+([[:digit:]])'
for h in "${hosts[@]}"; do
    if [[ $h == $pattern ]]; then
        echo "OK: $h"
    else
        echo "no: $h"
    fi
done
OK: www-foo-1001-1-49
OK: www-foo-1001-4-37
OK: www-foo-1001-2-12
OK: www-foo-1001-8-4
no: www-foo-1001-1-2-49
no: www-foo-1001-1-1-49
no: www-foo-1001-1
no: www-foo-1001

My pattern starts with *-1001- where I'm assuming that you don't want to match 11001 or 21001 etc.

The == operator in [[ ... ]] is a pattern matching operator.

The right-hand operand is the pattern variable, but unquoted. That allows interpretation of the variable's value as a pattern not a string.

2

Using bash:

$ touch www-foo-1001  www-foo-1001-1  www-foo-1001-1-1-49  www-foo-1001-1-2-49  www-foo-1001-1-49  www-foo-1001-2-12  www-foo-1001-4-37  www-foo-1001-8-4
$ for f in *
do
  [[ $f =~ 1001-[[:digit:]]+-[[:digit:]]+$ ]] && printf 'Yes: %s\n' "$f"
done
Yes: www-foo-1001-1-49
Yes: www-foo-1001-2-12
Yes: www-foo-1001-4-37
Yes: www-foo-1001-8-4

This uses bash's regular expression conditional operator to test the argument against:

  • contains 1001-
  • followed by some number of digits
  • followed by a -
  • followed by some number of digits
  • followed by nothing else: $
0
kapu@ppc:$ ls
www-foo-1001        www-foo-1001-1-1-49 www-foo-1001-1-49   www-foo-1001-4-37
www-foo-1001-1      www-foo-1001-1-2-49 www-foo-1001-2-12   www-foo-1001-8-4
kapu@ppc:$ ls | awk '/www-foo-1001-[0-9]+-[0-9]+$/{print}'
www-foo-1001-1-49
www-foo-1001-2-12
www-foo-1001-4-37
www-foo-1001-8-4

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.