bash错误语法随机数

bash错误语法随机数

我的任务是显示od -vAn -N4 -tu4 < /dev/urandom读取的两个数字之间的随机数 ( )。我不明白为什么当我检查最小值异常和生成的随机数时出现语法错误。

我的代码部分是法语

#!/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

需要明确这些不同的运算符:

  • 算术评估,$(( ..... ))
  • 在子 shell 中执行命令,$( ..... )

领导$是一部分每个操作员的打开顺序。一些(有点愚蠢)的例子:

  • 算术求值内的子 shell 执行:年模月,
echo $(( $(date +%Y) % $(date +%m) ))
  • 子 shell 执行内部的算术评估:计算 2 到 30 号,并打印与纪元以来的秒数相对应的日期,
echo "Quite some $(date --date="@ $((1 << 30))" -R) time ago"

现在请再次考虑您的代码,

randomNumber=$(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2))

你想做的事情算术求值内的子 shell 执行;你现在看到缺少什么了吗?



我想我可以猜测你最初困惑的根源:在算术评估中,人们可以参考到一个变量没有通常的$前缀:

z=42
echo $((33 + z))

z=42
echo $((33 + $z))

;所以也许省略$其他事物的前缀似乎也是合理的?

相关内容