View Single Post
Old 02-26-2004, 02:55 AM   #1 (permalink)
Silvy
paranoid
 
Silvy's Avatar
 
Location: The Netherlands
Shell scripting help (bash)

Hi,

I have the following problem:
I would like a script to decide on a commandline that should be executed.
This descision is based on the arguments passed to the script.
The possibilities for the commandline-to-be-executed are fixed, and declared at the beginning of the script.

script flow:
- declaration of possible command calls (CALL_A and CALL_B , see below)
- case statement on the argument $1 that either sets (CALL=CALL_A or CALL=CALL_B)
- exectute CALL

This works fine in most cases, except when CALL_A or CALL_B use an output re-director.
If I declare CALL_A="ls -al >test.txt"
then ls is executed with "-al" and ">test.txt" as parameters, causing an error because ls can't find the file ">test.txt".

I realize this might sound fuzzy, so I wrote 2 scripts as an example:

Script 1:
(echo's all arguments that were passed to it. this allows you to see how the commandline was interpreted.)
Code:
#!/bin/bash 
#prints the first 4 arguments that are passed to it.  $0 is the name of the script!
#
if [ -n $0 ]
then
   echo "arg 0: $0" 
fi
if [ -n $1 ] then
   echo "arg 1: $1" 
fi 
if [ -n $2 ] then
   echo "arg 2: $2" 
fi 
if [ -n $3 ] then   
  echo "arg 3: $3" 
fi 
if [ -n $4 ] then 
   echo "arg 4: $4" 
fi
Script 2:
(This script is giving me troubles, it runs the above script with normal or redirected output commandlines. The second type should echo into a file and not on screen.)
Code:
## testing script

#command to run:
CALL_A="./arg_check 1st 2nd 3rd 4th"
CALL_B="./arg_check 1st >result.txt"

#select command based on argument, or present helpful message:
if [ -n "$1" ]  #test wether $1 has been initialized
then
  case "$1" in
  "a" ) CALL=$CALL_A ;;
  "b" ) CALL=$CALL_B ;;
  * ) echo "Duh, enter a or b"
      exit 1 ;;
  esac
else
  echo "Enter a or b as an argument please"
  exit 1;
fi

#call the chosen command:
$CALL
If you copy/save these scripts as "arg_check" and "testscript" respectively, you can run "./testscript a" or "./testscript b" to see the results. (remember to chmod +x them both)

You'll notice that the CALL_B commandline if executed directly on the prompt behaves as expected: the output of "arg_check a" is redirected to "result.txt"

I'd REALLY like to know what in the second script I should change to get the expected result: i.e.
./testscript a results in output to screen
./testscript b results in output to file

Note: It's not really an option to remove the declarations and "$CALL" statement, and move the commandlines directly into the case statement (which would work irf you used "backticks": `) as the script this is meant for uses several sources and checks to build and conditionally execute the commands.

2nd note: I'm quite new to shell scripting so if you have any tips, please post them! Also if this code is laughable: any constructive comments are really appreciated!

EDIT: edited because the "submit" button is a lot more attractive than the one for "preview"
__________________
"Do not kill. Do not rape. Do not steal. These are principles which every man of every faith can embrace. "
- Murphy MacManus (Boondock Saints)

Last edited by Silvy; 02-26-2004 at 03:00 AM..
Silvy is offline  
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38