1.shell编程
,将基本的shell命令,存放到一个文件中,然后执行这个文件,完成相应的功能。
2.如何写一个shell编程并能够运行
创建文件夹,mkdir myshell,创建文件vim firstshell
s1:vi或vim编辑shell命令文件

#!/bin/sh
var="Hello world!"
echo $var
-
#!/bin/sh解释器声明(释伴行)- 作用:告诉系统用
/bin/sh解释器来运行这个脚本,必须写在文件第一行。 /bin/sh是系统标准 Bourne Shell 解释器,兼容 bash 基础语法。
- 作用:告诉系统用
-
var="Hello world!"变量赋值- 定义字符串变量
var,值为Hello world! - Shell 赋值规则:等号左右不能有空格;带空格的字符串必须用双引号包裹。
- 定义字符串变量
-
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
-
#!/bin/sh释伴行,声明使用/bin/sh标准 shell 解释器运行脚本,必须放在文件首行。 -
read age交互式输入命令:脚本运行到此处暂停,等待键盘输入内容,输入回车后,内容存入变量age。 -
expr $age + 1 &>/dev/null
expr:shell 整数运算工具,仅能计算纯数字;如果$age是字母、符号,这条命令会执行失败。$age + 1:尝试对输入值做 + 1 运算,+左右空格符合 expr 语法规范。&>/dev/null:将这条命令的标准输出、错误输出 全部丢入空设备(屏蔽打印信息);⚠️ 这是 bash 专属语法,纯 POSIX sh 兼容写法为expr $age + 1 >/dev/null 2>&1。
if [ $? -ne 0 ];then
$?:特殊内置变量,保存上一条命令(expr)的执行返回值 :执行成功返回0,失败返回非 0 数字。[ ]:等价于test判断命令,[ $? -ne 0 ]含义:判断返回值不等于 0(即 expr 运算失败)。-ne:shell 数值比较运算符,全称 not equal(不等于)。
-
echo "You should input a number."如果 expr 运算失败(输入不是数字),打印提示文字:你应当输入一个数字。 -
else分支:expr 运算成功(输入是合法数字)时执行。 -
echo "Good"输入数字合法时,输出 Good。 -
fiif 判断语句的结束标记,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
- 随机答案生成
sh
num=$(RANDOM%61)
echo "The answer is " $num
usleep 1000000
$RANDOM:shell 内置随机数变量(0~32767)%61:取模,生成范围0 ~ 60的随机整数存入num(谜底数字)usleep 1000000:暂停 1 秒(1000000 微秒)
- 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:带提示文字接收用户输入,存入priceexpr $price +1:校验输入是否为纯整数;非数字时命令执行失败- 递归调用:输入非法就重新执行 input,直到拿到合法数字
- 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:猜小了提示,重新输入
- main () 主调度函数
sh
main(){
input
while true
do
guess
done
}
main
- 先执行一次输入
while true无限循环调用 guess,持续猜数字直到猜对退出