-->

Linux之shell编程

 

1.脚本格式要求

2.脚本的执行方式

一:输入输出重定向

1.输入重定向 <

将 /etc/fstab作为输出重新定向到cat命令上

2.输出重定向 >>

现实当前文件下的项目,创建一个文本txt,ls命令重新定向到txt中并显示出来

3.管道 grep |

二:shell里的特殊字符【$ \ '' ' `】

1. “[双引号]、’[单引号]、·[倒引号]的区别

2.Linux的单行和多行注释

三:shell变量

1.shell系统变量

2.shell环境变量

3.特殊位置参数变量【$0、$n 、$# 、$* 、$@ 】

4.特殊状态预定义变量 【$?、$$、$! 、$_ 】

5.shell用户变量

6.shell变量的赋值与使用【{}、unset、readonly、local】

7.shell数字和数组的声明【declare】

四:shell运算符

1.算术运算符

2.关系运算符

3.布尔运算符

4.逻辑运算符

5.字符串运算符

6.文件测试运算符

五:shell的流程控制

1.分支结构——test命令

2.分支结构——if语句[then]

2.1 if的两种结构的2种语法结构

2.2 if/else结构的2种语法结构

2.3 if/eif/..../else的2种语法结构

3.分支结构——case语句[in-esac]

4.循环结构——for语句的2种语法结构[in-do-done]

第1种语法结构:创建一个shell文件用for实现乘法运算

第2种语法结构:利用for循环实现简单水果的输出

第3种语法结构:从1加到100的值输出显示

5.循环结构——while语句和until语句

5.1 while的2种语法结构[do-done]

创建一个shell文件用while实现1~100的累加

创建一个shell文件用while求10以内不是5的整数倍的数字的和

5.2 until的2种语法结构[do-done]

创建一个shell文件实现10以内奇数的和

6.break、continue、exit语句

6.1 break

6.2 continue

6.3 exit

六:函数的调用参数的传值返回值2种语法结构

1.函数的调用

创建一个shell文件利用函数实现打招呼,利用位置参数变量实现获取参数的信息

2.函数的递归i调用及read的用法[read]

创建一个shell文件用read读取实现加减乘除运算

3.函数的返回值return

4.几个特殊字符用来处理参数

七:编写交互脚本

1.提示用户[linux echo 命令]

echo转义字符序列:若-e 可用,则以下序列即可识别

2.接受用户输入[linux read 命令]

扩展
Linux就该这么学:https://www.linuxprobe.com/

shell菜鸟教程:https://www.runoob.com/linux/linux-shell-variable.html

补充
1.脚本格式要求
1.脚本以#!/bin/bash开头

2.脚本需要有可执行权限
2.脚本的执行方式
方式一:输入脚本的绝对路径或相对路径

1.首先要赋予hellworld.sh脚本的+x权限
2.执行脚本

相对路径:./myshell.sh
绝对路径:/root/shell/myshell.sh


方式二:sh+脚本
可以不用赋予脚本+x权限,直接执行即可
一:输入输出重定向
Linux使用
标准输入:stdin
标准输出:stdout
标准错误输出:stderr
输出:

附加的方式输出>>:会添加到文件最后

直接输出>:会覆盖原始的输出内容

输入:<

显示:通常用cat

cat文件1>文件2 (功能描述:将文件1的内容覆盖到文件2)

管道:

grep 过滤查找

| 管道符

表示将前一个命令的处理结果输出传递给后面的命令处理

1.输入重定向 <
将 /etc/fstab作为输出重新定向到cat命令上


2.输出重定向 >>
现实当前文件下的项目,创建一个文本txt,ls命令重新定向到txt中并显示出来


3.管道 grep |
作用:是在一个命令的标准入输出和另一个命令的标准输入之间建立一个通道


作用:
grep 过滤查找
| 管道符
表示将前一个命令的处理结果输出传递给后面的命令处理


基本语法:
grep [选项] 查找内容 源文件



常用选项:
-n 显示匹配行及行号
-i 忽略字母大小写

二:shell里的特殊字符【$ \ '' ' `】
1. “[双引号]、’[单引号]、·[倒引号]的区别
$ 表示变量替换,即用其后指定的变量的值来替换变量
\ 为转义字符,用于告诉shell不要对其后面的那个字符进行特殊处理,只是当作普通字符
“[双引号] 由双引号括起来的字符,除开$[美元符号]、·[倒引号]、\[反斜线]仍然保留其特殊功能外,
其余均被作为普通字符对待
’[单引号] 由单引号括起来的字符都作为普通字符
·[倒引号] 由倒引号括起来的字符串,被shell解释为命令行
在执行时,shell会先执行该命令
并以它的标准输出结果,取代整个倒引号部分
2.Linux的单行和多行注释
单行注释使用符号‘#’


多行注释是 :<<! 内容 ! 的形式(前面的冒号也是)


单行 注释快捷键:ctrl+k+c
单行取消注释快捷键:ctrl+k+u
三:shell变量
1.shell系统变量
主要在对参数判断和命令返回值判断时使用,包括脚本和函数的参数以及脚本和函数的返回值

 

2.shell环境变量
HOME: 使用者的目录地址

BASH: 目前使用的shell

HISTSIZE: 保留历史命令的数目上限

PATH:系统默认的可执行文件搜索路径

LANG:系统使用的编码。很多程序是根据系统指定的编码去解析输入文件,如果编码不正确,很多文件就无法正确解析。

RANDOM:随机产生一个0~32767之间的随机数

PS1:即命令提示符的格式,就是shell命令行前方的图标。

$:表示当前shell的pid

?:上一个shell命令的返回值

OSTYPE:系统类型

HOSTTYPE, MACHTYPE:系统指令集的位数

env命令观察当前shell环境下的环境变量

set命令查看当前shell环境下的所有变量(包括用户自定变量)

 

 

3.特殊位置参数变量【$0、$n 、$# 、$* 、$@ 】
$0 获取当前执行Shell脚本的文件名字,如果执行脚本时候加了路径,那就包含脚本路径跟脚本名字一起输出
$n 获取当前执行Shell交本的第n个参数,n=1..9,n>9,后面参数变量就需要用大括号,如:${10},以空格分隔
$# 获取当前执行Shell脚本接了多少个参数(总计)
$* 获取当前执行Shell脚本所有传参的参数
$@ 获取当前执行Shell脚本所有传参的参数($*和$@详解见例子)
4.特殊状态预定义变量 【$?、$$、$! 、$_ 】
$? 获取执行上一个指令的执行状态返回值(0成功,非0为失败)
$$ 获取当前执行Shell脚本的进程号(PID)
$! 获取上一个在后台工作的进程的进程号(PID)
$_
获取在此之前执行的命令

或脚本的最后一个参数

或显示Shell使用的当前选项,与set命令功能相同

5.shell用户变量
定义:是最常用到的变量,使用也十分简单

构成:变量名必须由字母、数组、下划线构成
切记!变量名的第一个字符不能为数字



命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)
6.shell变量的赋值与使用【{}、unset、readonly、local】
1.shell下的变量无需声明即可使用,赋值的同时即声明了变量

2.赋值时:变量和等号之间不要有空格,等号和值之间也不要有空格
否则,shell不会认为变量被定义

3.允许在变量之间进行相互赋值
引用变量时,需要在变量名前面加上$符号

4.使用变量名时,需要在变量名前面加上$符号

5.特殊情况:变量名包含在其他字符串中,这时需要用{}将变量名括起来
a=good
echo "${a}morning
goodmorning
6.为了避免变量名混淆,建议总是使用{}将变量名括起来
7.若要重置某一变量,则可以使用unset命令——清空某一变量的赋值
使用 unset 命令可以删除变量
变量被删除后不能再次使用。unset 命令不能删除只读变量
8.如果在赋值后不希望改变变量,使其类似于常数,则可以使用readonly命令将其设为只读
9.shell变量默是全局变量
如果需要在一定范围内有效,则需要加上local限制
10.值与值之间用空格隔开,不能使用,逗号
用语句给变量赋值:
for file in `ls /etc`

for file in $(ls /etc)
使用一个定义过的变量:
your_name="qinjx"
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
7.shell数字和数组的声明【declare】
默认的赋值是对字符串赋值
如果要对数字和数组进行声明,则要用declare命令


声明数组变量
declare -a arr=(a b c)
使用 "- 类型" 开启

使用 ”+ 类型“关闭

i 定义整数 integer
a 定义数组 array
f 定义函数 function
r 定义只读 readonly
x 定义为通过环境输出变量
数字变量赋值 declare

创建一个shell文件,实现数字变量的加法运算

 

 

四:shell运算符
1.算术运算符
运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 -10。
\* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
2.关系运算符
运算符 说明 举例
-eq【等于】 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne【不等于】 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 【大于】 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 【小于】 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge【大于等于】 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 【小于等于】 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
3.布尔运算符
运算符 说明 举例
! 非 运算,表达式为 true 则返回 false,否则返回 true。not [ ! false ] 返回 true。
-o 或 运算,有一个表达式为 true 则返回 true。or [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与 运算,两个表达式都为 true 才返回 true。add [ $a -lt 20 -a $b -gt 100 ] 返回 false。
分组括号。grouping test $a=0
$

=
0
-a $b=0
$

=
0
-a $c=0
$

=
0
判断a、b、c是不是均为0
4.逻辑运算符
运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
5.字符串运算符
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
6.文件测试运算符
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
参考:https://www.runoob.com/linux/linux-shell-basic-operators.html

五:shell的流程控制
1.分支结构——test命令
test命令:被用来判断表达式并且产生返回值
test命令不会产生标准输出,因此必须通过返回值来判断test的结果

真:返回值为0(TURE)
假:返回值为1(FALSE)

test命令可对整数、字符串、文件进行判断

2.分支结构——if语句[then]
2.1 if的两种结构的2种语法结构
if [条件];then

语句

fi
if [条件]
then

语句

fi
2.2 if/else结构的2种语法结构
if [条件];then
[语句]
else
[语句]
fi
if [条件]
then
[语句]
else
[语句]
fi
2.3 if/eif/..../else的2种语法结构


if [条件];then
[语句]
elif [条件];then
[语句]
..........
else
[语句]
fi
if [条件]
then
[语句]
elif [条件]
then
[语句]
..........
else
[语句]
fi
3.分支结构——case语句[in-esac]
case $变量 in
"值1")
[执行语句1]
;;
"值2")
[执行语句2]
;;
"值3")
[执行语句3]
;;
..............
esac
4.循环结构——for语句的2种语法结构[in-do-done]
for 变量 in [”值1“] [”值2“] [”值3“]
do
[语句]
done
for 变量 in [”值1“] [”值2“] [”值3“];
do
[语句];
done
for ((初始值;循环控制;变量变化))
do
[语句]
done
第1种语法结构:创建一个shell文件用for实现乘法运算
seq命令用于产生从起始值到结束值之间、固定增量的所有浮点数

 

第2种语法结构:利用for循环实现简单水果的输出

 


第3种语法结构:从1加到100的值输出显示

 


5.循环结构——while语句和until语句
while:当判断条件为真时才执行循环

until:当判断条件为假时才停止循环



注意:他们两个的判断条件刚刚相反

while:$i -le 100
until:$i -gt 100
5.1 while的2种语法结构[do-done]
while [ 条件判断式 ];do
[语句]
done
while [ 条件判断式 ]
do
[语句]
done
创建一个shell文件用while实现1~100的累加

 


创建一个shell文件用while求10以内不是5的整数倍的数字的和

 


5.2 until的2种语法结构[do-done]
until [ 条件判断式 ];do
[语句]
done
until [ 条件判断式 ]
do
[语句]
done
创建一个shell文件实现10以内奇数的和

 


6.break、continue、exit语句
6.1 break
在正常结束之前退出循环
6.2 continue
不执行本次循环,直接跳到下一次循环
6.3 exit
创建一个shell文件确定年龄是否为真并用预定义变量查看返回的状态

Linux exit命令用于退出目前的shell。

执行exit可使shell以指定的状态值退出。
若不设置状态值参数,则shell以预设值退出。
状态值0代表执行成功,其他值代表执行失败。

exit也可用在script,离开正在执行的script,回到shell。


这里exit的取值范围必须小于255

 


六:函数的调用参数的传值返回值2种语法结构
function [函数名]
{
[语句]
}
函数名()
{
[语句]
}
函数的调用:直接跟在函数名后,无需通过括号括起来,也不需要,逗号隔开
函数也支持递归调用
1.函数的调用
创建一个shell文件利用函数实现打招呼,利用位置参数变量实现获取参数的信息

 


2.函数的递归i调用及read的用法[read]
创建一个shell文件用read读取实现加减乘除运算
为防止递归函数中变量相互干扰,函数里面将变量i声明为局部变量
local i=$i
Linux shell条件判断if中的-a到-z的意思【推荐】

[ -z STRING ] “STRING” 的长度为零则为真
Linux read 命令

-p 后面跟提示信息,即在输入前打印提示信息

 

假设上面这个脚本名为factrial.sh
那么执行下面这个命令将可以计算n的阶乘

sh factrial.sh n
3.函数的返回值return
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
这个函数会对输入的两个数字进行相加运算...
输入第一个数字:
1
输入第二个数字:
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !
4.几个特殊字符用来处理参数
参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
七:编写交互脚本
交互脚本优势:
1.可以创建更加灵活的脚本
2.用户可以自定义脚本使得其在运行时产生不同的行为
3.脚本可以在运行过程中报告状态
1.提示用户[linux echo 命令]
提示用户最常用的的是:echo

-e:解释反斜杠转义字符

-n:禁止换行

-E:禁用解释反斜杠的转义功能(默认)
--help 显示此帮助信息并退出
--version 显示版本信息并退出
echo转义字符序列:若-e 可用,则以下序列即可识别
前提:若-e 可用,则以下序列即可识别
\a 响铃声
\b 退格
\c 不再产生新的输出
\e 转义符
\f 换页
\n 新行
\r 回车
\t 水平制表符
\v 竖直制表符
\\ 反斜杠
\0NNN 值为八进制NNN(0到3个八进制数字)的8比特字符
\NNN 值为八进制NNN(1到3个八进制数字)的8比特字符
\xHH 字节数以十六进制数 HH (1至2位)表示的8比特字符
2.接受用户输入[linux read 命令]
接受用户输入的命令为:read命令

作用:用于从标准输入读取数值
read 内部命令被用来从标准输入读取单行数据。
这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。


语句:
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars]
[-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志
-p 后面跟提示信息,即在输入前打印提示信息
-e 在输入的时候可以使用命令补全功能
-n 后跟一个数字,定义输入文本的长度,很实用
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码
-t 后面跟秒数,定义输入字符的等待时间
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的

posted @ 2023-07-07 11:30  角刀牛Java  阅读(112)  评论(0编辑  收藏  举报