Dynamic case creation based on output list from a command


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Dynamic case creation based on output list from a command
# 1  
Old 06-13-2012
Question Dynamic case creation based on output list from a command

I am attempting to create a script that would allow me to list all the instances associated with a DB2 and then prompt the user to choose which one to issue the db2profile command against. I use the db2 command db2ilist to get a list of the instances for a particular server, but the number of instances could vary from server to server and I can't figure out how use the results from the db2ilist to create a case.

The output from db2ilist looks like this for example

[sslaton@Z11LD003 ~]$ db2ilist
dtrnd1
scgnd1
scgnd2
scgnd3
dtrnl1
scgnl1
scgnl2
scgnl3

I created a dumbed down version where I hard coded those instances to create a pick list to demonstrate what I'd like to do.


Code:
#!/bin/sh
echo "DB2 INSTANCE PROFILER UTILITY"
echo "1 = DTRND1"
echo "2 = SCGND1"
echo "3 = SCGND2"
echo "4 = SCGND3"
echo "5 = DTRNL1"
echo "6 = SCGNL1"
echo "7 = SCGNL2"
echo "8 = SCGNL3"
echo "Please enter the number of the instance you want to profile:\c"
read name

case $name in
 "1") . /dbhome/dtrnd1/sqllib/db2profile
      db2 get instance;;
 "2") . /dbhome/scgnd1/sqllib/db2profile
      db2 get instance;;
 "3") . /dbhome/scgnd2/sqllib/db2profile
      db2 get instance;;
 "4") . /dbhome/scgnd3/sqllib/db2profile
      db2 get instance;;
 "5") . /dbhome/dtrnl1/sqllib/db2profile
      db2 get instance;;
 "6") . /dbhome/scgnl1/sqllib/db2profile
      db2 get instance;;
 "7") . /dbhome/scgnl2/sqllib/db2profile
      db2 get instance;;
 "8") . /dbhome/scgnl3/sqllib/db2profile
      db2 get instance;;

     *) echo "Your did not pick a valid instance";;
esac

What I want to create is one script I can run on any server so I'm attempting to do something similar using the output of db2ilist. I can build the pick list, but I'm not sure how I can use that output to dynamically create a case.

Code:
#!/bin/sh
echo "DB2 INSTANCE PROFILER UTILITY"
ilist=$(db2ilist)
i='0'

for instance in $ilist
do
i=`expr $i + 1`
echo $i " = " $instance



done

# 2  
Old 06-13-2012
Bumping up posts or double posting is not permitted in these forums.

Please read the rules, which you agreed to when you registered, if you have not already done so.

You may receive an infraction for this. If so, don't worry, just try to follow the rules more carefully. The infraction will expire in the near future

Thank You.

The UNIX and Linux Forums.


>>> On request of user, opening this thread and closing the other.

Last edited by joeyg; 06-13-2012 at 03:53 PM..
This User Gave Thanks to joeyg For This Post:
# 3  
Old 06-13-2012
Hi!

IMHO if you could use bash instead of sh, there would be a trivial solution using select instead of case:

Code:
#!/bin/bash
INSTANCE=""
while [[ $INSTANCE = "" ]]; do
    echo "DB2 INSTANCE PROFILER UTILITY"
    echo "Please enter the number of the instance you want to profile:"
    select INSTANCE in $(db2ilist); do
         if [[ $INSTANCE = "" ]]; then
              echo "Please enter a valid number. Retry."
         else {
              . /dbhome/${INSTANCE}/sqllib/db2profile
              db2 get instance; }
          fi
          break
          done
     done
exit 0

I don't think it's possible to do it dinamically with case.
This User Gave Thanks to Lem For This Post:
# 4  
Old 06-13-2012
Quote:
Originally Posted by Lem
I don't think it's possible to do it dinamically with case.
Of course it is. Bash isn't a shell well suited to scripting at all IMHO and should be avoided at all costs.

I suspect you are on an AIX system (btw. always say which system you work on - they all differ in some or other subtle regard and the answer you get might not work on your particular OS) and then "sh" is just a link to a ksh88. I am gonna use that as a basis for the script.

Your script will not work with "case"s like you did in the static version, but with a simple consistency check:

First, we read the output of "db2ilist" into an array:

Code:
#!/bin/ksh

typeset -i iCnt=0
typeset    chInstance=""
typeset -u chUInst=""
typeset -i iSelect=0
typeset    chSelect=""

(( iCnt = 1 ))
db2ilist | while read chInstance ; do
     achInstName[$iCnt]="$chInstance"
     (( iCnt += 1 ))
done

We now have an array with all the instance names. No we will use this to display a list of them along with a choice:

Code:
tput clear
print - "Enter the corresponding number to start the instance:\n"
(( iCnt = 1 ))
while [ $iCnt -le ${#achInstName[*]} ] ; do
     chUInst="${achInstName[$iCnt]}"
     printf "%2d)  %15s\n" "$iCnt" "$chUInst"
     (( iCnt += 1 ))
done
print - "\n\n      Enter your pick (0 to abort) ==>"
read chSelect

Now that we have displayed the menu and gotten some user response in "$chSelect", we have to make sure the pick is valid - an integer and within the range of our array.

the first test is if the text entered is an integer number at all - only digits 0-9, nothing else. We throw these digits out and if anything remains the users pick was invalid. Otherwise we copy this to a predefined integer variable.

The next test is if it is a "0", which means "Abort" - we exit.

Then a test, if it is between 1 and the maximum index of our array - if no, we complain and exit (start over?) if yes, we have a valid answer and continue.

Code:
if [ "$(print - $chSelect | tr -d '0-9')" != "" ] ; then
     print -u2 "Error: only the given numbers or 0 as input allowed." 
     exit 1
else
     iSelect=$chSelect
fi

if [ $iSelect -eq 0 ] ; then
     print -u2 "User selected abort, exiting..."
     exit 0
fi

if [ $iSelect -le ${#achInstName[*]} ] ; then
     . /dbhome/${achInstName[$iSelect]}/sqllib/db2profile
     db2 get instance
else
     print -u2 "Error: User entered an invalid pick number. Exiting."
     exit 1
fi

exit 0

I hope everything is well understandable from my comments. some of the not-so-obvious devices explained:

"${#arrayname[*]}" expands to the number of elements in the array.

"typeset -u" declares a variable which content is automatically converted to upper case upon load. Sort-of a built-in "toupper()" function.

I hope this helps.

bakunin
These 2 Users Gave Thanks to bakunin For This Post:
# 5  
Old 06-14-2012
Quote:
Originally Posted by bakunin
Of course it is.
Of course it is possible to solve the problem in many ways, but I still don't see a way to dinamically create the entries of a case command.
In bash there's select command for this kind of things.
If I'm wrong, which is always extremely possible when the matter is shell scripting, I'd really appreciate a hint from you about the solution.

Quote:
Bash isn't a shell well suited to scripting at all IMHO and should be avoided at all costs.
My shells knowledge is so little that I can't discuss this topic.
But I'm a bit.. confused.

What was so wrong with my script?
And, of course, also in bash you can use an array as you've done in ksh (moreover, it had been my first think: but then select came to my mind, and it does the work, and it's much quicker. So why not use it, if bash is available?).

Quote:
I suspect you are on an AIX system [...]
LOL! Smilie
Of course you're speaking to the OP.
AIX... I'm not a sysadmin, nor my job is heavily computer related. So, AIX... (AKA "blood and tears", as someone says): I - personally - have never seen an AIX system. Smilie
# 6  
Old 06-14-2012
Quote:
Originally Posted by Lem
Of course it is possible to solve the problem in many ways, but I still don't see a way to dinamically create the entries of a case command.
This is correct, i'll give you that. Sorry for misreading your post before, but i was under the impression that you mean it is not possible to solve the problem while you obviously meant it is not possible to create case-statements dynamically.


Regarding bash not being well suited for scripting.
Quote:
Originally Posted by Lem
My shells knowledge is so little that I can't discuss this topic.
But I'm a bit.. confused.
Sorry again, what i said was just an off-topic remark. The reasons for this personal opinion of mine are many but it is quite off-topic here to discuss it. If you are interested I'll send you some pointers per PM, we even have some threads here aobut the shortcomings of bash compared to ksh.

Quote:
Originally Posted by Lem
What was so wrong with my script?
Nothing at all. If you compare my script and yours closely the logic is similar. The difference is i commented it heavily (the threads O/P comes across as not so experienced in shell scripting and probably will need that to understand the flow of the program), i explained how he could implement the input checks, which come with the "case..esac" and which are missing in your script and i used the shell i suppose he already uses (ksh) because of - as stated - i suppose he works on an AIX system. The reason for this is he uses DB/2 as a database, which is from IBM. AIX is IBMs Unix derivate and it is conceivable that a company buying the database from one vendor will buy the hardware and the OS from the same vendor.

Quote:
Originally Posted by Lem
And, of course, also in bash you can use an array as you've done in ksh (moreover, it had been my first think: but then select came to my mind, and it does the work, and it's much quicker. So why not use it, if bash is available?).
"select" as well as arrays are available in ksh and bash alike - even with an identical syntax. I decided against it in my solution because i wanted better control over the output ("select" always goes to <stderr> for instance) and the program flow. It is just usually better to stick to the default shell on any system. For the same reasons i advocate the ksh here on a - probable- AIX system i would advocate using the bash on, say, a GNU/Linux system, even if i still think ksh is the better shell, but that is just personal conviction. ksh is the default shell here, bash is the one there and hence they should be used accordingly if at all possible.



Quote:
Originally Posted by Lem
LOL! Smilie
Of course you're speaking to the OP.
AIX... I'm not a sysadmin, nor my job is heavily computer related. So, AIX... (AKA "blood and tears", as someone says): I - personally - have never seen an AIX system. Smilie
Yes, that was addressing the OP. AIX evolved from being "the best MVS IBM ever created" (this was the saying back in the days of AIX 3.2.3, when i started working with it - ~1993) to one of the most widely spread and most standard-adhering Unixes at all (5L and above). If you buy hardware from IBM (the POWER6 and POWER5 processors were by far the fastest processors of their times, so many companies did exactly that) you will have to use either Linux or AIX and most companies used AIX in this case.

I hope we have sorted out the misunderstandings.

bakunin
# 7  
Old 06-14-2012
Quote:
Originally Posted by bakunin
[...] we even have some threads here aobut the shortcomings of bash compared to ksh [...]
I'm surely going to read at least some of them. Smilie
Thank you for all the info.

As I wrote in another message, I'm a scripting newbie, and shells (well, bash and a very little more) are only my latest hobby. So I just have to learn. Thanks again. Smilie

As for AIX, I know its importance and diffusion on high level systems... that are out of my reach. Smilie

--
Bye
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Dynamic Variable creation

I am trying to create some variables based on the input by the user, say if user entered 3 then 3 variables and if 5 then 5 variables. I am using a for loop for (( i=1; i <= $num; i++ )) do x="num" x+=$i done When i am using echo $x it will show num1 but now how to create variables... (3 Replies)
Discussion started by: Raj999
3 Replies

2. UNIX for Dummies Questions & Answers

Select all files in a folder based on creation date (ls command)

Hi All, <Re-posting in Correct group> I'm trying to select all the files in a folder that starts with a particular name format and are created in a gven date range using 'ls' command...but i'm not successful.... Example : I'm trying to see all the text files in a folder who names start... (6 Replies)
Discussion started by: Satya C1
6 Replies

3. Red Hat

Command understanding the output file destination in case of standard output!!!!!

I ran the following command. cat abc.c > abc.c I got message the following message from command cat: cat: abc.c : input file is same as the output file How the command came to know of the destination file name as the command is sending output to standard file. (3 Replies)
Discussion started by: ravisingh
3 Replies

4. Red Hat

Dynamic case creation based on output list from a command

I am attempting to create a script that would allow me to list all the instances associated with a DB2 and then prompt the user to choose which one to issue the db2profile command against. I use the db2 command db2ilist to get a list of the instances for a particular server, but the number of... (1 Reply)
Discussion started by: slatoms
1 Replies

5. Shell Programming and Scripting

Conversion from Upper Case to Lower Case Condition based

Hello Unix Gurus : It would be really appreciative if can find a solution for this . I have records in a file . I need to Capitalize the records based on condition . For Example i tried the following Command COMMAND --> fgrep "2000YUYU" /export/home/oracle/TST/data.dat | tr '' ''... (12 Replies)
Discussion started by: tsbiju
12 Replies

6. Shell Programming and Scripting

Parsing dynamic data from a command output

Hi people, I am writing a korn shell script, and one of the command gives an output something like below: release.label.2010.03.02 objects: /project/path/to/some/file_name.ksh /project/path/another/file_name01.dat I have to retrieve the file paths one by one & use them as... (9 Replies)
Discussion started by: kiwin1000
9 Replies

7. UNIX for Advanced & Expert Users

Dynamic file creation

This my script ls *.ksh ls *.ksh > a.txt i=1 cat "a.txt" | while read a do if then echo "abc" echo "abc" > m.ksh echo "m.ksh" >> a.txt i=2 fi echo $a done ls *.ksh -------------------------- My Output is a.ksh - > first ls *.ksh (1 Reply)
Discussion started by: kingganesh04
1 Replies

8. Shell Programming and Scripting

Creating a dynamic case statement

I'm using the korn shell and trying to create a case statement from the contents of a file that is changed regularly, each line of the file has three fields, eg track1 202.111.111.111 99 room7 222.111.222.333 76 I'm using awk to select each variable. I've been unable to figure out how to... (5 Replies)
Discussion started by: squrcles
5 Replies

9. Shell Programming and Scripting

Creation of output file from list of file

Hi Guru's, Eventhough I know basic shell scripting, Iam not an expert. Can any one help me to get a logic/answer for the below requirement: I've to create an output file "outputfile.txt" from many datafiles (ex: abc.dat, xyz.dat). Header record layout for "outputfile.txt" should be... (7 Replies)
Discussion started by: ganapati
7 Replies

10. Shell Programming and Scripting

Creation of log file under dynamic date folder

HI I want to create a date folder and then a log file under it, which will hold all output of shell script. Say shell script abc.sh runs every day and I want to redirect the output of abc.sh > /opt/bea/wls81/Pkmtest/$(date +%Y%m%d)/ant.log. Here date should always change according to system... (2 Replies)
Discussion started by: pankajkrmishra
2 Replies
Login or Register to Ask a Question