Czy istnieje sposób na zmianę argumentów wiersza poleceń w skrypcie Bash? Na przykład skrypt Bash jest wywoływany w następujący sposób:
./foo arg1 arg2
Czy istnieje sposób na zmianę wartości arg1 w skrypcie? Coś jak:
$1="chintz"
Odpowiedzi:
Musisz zresetować wszystkie argumenty. Aby zmienić np $3
:
$ set -- "${@:1:2}" "new" "${@:4}"
Zasadniczo ustawiasz wszystkie argumenty na ich bieżące wartości, z wyjątkiem tych, które chcesz zmienić. set --
jest również określony w POSIX 7 .
"${@:1:2}"
Notacja jest rozszerzony do dwóch (stąd 2
w zapisie) argumenty pozycyjne począwszy od offsetu 1
(tj $1
). Jest to skrót dla "$1" "$2"
w tym przypadku, ale jest dużo bardziej przydatne, gdy chcesz zastąpić np "${17}"
.
Optymalizując pod kątem czytelności i łatwości konserwacji, możesz lepiej przypisać $1
i $2
do bardziej znaczących zmiennych (nie wiem, input_filename = $1
i output_filename = $2
czy coś), a następnie nadpisać jedną z tych zmiennych ( input_filename = 'chintz'
), pozostawiając dane wejściowe dla skryptu niezmienione, na wypadek, gdyby tak było potrzebne gdzie indziej.
Wiem, że to stary, ale odpowiedź thkala okazała się bardzo pomocna, więc skorzystałem z pomysłu i nieco go rozwinąłem, aby umożliwić mi dodanie wartości domyślnych dla dowolnego argumentu, który nie został zdefiniowany - na przykład:
# set defaults for the passed arguments (if any) if not defined.
#
arg1=${1:-"default-for-arg-1"}
arg2=${2:-"default-for-arg-2"}
set -- "${arg1}" "${arg2}"
unset arg1 arg2
Mam nadzieję, że przyda się to komuś innemu.