/ / Jak mogę dodać metodę pomocy do skryptu powłoki? - unix, shell

Jak mogę dodać metodę pomocy do skryptu powłoki? - Unix, shell

Jak sprawdzić, czy a -h atrybut został przekazany do skryptu powłoki? Chciałbym wyświetlić komunikat pomocy, gdy użytkownik zadzwoni myscript.sh -h.

Odpowiedzi:

111 dla odpowiedzi nr 1

oto przykład bash:

usage="$(basename "$0") [-h] [-s n] -- program to calculate the answer to life, the universe and everything

where:
-h  show this help text
-s  set the seed value (default: 42)"

seed=42
while getopts ":hs:" option; do
case "$option" in
h) echo "$usage"
exit
;;
s) seed=$OPTARG
;;
:) printf "missing argument for -%sn" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
?) printf "illegal option: -%sn" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done
shift $((OPTIND - 1))

27 dla odpowiedzi nr 2

Pierwszy argument skryptu powłoki jest dostępny jako zmienna $1, więc najprostsza implementacja byłaby

if [ "$1" == "-h" ]; then
echo "Usage: `basename $0` [somestuff]"
exit 0
fi

Ale co powiedział Anubhava.


15 dla odpowiedzi nr 3

tutaj jest część, której używam do uruchomienia serwera VNC

#!/bin/bash
start() {
echo "Starting vnc server with $resolution on Display $display"
#your execute command here mine is below
#vncserver :$display -geometry $resolution
}

stop() {
echo "Killing vncserver on display $display"
#vncserver -kill :$display
}

#########################
# The command line help #
#########################
display_help() {
echo "Usage: $0 [option...] {start|stop|restart}" >&2
echo
echo "   -r, --resolution           run with the given resolution WxH"
echo "   -d, --display              Set on which display to host on "
echo
# echo some stuff here for the -a or --add-options
exit 1
}

################################
# Check if parameters options  #
# are given on the commandline #
################################
while :
do
case "$1" in
-r | --resolution)
if [ $# -ne 0 ]; then
resolution="$2"   # You may want to check validity of $2
fi
shift 2
;;
-h | --help)
display_help  # Call your function
exit 0
;;
-d | --display)
display="$2"
shift 2
;;

-a | --add-options)
# do something here call function
# and write it in your help function display_help()
shift 2
;;

--) # End of all options
shift
break
;;
-*)
echo "Error: Unknown option: $1" >&2
## or call function display_help
exit 1
;;
*)  # No more options
break
;;
esac
done

######################
# Check if parameter #
# is set too execute #
######################
case "$1" in
start)
start # calling function start()
;;
stop)
stop # calling function stop()
;;
restart)
stop  # calling function stop()
start # calling function start()
;;
*)
#    echo "Usage: $0 {start|stop|restart}" >&2
display_help

exit 1
;;

To trochę dziwne, że umieściłem start stop restart w osobnej obudowie, ale powinno działać


11 dla odpowiedzi nr 4

Jeśli masz tylko jedną opcję do sprawdzenia i zawsze będzie to pierwsza opcja ($1), wówczas najprostszą opcją jest if z testem ([). Na przykład:

if [ "$1" == "-h" ] ; then
echo "Usage: `basename $0` [-h]"
exit 0
fi

Zauważ, że dla zgodności z posix = będzie działać, jak również ==.

Powód $1 musi być ujęty w cudzysłów, jeśli nie ma $1 wtedy powłoka spróbuje uruchomić if [ == "-h" ] i ponieść porażkę, ponieważ == podano tylko jeden argument, gdy oczekiwał dwóch:

$ [ == "-h" ]
bash: [: ==: unary operator expected

Tak jak zasugerował przez inni, jeśli masz więcej niż jedną prostą opcję lub potrzebujesz opcji akceptowania argumentów, zdecydowanie powinieneś przejść na dodatkową złożoność korzystania getopts. W skrócie lubię 60-sekundowy samouczek Getopts.

Możesz także rozważyć getopt program zamiast wbudowanej powłoki getopts. Pozwala na użycie długich opcji i opcji po argumenty bez opcji (np. foo a b c -v raczej niż po prostu foo -v a b c). Ta odpowiedź Stackoverflow wyjaśnia, jak korzystać z GNU getopt.

jeffbyrnes wspomniał, że oryginalny link zmarł, ale na szczęście maszyna z powrotem zarchiwizował to.


4 dla odpowiedzi № 5

Lepiej korzystać z funkcji getopt bash. Więcej informacji znajdziesz w tym pytaniu i odpowiedziach: Używanie getopts w skrypcie powłoki bash, aby uzyskać długie i krótkie opcje wiersza poleceń


-1 dla odpowiedzi № 6

myślę, że możesz użyć do tego przypadku ...

case $1 in
-h) echo $usage ;;
h) echo $usage ;;
help) echo $usage ;;
esac

-1 dla odpowiedzi № 7

Po prostu przesyłam plik instrukcji online i odzyskuję go za pomocą curl. Na przykład poniższy kod pobiera z Github.

    #######################################
# Show help
#
# Globals:
#   None
# Arguments:
#   None
# Returns:
#   None
#
#######################################
show_help () {
curl https://raw.githubusercontent.com/KENJU/shellscript_todo/master/MANUAL | less
}