15

So I have a question about get opts in bash. I want to get the value of the arguments if they are present but if they are not present to use a default value. So the script should take a directory and an integer but if they aren't specified then $PWD and 3 should be default values. Here is what

while getopts "hd:l:" opt; do case $opt in d ) directory=$OPTARG;; l ) depth=$OPTARG;; h ) usage exit 0;; \? ) usage exit 1;; esac 

2 Answers 2

32

You can just provide default value before while loop:

directory=mydir depth=123 while getopts "hd:l:" opt; do case $opt in d ) directory=$OPTARG;; l ) depth=$OPTARG;; h ) usage exit 0;; *) usage exit 1;; esac done echo "<$directory> <$depth>" 
Sign up to request clarification or add additional context in comments.

9 Comments

So I did that (makes total sense) but the directory and depth never change
So if the argument exists then I want to change the variable directory to whatever is passed into option -d but if it is not present then just leave it at the current working directory.
you can just do -d ) cd "$OPTARG";; for that
it does change but shell scripts are run in a sub shell so changed directory is not reflected in parent shell
also I need to humbly point that question was about setting default values which my answer provides. Would it not be better to ask a separate question about directory changing problem after accepting this answer.
|
2

After your getopts, try this

if [ -z "$directory" ]; then directory="directory"; fi

-z means if the variable $directory is null or empty. Then if user doesnt enter an argument for -d, then the script will default to directory="/whatever/files/"

At least if I understand your question correctly, this should give you a default value for -d if a value is not entered.

1 Comment

Please provide additional details in your answer. As it's currently written, it's hard to understand your solution.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.