Respostas:
Você tem que redefinir todos os argumentos. Para mudar, por exemplo $3:
$ set -- "${@:1:2}" "new" "${@:4}"
Basicamente, você configura todos os argumentos com seus valores atuais, exceto aquele (s) que deseja alterar. set --também é especificado por POSIX 7 .
A "${@:1:2}"notação é expandida para os dois (daí os 2na notação) argumentos posicionais começando do deslocamento 1(isto é $1). É uma abreviação de "$1" "$2"neste caso, mas é muito mais útil quando você deseja substituir, por exemplo "${17}".
Otimizando para legibilidade e manutenção, você pode ser melhor atribuir $1e $2para variáveis mais significativas (eu não sei, input_filename = $1e output_filename = $2ou algo assim) e, em seguida, sobrescrever uma dessas variáveis ( input_filename = 'chintz'), deixando a entrada para o script inalterada, caso seja necessário em outro lugar.