Dans mon script, j'essaie de vérifier si le premier et le seul argument est égal à -v mais c'est un argument facultatif. J'utilise une instruction if mais j'obtiens toujours l'erreur attendue de l'opérateur unaire.
c'est le code:
if [ $1 != -v ]; then
echo "usage: $0 [-v]"
exit
fi
Éditer:
Je devrais être plus précis: cette partie du script ci-dessus vérifie un argument optionnel et ensuite, si l'argument n'est pas entré, il devrait exécuter le reste du programme.
#!/bin/bash
if [ "$#" -gt "1" ]; then
echo "usage: $0 [-v]"
exit
fi
if [ "$1" != -v ]; then
echo "usage: $0 [-v]"
exit
fi
if [ "$1" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi
echo "usage: $0 [-v]"
;$-
affiche les indicateurs d'option de shell actifs, pas le nom du script actuel.$-
n'est pas le nom du script actuel.$0
est.Réponses:
Citations!
Sinon, lorsqu'il
$1
est complètement vide, votre test devient:au lieu de
... et
!=
n'est pas un opérateur unaire (c'est-à-dire capable de ne prendre qu'un seul argument).la source
if [[ $1 != -v ]]; then
IFS=1
, alors[ $# -eq 1 ]
ne se comportera pas aussi bien, alors qu'il[ "$#" -eq 1 ]
se comportera comme prévu même dans ce cas. C'est un cas pathologique, bien sûr, mais il vaut mieux écrire un logiciel qui n'en a pas lorsqu'on lui donne le choix.Ou pour ce qui semble exagéré, mais qui est en fait simpliste ... Couvre à peu près tous vos cas, et pas de chaîne vide ou de préoccupations unaires.
Dans le cas où le premier argument est '-v', alors faites votre conditionnel
ps -ef
, sinon dans tous les autres cas lancez l'utilisation.Si l'on ne se soucie pas de savoir où se trouve l'argument «-v», alors déposez simplement le cas dans une boucle. Cela permettrait de parcourir tous les arguments et de trouver «-v» n'importe où (à condition qu'il existe). Cela signifie que l'ordre des arguments de la ligne de commande n'est pas important. Soyez prévenu, comme présenté, la variable arg_match est définie, il ne s'agit donc que d'un indicateur. Il autorise plusieurs occurrences de l'argument «-v». On pourrait ignorer toutes les autres occurrences de «-v» assez facilement.
Mais autoriser plusieurs occurrences d'un argument est pratique à utiliser dans des situations telles que:
Nous ne nous soucions pas de l'ordre des arguments et autorisons même plusieurs arguments -u. Oui, il est simple d'autoriser également:
la source
$*
ne doit pas être utilisé dans ce contexte: il concatène les éléments dans une chaîne qui est à la fois fractionnée et étendue globalement; contrairement"$@"
, qui laisse les éléments avec leurs valeurs d'origine précises. Et il vous manque quelques citations, que shellcheck.net attrapera (avec les avertissements liés à une page wiki qui décrit pourquoi ces citations étaient importantes).-U'Bob Barker'
;for arg in $*
le verra au fur-UBob
et àBarker
mesure comme un élément distinct; alors quefor item in "$@"
verra-UBob Barker
comme une seule chaîne.