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 2w 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ć $1i $2do bardziej znaczących zmiennych (nie wiem, input_filename = $1i output_filename = $2czy 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.