Réponses:
if (( RANDOM % 2 )); then C1; else C2; fi
== 0
est implicite dans les ((
blocs sans comparaison, donc je ne sais pas ce que vous voulez dire.
== 0
est une faute de frappe dans mon commentaire précédent, je veux dire > 0
est implicite. Puisque % 100
renverra presque toujours une valeur au 0
- dessus , cela est attendu.
RANDOM % $N
sans == 0
? OMI, par exemple avec N = 100, il est beaucoup plus pragmatique de vouloir une cote de 1 sur 100 (livré avec == 0
) qu'une cote de 99 sur 100 (livré sans == 0
).
Dans votre cas particulier:
C$((RANDOM%2+1))
fonctionnera :) Et bon, c'est la réponse la plus courte!
$((1+1))
-> 2
, par exemple. $(( ))
calcule ce qu'il y a à l'intérieur.
Vous pouvez faire quelque chose comme ça dans Bash:
$ (( RANDOM%2 == 0 )) && C1 || C2
Cela générera un nombre aléatoire, soit 0 ou 1. Si c'est un 0, alors C1 s'exécute, sinon C2 s'exécute s'il ne l'est pas.
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0
REMARQUE: le premier caractère $
, est l'invite.
Si vous craignez que C1 doive échouer pour que C2 puisse fonctionner, vous pouvez restructurer ce qui précède comme suit:
(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD
Cette réponse a été un peu critiquée mais il y a une méthode à ma folie. Bien que ce modèle puisse sembler plus obscur qu'un si / alors je le trouve plus lisible et compact lorsque vous faites quelque chose comme ceci:
#!/bin/bash
CMD=""
DIRS="/etc /home /www /data1 /data2 /var/log /var/spool/mail"
FILE="/backup/$(hostname)-$(date +'%m-%d-%y').tar.gz"
[ "$1" == "nas" ] && CMD="lftp -u user,password -e 'cd /dump/; mput /backup/*; quit' nas.mylan.com" || :
[ "$1" == "scp" ] && CMD="scp /backup/* scponly@dumpserver:incoming' username" || :
[ "$1" == "tape" ] && CMD='tar -cf /dev/st0 /backup/*' || :
[ "$CMD" == "" ] && exit 1 || :
# make a backup
tar -zcvf $FILE $DIRS
# Now depend upon circumstances run a backup command
$CMD
C2
si C1
échoue, ce qui constitue une violation aux exigences définies dans la question ( à savoir que seule une des commandes est exécuté). x && y || z
n'est pas équivalent à if x; then y; else z; fi
.
C1
est une commande qui renvoie parfois un code de sortie non nul, vous finirez par exécuter les deux C1
et C2
quand cela se produira .
((...))
au lieu de [...]
- les parenthèses doubles sont spécifiquement destinées aux expressions arithmétiques.
(( RANDOM % N == 0 ))
plutôt que(( RANDOM % N ))
. Ce n'est que dans le cas particulier de N = 2 que ceux-ci ont une probabilité identique.