linux命令12(shell编程)

1.shell编程

,将基本的shell命令,存放到一个文件中,然后执行这个文件,完成相应的功能。

2.如何写一个shell编程并能够运行

创建文件夹,mkdir myshell,创建文件vim firstshell

s1:vi或vim编辑shell命令文件

复制代码
#!/bin/sh
var="Hello world!"
echo $var
  1. #!/bin/sh 解释器声明(释伴行)

    • 作用:告诉系统用 /bin/sh 解释器来运行这个脚本,必须写在文件第一行。
    • /bin/sh 是系统标准 Bourne Shell 解释器,兼容 bash 基础语法。
  2. var="Hello world!" 变量赋值

    • 定义字符串变量var,值为Hello world!
    • Shell 赋值规则:等号左右不能有空格;带空格的字符串必须用双引号包裹。
  3. echo $var 输出变量

    • echo:打印输出命令
    • $var:取变量var里面存储的值,打印到终端

s2:修改文件的权限:可执行 chmod u+x firstshell

s3:执行shell程序文件 ./文件名

3.shell命令:

(1)echo 内容

将内容输出到终端

(2)read 变量

从标准的输入设备读入读取内容,赋值给变量

(3)echo 内容>文件名

,将内容重定向到文件中,没有文件可以创建文件


(4)条件测试:

?测试上一条是否正确,若正确则?为0,否则为非0

复制代码
#!/bin/sh
read age
expr $age + 1 &>/dev/null
if [ $? -ne 0 ];then
        echo "You should input a number."
else
        echo "Good"
fi

  1. #!/bin/sh 释伴行,声明使用 /bin/sh 标准 shell 解释器运行脚本,必须放在文件首行。

  2. read age 交互式输入命令:脚本运行到此处暂停,等待键盘输入内容,输入回车后,内容存入变量 age

  3. expr $age + 1 &>/dev/null

  • expr:shell 整数运算工具,仅能计算纯数字;如果$age是字母、符号,这条命令会执行失败。
  • $age + 1:尝试对输入值做 + 1 运算,+左右空格符合 expr 语法规范。
  • &>/dev/null:将这条命令的标准输出、错误输出 全部丢入空设备(屏蔽打印信息);⚠️ 这是 bash 专属语法,纯 POSIX sh 兼容写法为 expr $age + 1 >/dev/null 2>&1
  1. if [ $? -ne 0 ];then
  • $?:特殊内置变量,保存上一条命令(expr)的执行返回值 :执行成功返回0,失败返回非 0 数字。
  • [ ]:等价于test判断命令,[ $? -ne 0 ]含义:判断返回值不等于 0(即 expr 运算失败)。
  • -ne:shell 数值比较运算符,全称 not equal(不等于)。
  1. echo "You should input a number." 如果 expr 运算失败(输入不是数字),打印提示文字:你应当输入一个数字。

  2. else 分支:expr 运算成功(输入是合法数字)时执行。

  3. echo "Good" 输入数字合法时,输出 Good。

  4. fi if 判断语句的结束标记,if 开头必须 fi 收尾。


场景 1:输入纯数字

plaintext

复制代码
[root@localhost myshell]# ./firstshell3
25
Good

expr 25 +1执行成功 → $?=0 → 不满足-ne 0,走 else 分支输出 Good。

场景 2:输入字母 / 符号

plaintext

复制代码
[root@localhost myshell]# ./firstshell3
abc
You should input a number.

expr abc +1识别不了字母,执行失败 → $?≠0,走 if 分支输出报错提示。

(5)测试表达式

-e 文件名 :测试文件是否存在,若存在则为真

-d 目录 :测试目录是否存在,若存在则为真

(6)测试表达式

测试表达式中的关系

-ne: not equal 判断是否不相等

-eq:equal判断是否相等

-gt:greater判断是否大于

-ge:greater or equal 大于或等于

-lt:less than 判断是否小于 <

-le:less or equal判断是否小于等于<=

分支流程类:

(7)分支语句

if 条件测试命令

then

条件为真的时候,要执行的代码

else

条件 false的时候,要执行的代码

fi

或者

if 条件测试命令; then

条件为真的时候,要执行的代码

else

条件 false的时候,要执行的代码

fi

4.最后练习代码

sh

复制代码
#!/bin/sh
num=$(RANDOM%61)
echo "The answer is " $num
usleep 1000000

input(){
    read -p "Please enter your number:" price
    expr $price + 1 &>/dev/null
    if [ $? -ne 0 ];then
        echo "Please enter an integer!"
        input
    fi
}

guess(){
    if [ $price -eq $num ];then
        echo "Good, you are clever!"
        exit 0
    elif [ $price -gt $num ];then
        echo "Too large!"
        input
    else
        echo "Too small!"
        input
    fi
}

main(){
    input
    while true
    do
        guess
    done
}

main
  1. 随机答案生成

sh

复制代码
num=$(RANDOM%61)
echo "The answer is " $num
usleep 1000000
  • $RANDOM:shell 内置随机数变量(0~32767)
  • %61:取模,生成范围 0 ~ 60 的随机整数存入num(谜底数字)
  • usleep 1000000:暂停 1 秒(1000000 微秒)
  1. input () 函数:输入 + 数字合法性校验

sh

复制代码
input(){
    read -p "Please enter your number:" price
    expr $price + 1 &>/dev/null
    if [ $? -ne 0 ];then
        echo "Please enter an integer!"
        input
    fi
}
  • read -p:带提示文字接收用户输入,存入price
  • expr $price +1:校验输入是否为纯整数;非数字时命令执行失败
  • 递归调用:输入非法就重新执行 input,直到拿到合法数字
  1. guess () 函数:大小比对判断

sh

复制代码
guess(){
    if [ $price -eq $num ];then
        echo "Good, you are clever!"
        exit 0
    elif [ $price -gt $num ];then
        echo "Too large!"
        input
    else
        echo "Too small!"
        input
    fi
}
  • -eq:数值相等;猜对直接exit 0结束脚本
  • -gt:大于;猜大了提示,重新输入
  • else:猜小了提示,重新输入
  1. main () 主调度函数

sh

复制代码
main(){
    input
    while true
    do
        guess
    done
}
main
  • 先执行一次输入
  • while true 无限循环调用 guess,持续猜数字直到猜对退出
相关推荐
caimouse1 小时前
Reactos 第 5 章 进程与线程 — 5.4 系统调用 NtCreateThread()
服务器·开发语言
雨打夏夜1 小时前
VMware + CentOS 9 双网卡静态 IP 配置完整指南
linux·虚拟机
万能的知了1 小时前
WAF、高防IP、CC防护:安全产品到底怎么选
服务器·网络协议·安全
我叫张小白。1 小时前
Docker核心命令
运维·docker·容器
Upsy-Daisy2 小时前
Hermes Agent 学习笔记 03:CLI 与 TUI 使用体验,让 Agent 真正进入终端工作流
服务器·前端·数据库
承渊政道2 小时前
【MySQL数据库学习】MySQL基本查询(上)
linux·数据库·学习·mysql·bash·数据库开发·数据库系统
羽翼安全2 小时前
多摄像头接入检测 + 文件加密:监控室防拍照系统的两道设备与数据防线
运维·网络·人工智能
道川贤林2 小时前
EMMC开发环境的搭建与备份
linux·嵌入式·rk3588·orangepi
疋瓞2 小时前
批处理_自定义带锁文件夹应用案例_03
运维·服务器