shell基础:使用read、命令行脚本传参实现输入2个整数并计算

这篇博客介绍了如何在Shell中使用`read`命令交互式获取用户输入的两个整数,以及通过命令行参数传递两个整数。内容包括对输入的验证、整数运算及错误处理。同时比较了`read`交互方式和命令行参数传递方式的优缺点。

shell基础练习题:使用read交互输入,命令行脚本传参2种方式,实现输入2个整数数字,并计算加减乘除。考察shell基础知识包括:变量定义、read、if判断语句、正则表达式等知识;


第一种方式:read交互输入参数

思路为:判断输入的第2个变量是否为空,为空则提示输入2个数字;不为空则判断输入的是否为整数,用到expr,作用为让2个变量进行相加,如果结果为0说明输入2个为数字,如结果非0则说明输入非整数,提示输入的不是非整数;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
read  -p  "pls input two number:"  a b
if   [ ! -z $b ]
then
      expr  $a + $b &> /dev/null
      if  [ $? - eq  0 ]
       then
           echo  "a-b=$(($a-$b))"
           echo  "a+b=$(($a+$b))"
           echo  "a*b=$(($a*$b))"
           echo  "a/b=$(($a/$b))"
          else
               echo  "input is not zhengshu"
          fi
else
      echo  "you must input two number"
fi

执行结果如下:输入字母会报错,输入不是整数;只输入1个参数也会报错;

1
2
3
4
5
6
7
8
9
10
11
12
[baby@localhost ~]$ sh a.sh
pls input two number:4 2
a-b=2
a+b=6
a*b=8
a /b =2
[baby@localhost ~]$ sh a.sh
pls input two number:a 2
input is not zhengshu
[baby@localhost ~]$ sh a.sh
pls input two number:10
you must input two number


脚本有bug,如果输入3个参数的话会报错如下:

[baby@localhost ~]$ sh a.sh

pls input two number:1 3 3

a.sh: line 3: [: 3: binary operator expected

you must input two number



针对上面的脚本bug修改如下:

思路为:多添加一个变量c,并多了if判断,先判断$a是否为空,如为空提示输入2个数字并退出;然后判断$b是否为空,如未空提示输入2个数字并退出;只有$a $b都不为空即都有输入值,再判断$c是否为空,如未空执行下面的整数判断,如$c不为空同样提示输入2个数字并退出;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
read  -p  "pls input two number:"  a b c
if  [ -z $a ]
   then
  echo  "you must input two number"
  exit
elif  [ -z $b ]
   then
  echo  "you must input two number"
  exit
fi
if  [ -z $c ]
then
  expr  $a + $b &> /dev/null
  if  [ $? - eq  0 ]
   then
   echo  "a-b=$(($a-$b))"
   echo  "a+b=$(($a+$b))"
   echo  "a*b=$(($a*$b))"
   echo  "a/b=$(($a/$b))"
  else 
   echo  "input is not zhengshu"
  fi
else
  echo  "you must input two number"
fi


执行结果如下,什么都不输入,输入一个字符都会提示必须输入2个数字;输入2个值中有字母提示输入的非整数;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[baby@localhost ~]$ sh a.sh  
pls input two number:
you must input two number
[baby@localhost ~]$ sh a.sh
pls input two number:1
you must input two number
[baby@localhost ~]$ sh a.sh
pls input two number:1 a
input is not zhengshu
[baby@localhost ~]$ sh a.sh
pls input two number:2 1
a-b=1
a+b=3
a*b=2
a /b =2


第二种方式:命令行脚本传参方式

思路为:定义a b两个变量,接受命令行传递的参数;$#为输入参数的总个数;判断输入的参数个数不等于2,则提示必须输入2个数字;等于2的话执行下面的脚本;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[baby@localhost ~]$  cat  b.sh
#!/bin/bash
a=$1
b=$2
if  [ $ # -ne 2 ]
then
  echo  "you must input two number"
  exit  1
else
  expr  $a + $b &> /dev/null
  if  [ $? - eq  0 ]
   then
   echo  "a-b=$(($a-$b))"
   echo  "a+b=$(($a+$b))"
   echo  "a*b=$(($a*$b))"
   echo  "a/b=$(($a/$b))"
  else
   echo  "input is not zhengshu"
   exit  1
  fi
fi


执行结果如下:传参为空,参数为3个都会提示必须输入2个数字;传参包含非数字则提示输入的不是整数;

1
2
3
4
5
6
7
8
9
[baby@localhost ~]$ sh b.sh 3 a
input is not zhengshu
[baby@localhost ~]$ sh b.sh 3 2 3
you must input two number
[baby@localhost ~]$ sh b.sh 3 2
a-b=1
a+b=5
a*b=6
a /b =1


总结:

read可以和用户交互性较好,脚本较为复杂多了if判断效率不高;

命令行传参使用表达式判断输入参数,执行效率和理解性较好;






本文转自 模范生 51CTO博客,原文链接:http://blog.51cto.com/mofansheng/1702758,如需转载请自行联系原作者
<think>好的,我现在需要帮助用户在Linux中编写一个Shell脚本输入三个整数输出最大值。用户已经提供了示例代码和一些参考资料,我需要结合这些信息来生成正确的脚本且确保步骤清晰易懂,适合新手操作。 首先,用户的需求是明确的:编写一个Shell脚本接受三个整数输入,比较后输出最大值。用户提供的引用[1]中的代码是一个可能的实现,但需要注意语法是否正确。比如,用户提供的代码中的引号是中文的“”,这会导致错误,应该替换为英文的""。此外,条件判断部分使用双括号((...))是正确的,但需要检查语法是否正确,比如是否缺少then关键字或者fi的闭合。 接下来,我需要考虑如何结构化这个脚本。通常,Shell脚本的步骤包括:声明解释器、读取输入、比较逻辑、输出结果。用户提供的示例代码大致遵循这个结构,但可能需要调整格式和语法错误。 然后,验证输入是否为整数也是一个重要的点。虽然用户没有明确要求,但考虑到健壮性,可能需要添加输入验证。不过,用户可能更关注基本功能的实现,所以可以将输入验证作为可选步骤或扩展部分。 比较三个数的方法有多种。用户提供的引用[1]中使用的是逐个比较的方法:先将第一个数设为最大值,然后依次与第二个和第三个数比较,更新最大值。这种方法简单直接,适合新手理解。另一种方法是使用数组和循环,但对于三个数来说可能过于复杂。 在编写代码时,需要注意Shell脚本的语法细节,比如变量赋值时不能有空格,条件判断中的空格要求,以及使用正确的比较运算符。-gt用于整数比较,而双括号内的>符号也可以用于数值比较,但两者上下文不同。用户提供的示例中使用的是双括号和>,这在算术上下文中是允许的。 此外,用户可能希望脚本具有执行权限,知道如何运行它。因此,需要指导用户使用chmod +x赋予权限,通过./script.sh执行。 最后,需要检查是否有语法错误,比如引号是否正确,是否遗漏了then或fi,以及代码的结构是否合理。用户提供的引用[1]中的代码在if语句后缺少then,或者格式不正确,需要修正。 总结步骤: 1. 创建脚本文件,使用正确的解释器声明。 2. 读取三个整数输入使用read命令。 3. 初始化最大值,逐个比较更新。 4. 输出最大值。 5. 赋予执行权限运行测试。 同时,需要确保代码中的符号如引号、括号都是英文符号,避免语法错误。例如,用户提供的示例代码中使用了中文引号“”,这会导致脚本无法运行,必须替换为英文的""或''。 可能遇到的常见错误包括: - 中文标点符号导致语法错误。 - 条件判断中的空格缺失,如[ $num1 -gt $num2 ]中的空格。 - 变量赋值时使用$符号(应该为max=$num1而不是$max=$num1)。 - 条件语句的结构错误,缺少then或fi。 在解释过程中,需要详细说明每个步骤的作用,比如read命令的-p参数用于提示信息,if语句的逻辑流程,以及如何通过比较更新最大值。对于新手来说,清晰的注释和分步解释非常重要,有助于他们理解脚本的执行过程和Shell脚本的基本语法。 最后,提供一个正确且经过测试的代码示例,指导用户如何运行和验证,确保他们能够成功实现功能。</think>### 分步解决方案:Linux Shell 脚本输入三个整数输出最大值 --- #### **完整代码实现** ```bash #!/bin/bash # 读取三个整数输入 read -p "请输入第一个整数: " num1 read -p "请输入第二个整数: " num2 read -p "请输入第三个整数: " num3 # 初始化最大值为第一个数 max=$num1 # 依次比较第二个和第三个数 if (( num2 > max )); then max=$num2 fi if (( num3 > max )); then max=$num3 fi # 输出结果 echo "最大值是: $max" ``` --- #### **步骤详解** 1. **创建脚本文件** 在终端中执行以下命令: ```bash nano find_max.sh ``` 粘贴上述代码后保存(按 `Ctrl+O` 保存,`Ctrl+X` 退出)。 2. **赋予执行权限** ```bash chmod +x find_max.sh ``` 3. **运行脚本** ```bash ./find_max.sh ``` --- #### **代码逻辑解析** 1. **输入读取** - `read -p "提示信息" 变量名`:通过交互式输入获取用户的值,`-p` 参数直接显示提示内容[^1]。 - 示例:`read -p "请输入第一个整数: " num1` 将用户输入存储到 `num1` 变量。 2. **比较逻辑** - **初始化最大值**:`max=$num1`,假设第一个数为初始最大值。 - **逐次比较**: - `if (( num2 > max ))`:检查第二个数是否大于当前最大值,如果是则更新 `max`。 - `if (( num3 > max ))`:检查第三个数是否大于当前最大值,如果是则更新 `max`。 - **`(( ))` 的作用**:双括号内为算术运算上下文,可直接使用 `>` 符号比较数值[^2]。 3. **输出结果** `echo "最大值是: $max"` 通过变量替换直接输出结果。 --- #### **示例运行** 输入三个整数后的输出: ``` 请输入第一个整数: 25 请输入第二个整数: 42输入第三个整数: 17 最大值是: 42 ``` --- #### **关键语法说明** 1. **变量赋值** - `max=$num1`:赋值时变量名**无需**加 `$`,引用值时才需要(如 `$max`)[^1]。 2. **数值比较** - `(( num2 > max ))`:在双括号中可直接使用数学比较符(`>`、`<`、`>=` 等)。 - 等效写法:`if [ $num2 -gt $max ]; then`(使用 `-gt` 运算符)[^3]。 3. **代码健壮性** - 若需验证输入是否为整数,可添加正则检查(见下文扩展部分)。 --- #### **扩展:输入验证(防止非数字输入)** ```bash #!/bin/bash # 函数:验证输入是否为整数 validate_integer() { if [[ ! $1 =~ ^[+-]?[0-9]+$ ]]; then echo "错误:'$1' 不是有效的整数!" exit 1 fi } # 读取验证输入 read -p "请输入第一个整数: " num1 validate_integer "$num1" read -p "请输入第二个整数: " num2 validate_integer "$num2" read -p "请输入第三个整数: " num3 validate_integer "$num3" # 后续比较逻辑与之前相同... ``` --- ### 常见问题解答 **Q1:为什么使用 `(( ))` 而不是 `[ ]` 或 `test` 命令?** - `(( ))` 是算术运算语法,更适合数值比较(如 `>`、`<`),而 `[ ]` 需要配合 `-gt`、`-lt` 等运算符[^3]。 **Q2:如果输入的是浮点数会怎样?** - 脚本会报错(因为正则验证仅匹配整数),若需支持浮点数,需修改正则表达式为 `^[+-]?[0-9]+(\.[0-9]+)?$`。 **Q3:如何比较超过三个数?** - 可通过数组和循环优化代码,例如: ```bash # 读取多个数到数组 nums=() for i in {1..5}; do read -p "请输入第$i个整数: " num validate_integer "$num" nums+=($num) done # 遍历数组找最大值 max=${nums[0]} for num in "${nums[@]}"; do if (( num > max )); then max=$num fi done ``` --- [^1]: 变量赋值和引用的语法需严格区分 `$` 符号的使用场景[^1]。 [^2]: 双括号 `(( ))` 支持更直观的算术表达式[^2]。 [^3]: `test` 命令与 `[ ]` 的运算符需注意空格和语法格式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值