Default values for positional parameters - dummy question I think


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Default values for positional parameters - dummy question I think
# 1  
Old 05-14-2015
Default values for positional parameters - dummy question I think

Hi,

Sorry for a dummy question I believe. I am just wanting to know how do I assign a default $1 argument if one is not provided.

At the moment, I am doing something like below:

Code:
arg1="${1:-foo}"

And then I check $arg1 in case/esac. I am just wondering if there is a way for me to simply do ${1:-foo} and check $1 in case/esac.

At the moment, if I simply do ${1:-foo} and run the script, it seem to be trying to run the foo command instead. Script is working fine just curious for whether I can set $1 to a default value without having to assign it to a variable.

FYI, the script is in ksh.

Thanks in advance.
# 2  
Old 05-14-2015
You don't need to assign to a variable. Anywhere in your script you can use ${1:-foo} in lieu of $1.
# 3  
Old 05-14-2015
While this works well on short script, with just a single invocation of it, but as soon there are more than one occourence of this syntax, you'll need to change all of them rather than just a single variable assignment.

---------- Post updated at 18:38 ---------- Previous update was at 18:33 ----------

But anyway, have a look at:
Code:
echo "1:$1 2:$2 3:$3"
set 15 30 45
echo "1:$1 2:$2 3:$3"
shift
echo "1:$1 2:$2 3:$3"

Have fun
# 4  
Old 05-14-2015
In fact you are doing it more right then wrong: declare (sensible) default values for variables not explicitly stated at the commandline. You might want to explore the "getopts" command in ksh for passing certain values to a script, which works mostly the same way as the "getopt" OS command.

Quote:
Originally Posted by newbie_01
Sorry for a dummy question I believe. I am just wanting to know how do I assign a default $1 argument if one is not provided.
In short: not at all! You see, "$1" is the first parameter passsed on the commandline and if this is empty, it is empty. Analogous for "$2", "$3", etc..

Consider the OS command line:

Code:
command abc 123 def

The command "command" is passed "abc" as the first parameter, "123" as the second and "def" as the third. If "command" wouldl be a ksh script "$1" would be set to "abc" and so on. If you pass fewer parameters then less of these variables are set. Otherwise, if you pass more then "$4" and so on also will have values.

But usually you want parameters to have a certain meaning and ideally this meaning is not dependent on the place where the variable is passed:

Code:
command file1 file2

If the first parameter passed is a configuration file and the second one an output destination this:

Code:
command file2 file1

would not only fail but probably first try to read file2 as configuration, then destroy your real configuration in file1 by overwriting it. Better would perhaps be:

Code:
command -c configfile -o outputfile

because what is config and what is output will be stated by the option preceeding it. These two calls:

Code:
command -c configfile -o outputfile
command -o outputfile -c configfile

will both work the same. This mechanism is indeed standardized and "getopts" is a command to standardizedly parsing your commandline. Here is code for the above example

Code:
#! /bin/ksh

typeset chOpt=""

while getopts "o:c:" chOpt ; do                  # process commandline
     
    case "$chOpt" in
          c)                                       # set config file
               fConfig="$OPTARG"
               ;;

          o)                                       # set output file
               fOutput="$OPTARG"
               ;;

     esac
done

This leaves just one problem: what if the user does not set one of the necessary options? You can either do it like you already did: assign a default value in case the values is not already set. This could be done via adding a last line in the code above with your construct. The other way is to set the default before:


Code:
#! /bin/ksh

typeset fOutput="/my/default/output"
typeset fConfig="/default/config.file"
typeset chOpt=""

while getopts "o:c:" chOpt ; do                  # process commandline
     
    case "$chOpt" in
          c)                                       # set config file
               fConfig="$OPTARG"
               ;;

          o)                                       # set output file
               fOutput="$OPTARG"
               ;;

     esac
done

print - "final config file is: $fConfig"
print - "final output file is: $fOutput"

I suggest you try this script with various invocations, with and without one or all parameters.

Hint: robust script programming would mean to actually test files for existence/non-existence and issue warnings about an output file that already exists or a config file which doesn't (or is not readable). I have skipped that here to make the example as simple as possible.

I hope this helps.

bakunin
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Positional parameters in if statement

I am trying to code an if statement that accepts two parameters and see if those parameters are in another file called teledir.txt. If it already exists in the file, it is to say "Entry Exists". If not, I add it to the file and say "Entry Added". This is the code I have so far: if ; then ... (1 Reply)
Discussion started by: Eric7giants
1 Replies

2. UNIX for Beginners Questions & Answers

'sed' with Positional Parameters

I'm new with 'sed' and for sure something still I don't understand yet with it. If you see my output on ">Output..." portion, the new directory still on "source_dir" instead of "dest_dir". You may disregard for the "tar" part, this is just a test script, just for me to understand 'sed' using the... (3 Replies)
Discussion started by: daryl0505
3 Replies

3. Shell Programming and Scripting

Bash Positional Parameters Question

In a Bash script I used getopts command to let a user does something regards to the selected options. The question is: How do you find out what is the name of the file that user inserted in the command line like the following: The good part is this file is always the last argument in the... (2 Replies)
Discussion started by: bashily
2 Replies

4. Shell Programming and Scripting

checking the positional parameters

Hi all, I have one small requirment... I have prepared one script. we have to pass two possitional parameters to the script. What I want to do is if the parameters are not passed then i dont want the script to start the process... For ex: $ ./a.sh parm1 parm2 #Here, it can start... (7 Replies)
Discussion started by: raghu.iv85
7 Replies

5. UNIX for Dummies Questions & Answers

Positional Parameters

Can someone tell me in more layman's terms what positional parameters are and give a good example? My book again is confusing me. :confused: (1 Reply)
Discussion started by: Straitsfan
1 Replies

6. Shell Programming and Scripting

Setting "default" positional parameters (in bash)

Hi, I have a script that processes the positional parameters provided on the command line, or - if none are provided - uses some defaults instead. I've currently got it written as follows, which works like a charm, but I was wondering if there is a different/other/better/... way of doing... (2 Replies)
Discussion started by: pvdb
2 Replies

7. Shell Programming and Scripting

Resetting the Positional parameters values

Hi, Can any one provide the Unix command to reset the positional parameters? Please see the below example where i have to pass 2 parameters to Shell1.sh. Step1) . ./Shell1.sh 2 3 successfully executed, Then i executed(next step only) the same shell script again,this time no... (4 Replies)
Discussion started by: nmk
4 Replies

8. UNIX for Dummies Questions & Answers

Positional parameters

I need to get file names from commandline arguments, it may be any no of arguements, Using for loop i got but how do i display it, bcoz $i will give the number i is assigned $$i is not working either $($i), i need the names of the files got in the arguement (2 Replies)
Discussion started by: shalu@ibm
2 Replies

9. UNIX for Dummies Questions & Answers

Positional Parameters

Hello, I am using the Bourne shell. I am trying to understand the concept of positional parameters. I do understand that positional parameters: 1. Are initialized by shell 2. Have a max of 9 parameters ($1 to $9) 3. Have no limit on the number of arguments 4. Can be rearranged... (15 Replies)
Discussion started by: ericelysia
15 Replies

10. Shell Programming and Scripting

Positional Parameters

HPUX11.0/Korn Shell I have an old script that takes in a series of arguments when its called. The script is really more of a common set of functions that gets called by other scripts as needed. I have been asked to make this into a menu driven script to rollout to app support for their use during... (2 Replies)
Discussion started by: google
2 Replies
Login or Register to Ask a Question