How to change a command line argument in Bash?
You have to reset all arguments. To change e.g. $3
:
$ set -- "${@:1:2}" "new" "${@:4}"
Basically you set all arguments to their current values, except for the one(s) that you want to change. set --
is also specified by POSIX 7.
The "${@:1:2}"
notation is expanded to the two (hence the 2
in the notation) positional arguments starting from offset 1
(i.e. $1
). It is a shorthand for "$1" "$2"
in this case, but it is much more useful when you want to replace e.g. "${17}"
.
Optimising for legibility and maintainability, you may be better off assigning $1
and $2
to more meaningful variables (I don't know, input_filename = $1
and output_filename = $2
or something) and then overwriting one of those variables (input_filename = 'chintz'
), leaving the input to the script unchanged, in case it is needed elsewhere.