
od -vAn -N4 -tu4 < /dev/urandom
私の仕事は、読んだ2つの数字の間にランダムな数字()を表示することです。最小値の例外と生成された乱数を確認すると、構文エラーが発生する理由を理解できません。
私のコード部分はフランス語になっています
#!/bin/bash
randomMax=2147483647
randomMin=−2147483648
valide=true
echo "Entrez un nombre : "
read nombre1
echo "Entrez un autre nombre : "
read nombre2
if [[ $nombre1 -lt $randomMin || $nombre1 -ge $randomMax ]]; then
echo "Le premier chiffre est hors de porté du random"
valide=false
elif [[ $nombre2 -lt $randomMin || $nombre2 -ge $randomMax ]]; then
echo "Le deuxième chiffre est hors de porté du random"
valide=false
fi
if [[ $nombre2 -lt $nombre1 ]]; then
nombre3=$nombre2
nombre2=$nombre1
nombre1=$nombre3
fi
if [[ $valide == true ]]; then
randomNumber=$(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
echo "Voici le nombre : $((number1 + randomNumber))"
fi
答え1
この行
randomNumber=$(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
$ echo $(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2)) -bash: (od -vAn -N4 -tu4 < /dev/urandom) % nombre2: syntax error: operand expected (error token is "/dev/urandom) % nombre2")
そうですね。外側は$((...))
算術拡張です。
内部的にコマンド(...)
を呼び出すためのものなので、コマンドの置き換えがod
必要です。$(...)
randomNumber=$(( $(od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
$ nombre2=100 $ echo $(( $(od -vAn -N4 -tu4 < /dev/urandom) % nombre2)) 47
答え2
次のようなさまざまな演算子を指定する必要があります。
- 算術評価、
$(( ..... ))
- サブシェルでコマンドを実行します。
$( ..... )
リーダーシップ$
は部分です各オペレータのオープニングシーケンス。 (やや愚かな)いくつかの例:
- 算術評価内のサブシェルの実行:年モデル月、
echo $(( $(date +%Y) % $(date +%m) ))
- Subshell は内部算術評価を実行します。:2から30までの数字を数え、エポック以降の秒数に対応する日付を印刷します。
echo "Quite some $(date --date="@ $((1 << 30))" -R) time ago"
それでは、コードについてもう一度考えてみましょう。
randomNumber=$(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
あなたは何をしたいですか?算術評価内のサブシェルの実行;今何が欠けているのか知っていますか?
私はあなたの初期の混乱の原因を推測できると思います。算術評価では、以下を参照できます。変数に一般的な$
プレフィックスなし:
z=42
echo $((33 + z))
そして
z=42
echo $((33 + $z))
;それでは、$
他のものに対する接頭辞を省略するのも合理的に見えますか?