Odpowiedzi:
Polecenie powłoki oraz wszelkie argumenty do tego polecenia pojawiają się jako ponumerowanych zmienne powłoki: $0
ma wartość ciągu samego polecenia, coś podobnego script
, ./script
, /home/user/bin/script
czy cokolwiek innego. Wszelkie argumenty pojawiają się "$1"
, "$2"
, "$3"
i tak dalej. Liczba argumentów znajduje się w zmiennej powłoki "$#"
.
Typowe sposoby radzenia sobie z tym obejmują polecenia powłoki getopts
i shift
. getopts
jest bardzo podobny do getopt()
funkcji biblioteki C. shift
przenosi wartość $2
na $1
, $3
do $2
i tak dalej; $#
ulega zmniejszeniu. Kod kończy się na sprawdzeniu wartości "$1"
, robieniu rzeczy przy użyciu case
… w esac
celu podjęcia decyzji o działaniu, a następnie robieniu shift
przejścia $1
do następnego argumentu. Musi to tylko zbadać $1
i być może $#
.
Możesz uzyskać dostęp do przekazanych argumentów, $n
gdzie gdzie n
jest numer argumentu - 1, 2, 3, ...
. Przekazujesz argumenty tak jak w przypadku każdego innego polecenia.
$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
$/shellscriptname.sh argument1 argument2 argument3
Możesz także przekazać dane wyjściowe jednego skryptu powłoki jako argument do innego skryptu powłoki.
$/shellscriptname.sh "$(secondshellscriptname.sh)"
W skrypcie powłoki można uzyskać dostęp do argumentów o liczbach takich jak $1
pierwszy argument i $2
drugi argument i tak dalej.
Formularz
$ ./script.sh "$@"
jest najwygodniejszy dla argv
. Separator arg jest spacją, ale można go zmienić. Nie pamiętam, jak z ręki. Następnie użyj
$1, $2, shift, if [ $# -ne 3 ]
kontrolować przepływ. Zwykle nie przyjmuję getoptów, jeśli case ... esac
wystarczy testament.
W skrypcie bash osobiście lubię używać następującego skryptu do ustawiania parametrów:
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
W tej strukturze nie polegamy na kolejności parametrów, ponieważ definiujemy kluczową literę do każdego z nich. Ponadto funkcja pomocy będzie drukowana za każdym razem, gdy parametry zostaną źle zdefiniowane. Jest to bardzo przydatne, gdy mamy do czynienia z wieloma skryptami o różnych parametrach. Działa w następujący sposób:
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
W skrypcie powłoki; staje się nazwą zmiennej $ 1. Drugie słowo staje się nazwą zmiennej $ 2 i tak dalej.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
Więcej można znaleźć w podręczniku powłoki (sh) na stronie http://heirloom.sourceforge.net/sh/sh.1.html
Jeśli jesteś zaznajomiony z Python Argparse i nie masz nic przeciwko wywoływaniu Pythona w celu analizy argumentów bash, użyj bash argparse ( https://github.com/mattbryson/bash-arg-parse ),
Zobacz tę samą odpowiedź tutaj: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null
------------------------------------------------------------------------
./scriptname.sh value1 value2
2> /dev/null
, 2) nie dodaje niczego do istniejących odpowiedzi.
getopt()
jest niezwykle ugruntowanym standardem, alegetopt
plik wykonywalny nie jest taki sam dla dystrybucji / platformy. Jestem teraz w pełni przekonwertowanymgetopts
użytkownikiem, ponieważ jest to standard POSIX. Działa świetniedash
również z , która jest moją ulubioną powłoką skryptową