我的任务是显示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))
;所以也许省略$
其他事物的前缀似乎也是合理的?