当前位置:网站首页>shell编程
shell编程
2022-04-22 03:52:00 【小呆鸟_coding】
文章目录
第1章 Shell概述
- shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核
第2章 Shell 解析器
-
linux 提供的Shell 解析器有很多,最常用的俩个解析器为:sh和bash。
-
Centos默认的解析器是bash
[root@zjh home]# echo $SHELL /bin/bash
第3章 Shell脚本入门
-
脚本格式
脚本以#!/bin/bash 开头(指定解析器)
-
第一个Shell 脚本:helloworld
# 创建脚本 [root@zjh home]# cat helloworld.sh #!/bin/bash echo "hello zjh" # 执行脚本方式1 [root@zjh home]# bash helloworld.sh hello zjh # 执行脚本方式2 [root@zjh home]# ./helloworld.sh -bash: ./helloworld.sh: 权限不够方式1,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限;
方式2,本质是脚本自己需要执行,所以需要执行权限
-
第二个Shell 脚本:多命令处理
需求 :在linux家目录下创建一个bangzhang.txt并在文件中写入"I IOVE YOU"字符.
[root@zjh home]# touch batch.sh [root@zjh home]# vim batch.sh #!/bin/bash cd /home/linux/ touch banzhang.txt echo "I LOVE YOU" >> banzhang.txt
第4章 Shell中的变量
4.1 系统变量
-
常用系统变量 $HOME $PWD $SHELL $USER
[root@zjh home]# echo $HOME /home/linux [root@zjh home]# echo $PWD /home/linux/datas [root@zjh home]# echo $SHELL /bin/bash [root@zjh home]# echo $USER linux
4.2自定义变量
-
1.基本语法
定义变量:变量=值 等号两边不能留有空格
撤销变量:unset 变量
输出变量:echo $变量
声明静态变量: readonly 变量,注意:不能unset
[root@zjh home]# A=1 [root@zjh home]# echo $A 1 [root@zjh home]# unset A # readonly 变量,注意:不能unset [root@zjh home]# readonly B=2 [root@zjh home]# echo $B 2 [root@zjh home]# B=9 -bash : B: readonly variable -
2.变量定义规则
-
变量名称可以由字母,数字和下划线组成,不能以数字开头,环境变量名建议大写
-
等号两侧不能有空格
-
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
-
变量的值如果有空格,需要使用双引号或单引号括起来
-
[root@zjh home]# D="A B C"
[root@zjh home]# echo $D
A B C
[root@zjh home]# C=1+2
[root@zjh home]# echo $c
1+2
- 可把变量提升为全局变量,可供其他shell程序使用:
export 变量
4.3 特殊变量:$n
- $n——n为数字,$0 代表脚本名称,10以内参数用$1- 9 表 示 , 10 以 上 需 要 用 大 括 号 9表示,10以上需要用大括号 9表示,10以上需要用大括号{10}.
#!/bin/bash
echo "$0" "$1" "$2" "$3"
[root@zjh home]# sh parameter.sh
parameter.sh
[root@zjh home]# sh parameter.sh 10 lal 20
parameter.sh 10 lal 20
####4.4 特殊变量:$#
- $#——获取所有输入参数个数,常用于循环
[root@zjh home]# vim parameter.sh
#!/bin/bash
echo "$0" "$1" "$2"
echo $#
[root@zjh home]# bash parameter.sh
parameter.sh
0
[root@zjh home]# bash parameter.sh 10 lala 20
parameter.sh 10 lala 20
3
####4.5 特殊变量: ∗ 和 * 和 ∗和@
-
$* ——代表命令行中所有的参数,把所有参数看成一个整体
-
$@ ——也代表命令行中所有的参数,不过把每个参数区分对待
[root@zjh home]# vim parameter.sh
echo "$0" "$1" "$2" "$3"
echo $#
echo $*
echo #@
[root@zjh home]# sh parameter.sh 1 2 3
parameter.sh 1 2 3
3
1 2 3
1 2 3
4.6 特殊变量:$?
-
$?——最后一个执行的命令的返回状态。如果这个变量的值为0,则最后一个命令正确执行
如果这个值为非0(具体哪一个数,由命令自己来决定),则证明上一个命令执行不正确
[root@zjh home]# sh parameter.sh 1 2 3
parameter.sh 1 2 3
3
1 2 3
1 2 3
[root@zjh home]# $? 执行失败返回非0
-bash:0 : command not found
[root@zjh home]# echo $?
127
[root@zjh home]# sh parameter.sh 1 2 3 执行成功返回0
parameter.sh 1 2 3
3
1 2 3
1 2 3
[root@zjh home]# echo $?
0
第5章 运算符
5.1 基本语法
- $((运算式)) 或者 $[运算式]
- expr +. -, *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
5.2 实例实操
计算3+2的值
[root@zjh home]# expr 2 + 3
5
[root@zjh home]# expr 2+3
error
计算(2+3)x4的值
[root@zjh home]# expr `expr 2 + 3` \* 4
20
[root@zjh home]# a=$[(2+3)*4]
[root@zjh home]# echo $a
20
第6章条件判断
6.1基本语法
[ condition ] (注意 condition前后要有空格)
注意:条件非空即为true, [atguigu] 返回 true, []返回false
6.2常用条件判断
| 符号 | 描述 |
|---|---|
| -lt | (less than) 小于 |
| -le | (less equal) 小于等于 |
| -eq | (equal) 等于 |
| -gt | (greater than) 大于 |
| -ge | (greater equal) 大于等于 |
| -ne | (no eqeual) 不等于 |
文件权限判断
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
文件类型判断
- -f 文件存在并且是一个常规文件 (file)
- -e 文件存在 (exixtence)
- -d 文件存在病是一个目录 (directory)
6.3 案例实操
# 判断23是否大于2
[root@zjh home]# $ [ 23 -gt 2 ]
[root@zjh home]# echo $?
0
[root@zjh home]# $ [ 23 -le 2 ]
[root@zjh home]# echo $? #返回值非0说明上一条指令执行错误,也就是[ 23 -le 2 ]
1 #是错误的
# 判断helloworld.sh是否有写入权限
[root@zjh home]# [ -w hellowrld.sh ]
[root@zjh home]# echo $?
0
# 判断目录中文件是否存在
[root@zjh home]# [ -e /home/linux/datas ]
[root@zjh home]# echo $?
0
#多条件判断
[root@zjh home]# [ condition ] && echo OK || echo notok
OK
[root@zjh home]# [ condition ] && [] || echo notol
notok
第7章 流程控制(重点)
7.1 if语句
-
注意事项:[ 条件判断 ],中括号和条件判断之间必须有空格。
-
if 后要有空格
[root@zjh home]# cat if.sh
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "我最帅"
elif [ $1 -eq 2 ]
then
echo "我最好看"
fi
[root@zjh home]# bash if.sh 2
我最好看
7.2 case语句
注意事项:
- case 行尾必须为单词"in", 每一个模式匹配必须以右括号“)”结束。
- 双分号“;;” 表示命令序列结束,相当于java中的break.
- 最后的“*)” 表示默认模式,相当于java中的default.
[root@zjh home]# cat case.sh
#!/bin/bash
case $1 in
1)
echo "班长"
;;
2)
echo "学委"
;;
3)
echo "体委"
;;
*)
exho "人妖"
esac
[root@zjh home]# bash case.sh 4
人妖
7.3 for循环
语法1
[root@zjh home]# cat for.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
[root@zjh home]# bash for.sh
5050
语法2
[root@zjh home]# cat for2.sh
#!/bin/bash
for i in $*
do
echo $i
done
for i in $@
do
echo $j
done
[root@zjh home]# bash for2.sh 1 2 //看不出什么区别
1
2
1
2
[root@zjh home]# cat for2.sh
#!/bin/bash
for i in "$*"
do
echo $i
done
for i in "$@"
do
echo $j
done
[root@zjh home]# bash for2.sh 1 2 //能看出明显区别
1 2 //$* 是把输入的看成一个整体全部赋给i
1 //$@ 是把输入分开传送,依次循环赋给j
2
7.4 while 循环
[root@zjh home]# cat while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ] //i是变量,我们这里使用的是i的值i的值为$i
do
s=$[$s + $i]
i=$[$i + 1]
done
echo $s
[root@zjh home]# bash while.sh
5050
第8章 read读取控制台输入
read(选项)(参数)
- -p 指定读取值时的提示符
- -t 指定读取值时等待的时间(秒)
参数:
变量:指定读取值得变量名
实际上就是把选项输入的值,赋给变量(参数)
# 提示7秒内,读取控制台输入的名称
[root@zjh home]# cat read.sh
#!/bin/bash
read -t 7 -p "input your name" NAME
echo $NAME
[root@zjh home]# bash read.sh //如果7秒没有输入自动结束
[root@zjh home]# bash read.sh
input your name zjh
zjh
第9章 函数
9.1 系统函数
-
basename 基本语法
basename[string / pathname] [suffix] ——basename命令会删掉所有的前缀包括最后一个(’/’)字符,然后将字符串显示出来。
选项:
suffix 为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
# 方式1 [root@zjh home]# basename /home/linux/banzhang.txt banzhang.txt # 方式2 [root@zjh home]# basename /home/linux/banzhang.txt .txt banzhang -
dirname基本语法
dirname 文件绝对路径——从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
[root@zjh home]# dirname /home/linux/banzhang.txt /home/linux
9.2 自定义函数
-
#格式 [function] funname[()] //[function] 选择项可写,可不写 { Action; [return int;] } funname -
经验技巧
-
必须在调用函数之前,先声明函数,shell脚本是逐步运行。不会像其他语言一样先编译。
-
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255).
-
# DESC 计算输入两个参数的值
[root@zjh home]# cat sum.sh
#!/bin/bash
function sum(){
s=0;
s=$[$1 + $2]
echo $s
}
read -p "input your sum1:" P1
read -p "input your sum2:" P2
sum $P1 $P2
[root@zjh home]# bash sum.sh
input your sum1:1
input your sum2:2
3
第10章 Shell工具(重点)
10.1 cut
cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出。
cut [选项参数] filename
说明:默认分隔符是制表符
- -f 列号,提取第几列
- -d 分隔符,按照指定分隔符分隔列
# DESC 切割cut.txt第一列
[root@zjh home]# cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[root@zjh home]#cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
#在cut.txt文件中切割出guan
[root@zjh home]# cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[root@zjh home]# cat cut.txt | grep guan
guan zhen
[root@zjh home]# cat cut.txt | grep guan | cut -d " " -f 1
guan
#选取系统PATH变量值,第2个“:”开始后的所有路径
[root@zjh home]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/
usr/sbin:/sbin:/home/atguigu/bin
[root@zjh home]# echo $PATH | cut -d : -f 3- //不加-表示第三列,加=表示第三列之后
/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atguigu/bin
#切割ifconfig后打印IP地址
[root@zjh ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet:192.168.56.137 netmask:255.255.255.0 broadcast:192.168.56.255
inet6 fe80::5da3:53d8:5d87:598c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ad:3d:0f txqueuelen 1000 (Ethernet)
RX packets 1818 bytes 139153 (135.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 301 bytes 28358 (27.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@zjh ~]# ifconfig ens33 | grep inet
inet:192.168.56.137 netmask:255.255.255.0 broadcast:192.168.56.255
[root@zjh ~]# ifconfig ens33 | grep inet | cut -d : -f 2
192.168.56.137 netmask
[root@zjh ~]# ifconfig ens33 | grep inet | cut -d : -f 2 | cut -d " " -f 1
192.168.56.137
####10.2 sed
1. 基本用法
- sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”,接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,文件内容并没有改变,除非你使用重定向存储输出。
2.选项参数说明
-
sed [选项参数] ‘command’ filename
- -e 直接在指令列模式上进行sed的动作编辑
3. 命令功能描述
-
a 新增,a的后面可以接字符串,在下一行出现
-
d 删除
-
s 查找并替换
# DESC 在第二行后增加mei nv字符
[root@zjh ~]# sed "2a mei nv" sed.txt //2a表示第二行
dong zhen //单个一个需求命令的话,不需要-e,后面再说
guan zhen
mei nv
wo wo
lai lai
#删除set.txt文件所有包含wo的行
[root@zjh ~]# sed '/wo/d' sed.txt
dong zhen
guan zhen
lai lai
#将sed.txt文件中wo替换为ni
[root@zjh ~]# sed "s/wo/ni/g" sed.txt g代表全局变量,把所有的wo替换为ni
dong zhen
guan zhen
ni ni
lai lai
#将sed.txt文件中的第二行删除并将wo替换成ni
[root@zjh ~]# sed -e "2d" -e "s/wo/ni/g" sed.txt
dong zhen
ni ni
lai lai
10.3 awk
awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] 'pattern1 {action1} pattern2{action2}..' filename
- -F 指定输入文件分隔符
- -v 赋值一个用户定义变量
10.4 sort
sort 命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出
sort [选项] (参数)
| 参数 | 描述 |
|---|---|
| -n | 依照数值大小排序 |
| -r | 以相反的顺序排序 |
| -t | 设置排序时使用的分隔字符 |
| -k | 指定需要排序的列 |
hen
lai lai
```c++
#将sed.txt文件中wo替换为ni
[root@zjh ~]# sed "s/wo/ni/g" sed.txt g代表全局变量,把所有的wo替换为ni
dong zhen
guan zhen
ni ni
lai lai
#将sed.txt文件中的第二行删除并将wo替换成ni
[root@zjh ~]# sed -e "2d" -e "s/wo/ni/g" sed.txt
dong zhen
ni ni
lai lai
10.3 awk
awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] 'pattern1 {action1} pattern2{action2}..' filename
- -F 指定输入文件分隔符
- -v 赋值一个用户定义变量
10.4 sort
sort 命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出
sort [选项] (参数)
| 参数 | 描述 |
|---|---|
| -n | 依照数值大小排序 |
| -r | 以相反的顺序排序 |
| -t | 设置排序时使用的分隔字符 |
| -k | 指定需要排序的列 |
版权声明
本文为[小呆鸟_coding]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45043334/article/details/124221787
边栏推荐
- DO447Ansible Tower导航
- 查看应用程序内存使用情况
- How to generate PCB real-time snapshot in 3D in Ad
- Wonderful linkage! Principle and practice of openmldb pulsar connector
- Mysql8 hard disk version installation configuration
- MongoDB——聚合管道之$match操作
- 解决Flutter中ThemeData.primaryColor在AppBar等组件中不生效
- How do programmers ensure that software is free of bugs?
- vscode 打造 shell 使用
- JDBC使用预编译执行DQL语句输出都是占位符内容,这是为什么呢?
猜你喜欢

Quantitative evaluation rules for security evaluation of commercial password applications (2021 Edition)

博图监视浮点型变量显示16#7FC0_0000异常

Go gin framework configuration log output to file

虚拟dom
![[raspberry pie C language development] experiment 12: pcf8591 analog-to-digital converter module](/img/26/0d1e1815c2ccc140eeabcfb82a8056.jpg)
[raspberry pie C language development] experiment 12: pcf8591 analog-to-digital converter module
JDBC uses precompiling to execute DQL statements, and the output is placeholder content. Why?

What is the future direction of GPU?

Class组件详解

Detailed explanation of double pointers of ring linked list 1 and 2

AI video cloud vs narrowband HD, who is the darling of the video era
随机推荐
js动态生成table表格,加滚动条
Why is Nacos so strong
"Select command denied to user 'nature' @ '192.168.1.49' for table 'user_variables_by_thread" is solved in MySQL‘“
解决方案| 快对讲调度系统:高效协作
Deep learning and image recognition: principle and practice notes day_ 18 (target detection)
How do programmers take orders alone?
sumo-绕圈行驶
Deep learning and image recognition: principle and practice notes day_ twelve
Deep learning and image recognition: principle and practice notes day_ sixteen
Bubble ranking and running for president
Redis database
Botu monitor floating-point variable display 16 7fc0_ 0000 exception
[raspberry pie C language development] experiment 12: pcf8591 analog-to-digital converter module
vscode 打造 shell 使用
Autodesk Genuine Service2020删除
Web page performance optimization
RF and microwave design software
教程——sumolympics
Detailed explanation of double pointers of ring linked list 1 and 2
小程序 关于分包