如何检查数字是否在shell范围内

jac*_*ack 9 bash shell sh

我想在两个值之间插入数字,否则重复脚本直到正确的数字.

这是我的脚本,它无法正常工作:

validation(){
read number
if [ $number -ge 2 && $number -ls 5 ]; then
    echo "valid number"
    break
else
    echo "not valid number, try again"
fi

}

echo "insert number"
validation
echo "your number is" $number
Run Code Online (Sandbox Code Playgroud)

ser*_*gio 9

您的 if 语句:

if [ $number -ge 2 && $number -ls 5 ]; then 
Run Code Online (Sandbox Code Playgroud)

应该:

if [ "$number" -ge 2 ] && [ "$number" -le 5 ]; then
Run Code Online (Sandbox Code Playgroud)

所做的更改:

  • 引用变量被认为是好的做法
  • ls不是有效的比较运算符,请使用le.
  • &&.分隔单括号条件表达式。

您还需要在脚本的第一行中有一个 shebang: #!/usr/bin/env bash


cod*_*ter 7

如果您使用的是Bash,则最好使用算术表达式,((...))以提高可读性和灵活性:

if ((number >= 2 && number <= 5)); then
  # your code
fi
Run Code Online (Sandbox Code Playgroud)

要循环阅读直到输入有效数字,请执行以下操作:

#!/bin/bash

while :; do
  read -p "Enter a number between 2 and 5: " number
  [[ $number =~ ^[0-9]+$ ]] || { echo "Enter a valid number"; continue; }
  if ((number >= 2 && number <= 5)); then
    echo "valid number"
    break
  else
    echo "number out of range, try again"
  fi
done
Run Code Online (Sandbox Code Playgroud)

((number >= 2 && number <= 5))也可以写成((2 <= number <= 5))


也可以看看:

  • 在此处在 Debian 9.8 上运行 `bash` `4.4-5`。`如果((2 &lt;= 255 &lt;= 254));然后回声'真'; 否则回声'假'; fi` 返回 `true`。和`if ((2 &lt;= 255 &amp;&amp; 255 &lt;= 254)); 然后回声'真'; 否则回声'假'; fi` 返回 `false`。 (3认同)
  • 我的一位同事说`((2 &lt;= number &lt;= 5))`被评估为`((((2 &lt;= number)) &lt;= 5))`,这就解释了它。大括号扩展顺序是从左到右,见 http://man7.org/linux/man-pages/man1/bash.1.html#EXPANSION (2认同)