一、知识点归纳
1、本章的主要学习重点
在本章节中,我们将深入探讨sh脚本的各个方面。首先,我们会了解sh脚本是什么,以及它与C语言在结构和功能上的主要区别。接下来,我们会详细学习如何编写sh脚本,其中包括变量的定义和使用、不同类型的语句结构、命令的执行、常规的系统命令以及命令替换技巧。此外,本章还会对sh控制语句进行深入剖析,解释它们如何在脚本中起作用,以及如何正确使用它们。最后,我们将学习如何在sh中定义函数,并探讨如何使用参数来调用这些函数。
程序设计语言的核心要素和技能
当我们谈论程序设计语言时,不同的语言有其独特的特性和语法。但是,从广义上说,所有强大的编程语言都应该具备以下几种基本机制,以便我们在其中有效地组织和表示计算逻辑:
- 基本表达形式:这是编程语言的基础,它使我们能够描述和指定要操作的对象。
- 组合的方法:它允许我们从简单的基本部分开始,构建更复杂的组合结构。
- 抽象的方法:这使我们能够为复杂的组合对象命名,从而可以像操作基本对象一样操作它们。
具体来说,当我们在使用任何编程语言(包括shell脚本)时,通常会涉及以下几个核心方面:
- 数据类型和变量的定义。
- 运算符和表达式的使用。
- 控制流,包括条件判断和循环结构。
- 函数的定义和调用。
在shell脚本中,这些核心概念同样适用。我们可以定义不同类型的变量,使用运算符和表达式进行操作,利用控制流完成条件逻辑和循环,并通过函数来模块化代码,从而实现自动化操作和提高效率。
关于Shell和脚本
Shell 通常被称为操作系统的“外壳”。它是与操作系统交互的接口。通过Shell,我们可以输入各种命令来控制操作系统。例如,在Linux系统中,常用的Shell命令包括ls
(列出目录内容)、cd
(改变当前目录)和pwd
(显示当前目录)。简而言之,Shell是一个命令行解释器,它根据用户输入的命令来启动、管理或停止应用程序,并对系统进行控制。
脚本 是一系列按顺序组织的命令,存储在一个文件中。脚本可以被认为是一种可执行文件,但与传统的可执行文件不同,脚本是通过解释器逐行解释和执行的,而不需要事先进行编译。因此,虽然脚本具有灵活性和便捷性的优点,但在执行速度上可能不如编译后的程序快。
SH脚本与C语言的对比
-
执行方式:sh脚本是解释型的,这意味着它会逐行读取脚本内容并执行,而不需要事先编译。而C语言是编译型语言,它需要首先被编译成二进制格式,然后才能被执行。
-
数据类型:在C语言中,每个变量都有一个明确的数据类型,如char、int、float等。但在sh脚本中,所有变量基本上都被视为字符串,这使得脚本语言在处理文本数据时更加灵活。
-
程序入口:每个C程序必须有一个
main()
函数,它是程序的起点。而在sh脚本中,程序的起点是文件中的第一个可执行命令,无需特定的入口函数。
2、苏格拉底挑战
问题一:
问题二:
二、问题解决与思路
SH脚本基础入门
基础SH脚本
#!/bin/bash # 这句话表示用linux指定去解析文本内容
# 第一个shell小程序
echo hello world!
-
第一行表示我们选择使用bash shell。Shell中'#'符号表示注释。Shell的第一行比较特殊,一般都会以'#!'开始来指定使用的shell类型。在linux中,除了bash shell以外,还有很多版本的shell,例如zsh、dash等等。但是bash shell仍然是我们使用最多的。
-
第二行以'#'符号开始,表示本行是注释,运行的时候是不会运行本行的。
-
第三行中的'echo'是Linux中的输出命令,该行的意思很明显就是输出'hello world!'。
-
'chmod +x hello.sh' 的意思是赋予'hello.sh'的可执行权限。
-
在linux中,后缀名几乎是可以任意的或者没有后缀名,一般将shell保存为'xxx.shell'是为了看起来更直观。
1.命令行参数
- '$#' = 命令行参数1到n的数量;
- '$*' = 所有命令行参数,包括$0;
此外,sh还有与命令执行相关的以下内置变量:
- '$S' = 执行sh进程PID;
- '$?' = 最后一个命令执行的退出状态(如果成功,则为0,否则为非0)。
2.SH变量
在sh中,什么是变量?
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。
变量设置规则:
- 变量名称可以由字母、数字和下划线组成,但不能以数字开头。
- 变量的默认类型都是字符串型。
- 变量用等号连接值,等号左右两侧不能有空格。
- 变量的值如果有空格,需要使用单引号或者双引号括起来。
- 不能使用标点符号。
3.SH中的引号
SH有许多特殊字符。要想把它们用作普通字符,可以使用''或单引号来引用它们。
4.SH语句
SH语句包括所有Unix/Linux命令,以及可能的I/O重定向。此外,sh编程语言还支持控制sh程序执行的测试条件、循环、case等语句。
5.SH命令
内置命令
- '.file':读取并执行文件。
- 'break [n]':从最近的第n个嵌套循环中退出。
- 'cd [dirname]':更换目录。
- 'continue[n]':重启最近的第n个嵌套循环。
- 'eval [arg...]':计算一次参数并让sh执行生成的命令。
- 'exec [arg...]':通过这个sh执行命令,sh将会退出。
- 'exit [n]':使sh退出,退出状态为n。
- 'export [var…]':将变量导出到随后执行的命令.
- 'read [var...]':从stdin 中读取一行并为变量赋值。
- 'set [arg...]':在执行环境中设置变量。
- 'shift':将位置参数23...重命名为 12...。
- 'trap [arg] [n]':接收到信号n后执行参数。
- 'umask [ddd]':将掩码设置为八进制数 ddd 的。
- 'wait pid]': 等待进程 pid,如果没有给出pid,则等待所有活动子进程。
Linux命令
- 'echo'命令:将参数字符串作为行回显到stdout。
- 'expr'命令:间接更改sh变量的值。
- '管道'命令:作为过滤器。
- '实用'命令:
axk:数据处理程序。
cmp:比较两个文件。
comm:选择两个排序文件共有的行。
grep:匹配一系列文件的模式。
diff:找出两个文件的差异。
join:通过使用相同的键来连接记录以比较两个文件。
sed:流或行编辑命令。
sort:排序或合并文件。
tail:打印某个文件的最后口行。
tr:一对一宇符翻译。
uniq:从文件中删除连续重复行。
6.SH命令替换
在SH中,'$A'会被替换成A值。同样,当sh遇到'cmd'或'(cmd)'时,它会先执行cmd,然后用执行的结果字符替换'$(cmd)'。
实验中出现的问题:
不在sudoers文件
三、实验过程截图、代码
sh控制语句
- if语句
- if条件语句
c if [ 条件判断 ];then 程序 fi
或者
if [ 条件判断 ]
then
程序
fi
- 实践:
#!/bin/bash
#统计根分区使用率
rate=$(df -h | grep /dev/vda1 | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 20 ]
then
echo "error 10"
fi
if else条件语句
if [ 条件判断 ]
then
条件成立时,执行此程序
else
条件不成立时,执行的另外一个程序
fi
- 实践:
#!/bin/bash
#备份mysql数据库
#同步系统时间
ntpdate asia.pool.ntp.org &>/dev/null
#把当前系统时间按照“年月日”格式赋予变量date
date=$( date+%y%m%d )
#统计mysql的数据库大小,并把大小赋予size变量
size=$( du -sh /var/lib/mysql )
if [ -d /tmp/dbback ]
then
echo "Date: $date!" > /tmp/dbback/dbinfo.txt
echo "Date size: $size" >> /tmp/dbback/dbinfo.txt
cd /tmp/dbback
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbback/dbinfo.txt
else
mkdir /tmp/dbback
echo "Date: $date!" > /tmp/dbback/dbinfo.txt
echo "Date size: $size" >> /tmp/dbback/dbinfo.txt
cd /tmp/dbback
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbback/dbinfo.txt
fi
- 多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件
else
当所有条件都不成立时,最后执行此程序
fi
- 实践:
#!/bin/bash
#接收键盘输入,并赋予变量file
read -p "Please input a filename: " file
#判断file变量是否为空
if [ -z "$file" ]
then
echo "error,请输入文件名"
exit 1
#判断file的值是否存在
elif [ ! -e "$file" ]
then
echo " 你的文件不存在"
exit 2
#判断file的值是否为普通文件
elif [ -f "$file" ]
then
echo "文件是普通文件"
#判断file的值是否为目录文件
elif [ -d "$file" ]
then
echo "文件是目录文件"
else
echo "文件是其他类型的"
fi
- case语句
case $变量名 in
"值1")
如果变量的值等值1,则执行程序1
;;
"值2")
如果变量的值等值2,则执行程序2
;;
……省略其他分支
*)
如果变量的值都不是以上的值,则执行程序
;;
esac
- 实践:
#!/bin/bash
#测试case语句
echo "如果想去上班,请输入“1”"
echo "如果不想上班,请输入“2”"
echo "如果想居家办公,请输入“3”"
read -t 30 -p "请输入你的选择:" choose
case "$choose" in
"1")
echo "想去上班!"
;;
"2")
echo "不想去上班!"
;;
"3")
echo "居家办公!"
;;
*)
echo "只能输入1或者2或者3"
;;
esac
- for循环
语法一
for 变量 in 值1 值2 值3...
do
程序
done
- 实践:
#!/bin/bash
#打印1??6的循环
for i in 1 2 3 4 5 6
do
echo $i
done
- 语法二:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
- 实践:
#!/bin/bash
#使用for循环计算1-100的和
s=0
for (( i=1;i<=100;i=i+1 ))
do
s=$(( $s+$i ))
done
echo "$s"
#!/bin/bash
#批量添加指定数量的用户
read -t 30 -p "Please input user name:" name
read -t 30 -p "Please input the mumber of users:" num
read -t 30 -p "Please input the password of users:" pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/[0-9]*$'//g)
if [ -z "$y" ]
then
for (( i=1;i<=$num;i=i+1 ))
do
/usr/sbin/useradd $name$i &>/dev/null
echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
done
fi
fi
标签:脚本,变量,SH,第十章,笔记,echo,学习,sh,file
From: https://www.cnblogs.com/20211125mjz/p/17726637.html