Maddy
Maddy

Reputation: 1379

Parsing in bash - extract content from brackets

The input to my bash script can be of the form [fec1::1]:80 or []:80. The second input implies that there's no IP address given. My bash script is to split the input into IP and port. With the said second input, the script should 'understand' that no IP was given.

The following logic seems to solve my problem, on the bash prompt:

$ ip=[]:78
$  echo $ip
[]:78
$ temp=(`echo $ip | awk -F'[][]' '{print $2}'`)
$ echo $temp

$

When I try to do the same thing from within a script, the result is different:

local_endpoint="$1"
printf 'local_endpoint: %s\n' "$local_endpoint"
IN="$local_endpoint"

local_ip=$(echo "$IN" | awk -F'[][]' '{print $2}')
if [ -z "$local_ip" ] ; then
   local_ip=$(echo "$IN" | awk -F':' '{print $1}')
   local_port=$(echo "$IN" | awk -F':' '{print $2}')
else
   local_port=$(echo "$IN" | awk -F'[][]' '{print $3}' | awk -F':' '{print $2}')
fi

printf 'IP: %s\n' $local_ip
printf 'port: %d\n' $local_port

if [ -z "$local_port" -a -z "$local_ip" ] ; then
   printf 'No port and IP was given\n'
elif [ -z "$local_ip" ] ; then
   printf 'No IP was given\n'
elif [ -z "$local_port" ] ; then
   printf 'No port was given\n'
fi
exit 2

Output:

# ./temp.sh []:829
local_endpoint: []:829
IP: []
port: 829

Any idea on what's happening? Also, why do I see the extra comma (,) at the end of the output?

Upvotes: 1

Views: 150

Answers (2)

anubhava
anubhava

Reputation: 785156

Your script is missing quoting at many places and there are stray commas too in printf. This script should work:

local_endpoint="$1"
printf 'local_endpoint: %s\n' "$local_endpoint"
IN="$local_endpoint"

if [[  "$IN" == "["* ]] ; then
   local_ip=$(echo "$IN" | awk -F'[][]' '{print $2}')
   local_port=$(echo "$IN" | awk -F'[][]' '{print $3}' | awk -F':' '{print $2}')
else
   local_ip=$(echo "$IN" | awk -F':' '{print $1}')
   local_port=$(echo "$IN" | awk -F':' '{print $2}')
fi

printf 'IP: <%s>\n' "$local_ip"
printf 'port: <%d>\n' "$local_port"

if [ -z "$local_port" -a -z "$local_ip" ] ; then
   printf 'No port and IP was given\n'
elif [ -z "$local_ip" ] ; then
   printf 'No IP was given\n'
elif [ -z "$local_port" ] ; then
   printf 'No port was given\n'
fi
exit 2

Upvotes: 1

Kaz
Kaz

Reputation: 58578

Process substitution is:

var=$(command ...)

not

var=(command ...)

Upvotes: 0

Related Questions