Sh1r
Sh1r

Reputation: 55

how to pass other arguments besides flags

I am trying to execute my file by passing in an absolute path as the first argument ($1). I also want to add flags from that absolute path onward, but i do not know how to tell optargs to start counting from $2 forward since if i pass in the absolute path as the $1 it seems to break the getopts loop.

I'm gussing i have to implement a shift for the first argument in the following code:

while getopts :lq flag; do
case $flag in
l) echo "executing -l flag"
;;
q) echo "executing -q flag"
;;
esac
done

I'm not sure how to approach this. Any tips are welcome, thank you.

Upvotes: 1

Views: 94

Answers (2)

Utsav Chokshi
Utsav Chokshi

Reputation: 1395

Keep the options before file argument (i.e. absolute path). Many standard bash commands follow the same practice.

Example :

wc -wl ~/sample.txt
ls -lR ~/sample_dir

So if you follow the above practice, your code goes like this. This code works even if options are not provided. In general, that is the desired behavior with options.

# Consider last argument as file path
INPUT_FILEPATH=${*: -1} 
echo $INPUT_FILEPATH

# Process options
while getopts :lq flag
do
case $flag in
l) echo "executing -l flag"
;;
q) echo "executing -q flag"
;;
esac
done

Sample execution :

bash sample.sh /home/username/try.txt

/home/username/try.txt

bash sample.sh -lq /home/username/try.txt

/home/username/try.txt
executing -l flag
executing -q flag

Upvotes: 1

chepner
chepner

Reputation: 530940

getopts does, indeed, stop processing the arguments when it sees the first non-option argument. For what you want, you can explicitly shift the first argument if it is not an option. Something like

if [[ $1 != -* ]]; then
    path=$1
    shift
fi

while getopts :lq flag; do
    ...
done

Upvotes: 1

Related Questions