how do I say "if myvar = doe or ray or mii"


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting how do I say "if myvar = doe or ray or mii"
# 1  
Old 06-02-2008
how do I say "if myvar = doe or ray or mii"

Ok, I have what I think is a relatively simple question, but being me I'll give the full background. In writing a new CheckSystem for one of my servers at work I want to check for core dumps. I was originally doing this like so:
Code:
dumps=`ls -ltr /dvs/dncs/tmp/corefiles/|awk '{print $9}'|egrep "qamManager|dsm|drm|";ls -ltr /dvs/dncs|awk '{print $9}'|grep core`
if [ "$dumps" = "drm" ]
then 
echo "###################################"
echo "There has been a core dump for the following Processes:"
echo "###################################"
ls -ltr /dvs/dncs/tmp/corefiles|grep drm
echo "###################################"
fi

if [ "$dumps" = "dsm" ]
then
echo "###################################"
echo "There has been a core dump for the following Processes:"
echo "###################################"
ls -ltr /dvs/dncs/tmp/corefiles|grep dsm
echo "###################################"
fi
if [ "$dumps" = "qamManager" ]
then
echo "###################################"
echo "There has been a core dump for the following Processes:"
echo "###################################"
ls -ltr /dvs/dncs/tmp/corefiles|grep qamManager
echo "###################################"
fi
if [ "$dumps" = "core" ]
then
echo "###################################"
echo "There has been a core dump for the following Processes:"                                                                                    
echo "###################################"                                                                                                                   
ls -ltr /dvs/dncs/|grep core
echo "###################################"   
fi

I know this works as we (unfortunately) had a dump on Saturday, and the script now returns

Code:
###################################
There has been a core dump for the following Processes:
###################################
drwxrwxrwx   3 dncs     dncs         512 May 31 23:49 drm
###################################

However this seemed like a sloppy implementation to me, plus I realized (oddly enough while on a rollercoaster at 6 flags today) that in the event of more than one core dump the script isn't going to work as the variable isn't going to match. So tonight I (agonizingly) amended the script to:

Code:
dumps=`(ls -ltr /dvs/dncs/tmp/corefiles/|awk '{print $9}'|egrep "qamManager|dsm|drm|";ls -ltr /dvs/dncs|awk '{print $9}'|grep core)`
for x in $dumps;
do  
if [ $x = "drm" ]
then 
echo "###################################"
echo "There has been a core dump for the following Processes:"
echo "###################################"
ls -ltr /dvs/dncs/tmp/corefiles|grep drm
echo "###################################"
fi
done

Now, this works...but only because it specifies just the one thing that I know it's going to match. I don't know the syntax on how to say "if $x = drm or dsm or qamManager or core then yadda yadda yadda" and I assume that there must be a way to do this with out running 4 different for/if loops.

I'm pretty certain that I could work my way around this issue by echoing $dumps and feeding it through a nawk statement... (I know my logic slightly better in nawk) but I'm trying to fill in my fundamental skills. I know this is a really basic question but I'd any help I'd appreciate.

Also, as with everything I post here, if anyone has an overall criticism on my implementation of solving my problem, I'd love to hear it...that's how you learn.

(oh, this is all in bash, you can't see the shebang line as this is cut from larger scripts)
# 2  
Old 06-02-2008
Why does the ls need to be in a conditional anyway?

Code:
for x `ls -ltr /dvs/dncs/tmp/corefiles/|awk '/qamManager|dsm|drm|what/{print $9}';
    ls -ltr /dvs/dncs|awk '/core/{print $9}'`
do
  echo There has been a core dump for the following process:
  dir=/dvs/dncs/tmp/corefiles
  case $x in core) do dir=/dvs/dncs;; esac
  ls -lrt $dir/$x
done

Your egrep had an empty regular expression, which makes it list all lines. I changed it to "what" on the assumption that you took something out for privacy reasons, and it's not really meant to be empty.

Last edited by era; 06-02-2008 at 06:28 AM.. Reason: made $dir a variable
# 3  
Old 06-02-2008
But to answer the question...
Code:
#! /usr/local/bin/bash
shopt -s extglob
while : ; do
        printf "enter something - "
        read var
        if [[ $var = @(doe|ray|mii) ]] ; then
                echo matched
        elif [[ $var = "done" ]] ; then
                exit 0
        fi
done

And leave that shopt command in when you try it.
# 4  
Old 06-02-2008
Quote:
Originally Posted by era
Why does the ls need to be in a conditional anyway?

Code:
for x `ls -ltr /dvs/dncs/tmp/corefiles/|awk '/qamManager|dsm|drm|what/{print $9}';
    ls -ltr /dvs/dncs|awk '/core/{print $9}'`
do
  echo There has been a core dump for the following process:
  dir=/dvs/dncs/tmp/corefiles
  case $x in core) do dir=/dvs/dncs;; esac
  ls -lrt $dir/$x
done

Your egrep had an empty regular expression, which makes it list all lines. I changed it to "what" on the assumption that you took something out for privacy reasons, and it's not really meant to be empty.
I suppose the ls, doesn't have to be in there, it's just how I've come to set up variables... x=`yadda` (I didn't mean to leave the () around the variable, that was a remnant from a syntax test).

That last pipe on the egrep is a typo, left from when I had thought that all four dumps were in the same directory.

I'm not sure I follow all of what you did there, but I'll go through the parts I think I get and you can tell me where I'm wrong (if you don't mind)

Code:
for x `ls -ltr /dvs/dncs/tmp/corefiles/|awk '/qamManager|dsm|drm|what/{print $9}';
    ls -ltr /dvs/dncs|awk '/core/{print $9}'`

x is any element of the array that is created from everything that follows, which is ls -ltr /mydir...then using awk instead of egrep to isolate the things I was looking for and printing the 9th column same as before

Code:
do
  echo There has been a core dump for the following process:
  dir=/dvs/dncs/tmp/corefiles
  case $x in core) do dir=/dvs/dncs;; esac
  ls -lrt $dir/$x
done

I think what you're saying is
-echo yadda...
-set a variable called dir which is simply the name of the path...
*I don't know case yet, but from what I gather looking at your usage, I assume it means something along the lines of:
-in the event that any of the elements of the array are in core than set dir to /myotherpath
-ls -ltr the path/name of the element

Am I following the commands more or less correctly?

Now if you do it like this, what happens if there is a dump in lets say, qamManager and core? won't the way that the dir variable is changed dependent on the location of x throw off the final output?

Oh, and just as an overall comment, I really appreciate the way that you answered this. You mostly stuck with the same method I was trying to use, just tweaked it so that it...you know...works. I've noticed many people on this board throw out all kinds of awesome exotic answers that while yeah they do what you're trying to get done, don't exactly facilitate learning. (I'm not sure if that made sense...but I've been awake for ~40 hours)

Last edited by DeCoTwc; 06-02-2008 at 06:57 AM.. Reason: no sleep and no beer make DeCo something something...and noticed a silly typo
# 5  
Old 06-02-2008
Quote:
Originally Posted by Perderabo
But to answer the question...
Code:
#! /usr/local/bin/bash
shopt -s extglob
while : ; do
        printf "enter something - "
        read var
        if [[ $var = @(doe|ray|mii) ]] ; then
                echo matched
        elif [[ $var = "done" ]] ; then
                exit 0
        fi
done

And leave that shopt command in when you try it.
I really appreciate the response, but I honestly don't understand pretty much any of it with the possible exception of the overall if/elif. But even then it's not done in a way I'm familiar with. It's my fault as I'm a very basic user, but I suppose now I have I have some new things to try to research (IE: shopt -s extglob)
# 6  
Old 06-02-2008
Quote:
Originally Posted by DeCoTwc
*I don't know case yet, but from what I gather looking at your usage, I assume it means something along the lines of:
-in the event that any of the elements of the array are in core than set dir to /myotherpath
It's basically equivalent to "if"; it's just another way of saying "if x is foo then set dir to bar". It compares the current value of x, not "any of the elements of the array". (Strictly speaking there isn't an "array" involved, just a list of tokens, which are file names.)

Quote:
Now if you do it like this, what happens if there is a dump in lets say, qamManager and core? won't the way that the dir variable is changed dependent on the location of x throw off the final output?
There will be two iterations, one where x is set to qamManager and one iteration when x is core
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. AIX

Apache 2.4 directory cannot display "Last modified" "Size" "Description"

Hi 2 all, i have had AIX 7.2 :/# /usr/IBMAHS/bin/apachectl -v Server version: Apache/2.4.12 (Unix) Server built: May 25 2015 04:58:27 :/#:/# /usr/IBMAHS/bin/apachectl -M Loaded Modules: core_module (static) so_module (static) http_module (static) mpm_worker_module (static) ... (3 Replies)
Discussion started by: penchev
3 Replies

2. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

3. UNIX for Dummies Questions & Answers

Using "mailx" command to read "to" and "cc" email addreses from input file

How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address and column 3 contains “cc” e-mail address to include with same email. Sample input file, email.txt Below is an sample code where... (2 Replies)
Discussion started by: asjaiswal
2 Replies

4. Solaris

The slices "usr", "opt", "tmp" disappeared!!! Help please.

The system don't boot. on the screen appears following: press enter to maintenance (or type CTRL-D to continue)...I checked with format command. ... the slices "0-root","1-swap","2-backup" exist. ...the slises "3-var","6-usr" -unassigned. :( (16 Replies)
Discussion started by: wolfgang
16 Replies

5. Shell Programming and Scripting

how to use "cut" or "awk" or "sed" to remove a string

logs: "/home/abc/public_html/index.php" "/home/abc/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" how to use "cut" or "awk" or "sed" to get the following result: abc abc xyz xyz xyz (8 Replies)
Discussion started by: timmywong
8 Replies

6. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

7. Shell Programming and Scripting

ps -ef | grep "string1" "string2" " "string3"

Hi all, can any one suggest me the script to grep multiple strings from ps -ef pls correct the below script . its not working/ i want to print OK if all the below process are running in my solaris system. else i want to print NOT OK. bash-3.00$ ps -ef | grep blu lscpusr 48 42 ... (11 Replies)
Discussion started by: steve2216
11 Replies

8. Shell Programming and Scripting

cat $como_file | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g'

hi All, cat file_name | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g' Can this be done by using sed or awk alone (4 Replies)
Discussion started by: harshakusam
4 Replies

9. UNIX for Dummies Questions & Answers

Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`"

Hi Friends, Can any of you explain me about the below line of code? mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'` Im not able to understand, what exactly it is doing :confused: Any help would be useful for me. Lokesha (4 Replies)
Discussion started by: Lokesha
4 Replies
Login or Register to Ask a Question