Karn Karn - 4 years ago 90
Bash Question

unable to print the second variable data in the shell script

Esteemed colleagues,

I have written a small code where i'm storing some command output into two different variables and aspiring those two values to be printed under into different columns called "PreferredList IP's" & "DefaultServerList IP's".

there are Variables PLIST & DLIST,So, when i'm running the script i only see output under the first column and unable to get the data under second column.
This looks weird to me, i don't know where i'm doing mistake..please do correct me..

set -f # to prevent filename expansion
printf "=%.0s" $(seq 1 50)
printf "\n"
printf "%-30s : %10s\n" "PreferredList IP's" "DefaultServerList IP's" # print header
printf "=%.0s" $(seq 1 50) # print separator
printf "\n" # print newline

PLIST="$(ldapsearch -h mylap -x -b "ou=profile,o=cadence.com" "cn=*" preferredserverlist -LLL | awk '/preferredserverlist: / {print $2}')"

DLIST="$(ldapsearch -h myldap -x -b "ou=profile,o=cadence.com" "cn=*" defaultserverlist -LLL | awk '/defaultserverlist: / { print $2 }')"

printf "%-30s : %10s\n" "$PLIST" "$DLIST"

RESULT: while using debug mode, I saw the problem is both the varibale output coming into first column.

PreferredList IP's : DefaultServerList IP's

Below is the ldapsearch command output sample:

dn: cn=india, ou=profile, o=cadence.com

dn: cn=japan, ou=profile, o=cadence.com

$ ldapsearch -h myldap -x -b "ou=profile,o=cadence.com" "cn=*" preferredserverlist -LLL | awk '/preferredserverlist: / {print $2}' | head -2

$ ldapsearch -h myldap -x -b "ou=profile,o=cadence.com" "cn=*" defaultserverlist -LLL | awk '/defaultserverlist: / { print $2 }' | head -2

Answer Source

It seems like the real problem you have is formatting your columns. You have two list of IPs stored in PLIST and DLIST as strings, separated by newlines. When you type

printf "%-30s : %10s\n"  "$PLIST"    "$DLIST"

It will not automatically format those into columns for you.

You really need to change the way you're parsing your LDAP results. /bin/sh is really not inherently suited to this kind of output formatting.

If you have the option of using bash (version > 4), use mapfile and restructure your program like this:


set -f      # to prevent filename expansion

# Store the output of the ldapsearches in arrays using mapfile.

mapfile -t PLIST < <(ldapsearch -h mylap -x -b "ou=profile,o=cadence.com" "cn=*" preferredserverlist -LLL | awk '/preferredserverlist: / {print $2}')

mapfile -t DLIST < <(ldapsearch -h myldap -x -b "ou=profile,o=cadence.com" "cn=*" defaultserverlist -LLL | awk '/defaultserverlist: / { print $2 }')

# Count the number of elements in each array.

# Print the count for debugging.
echo $count_x
echo $count_y

# Find out which of the two arrays is larger in size, assuming that's a possibility, pick the length of the bigger one.
if [[ $count_x -lt $count_y ]]

printf "=%.0s"  $(seq 1 50)
printf "\n"
printf "%-30s : %10s\n"         "PreferredList IP's"  "DefaultServerList IP's"          # print header
printf "=%.0s"  $(seq 1 50)     # print separator
printf "\n"                     # print newline

# Use an index 0 < i <= count, to loop over the arrays simultaneously.
for i in $(seq $count);
  printf "%-30s : %10s\n"  "${PLIST[i-1]}"    "${DLIST[i-1]}"

This uses bash's mapfile to store the output of the ldap search commands in an indexed array and prints it out in a formatted column.

As a test, I wrote this out and replaced your ldap commands with mock seq calls to generate numbers. Here's a sample run.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download