Shell脚本基础知识

关于脚本

脚本是解释性语言,脚本内容需要解释器解释,不需要编译可以直接用,但运行效率低,用于记录系统命令,是以文本形式存在的
C和JAVA等是描述性语言,是将动作描述给系统,运行效率高

shell脚本

名称:
通常以.sh 结尾
基本内容:
Author:开发者
Version:版本
Mail:邮箱
Date:时间
Description: 描述
除了以上基础内容,文件还必须以 #!/bin/bash 开始 ,其中 #!告诉系统后面的参数是用来执行文件的,/bin/bash执行文件,#!/bin/bash 是幻数,在脚本运行时先运行bash程序
当需要写注释时,以#开头
执行方法:
1、chmod +x filename.sh 加可执行权限
./filename.sh 执行脚本 或者 使用绝对路径执行脚本
2、sh xx.sh 直接执行脚本文件
shell脚本的常见编译器:bash、sh。

实验:

[root@node1 ~]# cd /mnt
[root@node1 mnt]# vim ip_show.sh

文件内容如下:
这里写图片描述
执行该脚本:
这里写图片描述

给脚本自动添加前面的脚本解释内容

[root@node1 Desktop]# vim /etc/vimrc

这里写图片描述
注意:这里F4也可以换成其他的键,只要这个按键没有其他快捷作用时。
函数设定:
func 函数名( )
内容
endfunc

[root@node1 Desktop]# vim file.sh  #当是map...时按F4文件会出现以下内容,当是autocmd时打开第一次文件就可以看到以下内容

这里写图片描述

shell 基础命令

1、diff

diff file1 file2 比较文件file1和file2的不同
a 表示添加
c 表示改变
d 表示删除
1 a|c|d 1 前面的1表示第一个文件内容第一行,后面的1表示第二个文件的第1行
这里写图片描述
这里写图片描述
这里写图片描述
关于目录的打补丁(-r表示对目录进行补丁):
这里写图片描述

2、patch

[root@node1 mnt]# cat haha1
hello
[root@node1 mnt]# cat haha2
hello
haha
[root@node1 mnt]# diff haha2 haha1
2d1
< haha
[root@node1 mnt]# diff -u haha2 haha1  #显示补丁过程
--- haha2	2018-06-13 10:20:52.750946910 -0400
+++ haha1	2018-06-13 10:21:51.844946910 -0400
@@ -1,2 +1 @@
 hello
-haha
[root@node1 mnt]# diff -u haha2 haha1 > haha.path  #将补丁过程导入.path文件
[root@node1 mnt]# cat haha.path  #查看文件内容
--- haha2	2018-06-13 10:20:52.750946910 -0400
+++ haha1	2018-06-13 10:21:51.844946910 -0400
@@ -1,2 +1 @@
 hello
-haha
[root@node1 mnt]# yum install patch -y   #下载补丁工具,patch --help 可以查看相关命令及使用规则
[root@node1 mnt]# ls
file.sh  haha1  haha2  haha.path  ip_show.sh
[root@node1 mnt]# patch haha2 haha.path  #对文件进行补丁
patching file haha2
[root@node1 mnt]# cat haha2
hello
[root@node1 mnt]# cat haha1
hello
[root@node1 mnt]# vim haha2  #修改文件内容,为了重新生成补丁
[root@node1 mnt]# cat haha2
hello
123
[root@node1 mnt]# diff -u haha2 haha1 > haha.path   ##将补丁过程导入.path文件
[root@node1 mnt]# patch -b haha2 haha.path  #-b保留原文件,并进行补丁
patching file haha2
[root@node1 mnt]# ls  #查看有生成的原文件
file.sh  haha1  haha2  haha2.orig  haha.path  ip_show.sh
[root@node1 mnt]# cat haha1
hello
[root@node1 mnt]# cat haha2
hello

3、cut

-d 匹配符号
-f 1-3 显示1-3列
-c 1-3 显示第一到三的字符

[root@node1 mnt]# cp /etc/passwd .  #以便实验将passwd文件复制
[root@node1 mnt]# ls
file.sh  ip_show.sh  linux  passwd  unix
[root@node1 mnt]# vim passwd  #删除一部分内容
[root@node1 mnt]# cat passwd  #查看文件内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@node1 mnt]# cut -d : -f 1-2 passwd  #匹配符号 :并显示1、2列
root:x
bin:x
daemon:x
adm:x
lp:x
sync:x
[root@node1 mnt]# cut -d : -f 1,3 passwd  #匹配符号 : 并显示1,3列
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
[root@node1 mnt]# cut -c 1-5 passwd  #显示第1-5个字符
root:
bin:x
daemo
adm:x
lp:x:
sync:

脚本实验:执行脚本文件只显示ip
这里写图片描述
文件内容如下,共有三种:
1、此文件内容不够严谨,当ip不在第二行时就显示不出
这里写图片描述
2、优化后文件,grep查看含有inet的内容,查看含有inet那行第10列就是ip
这里写图片描述
3、再次优化,利用awk报告生成器
这里写图片描述

4、&&和| |

&& 表示true,在条件成立时使用
| | 表示false,在条件不成立时使用

[root@node1 mnt]# ping -c1 -w1 172.25.254.69 &> /dev/null && echo this ip up || echo this is down  
#c代表次数,w代表等待时间
this ip up

脚本实验:

[root@node1 mnt]# vim check_ip.sh

这里写图片描述

[root@node1 mnt]# sh check_ip.sh 172.25.254.69
172.25.154.69 is up

5、sort

多用于字符排序
sort -n 纯数字排序
sort -r 倒序
sort -u 去掉重复的数字
sort -o 输出到指定文件
sort -t 指定分隔符
sort -k 指定要排序的列

[root@node1 mnt]# vim number
[root@node1 mnt]# cat number
1
3
5
9
33
2
54
3
4
[root@node1 mnt]# sort -n number  #纯数字排序
1
2
3
3
4
5
9
33
54
[root@node1 mnt]# sort -rn number  #倒序
54
33
9
5
4
3
3
2
1
[root@node1 mnt]# sort -rn -u number  #去掉重复的数字并倒序
54
33
9
5
4
3
2
1
[root@node1 mnt]# sort -rn number -o file  #将倒序数字输出到文件file
[root@node1 mnt]# cat file  #查看导入内容
54
33
9
5
4
3
3
2
1
[root@node1 mnt]# vim file  #修改file内容
[root@node1 mnt]# cat file  #查看修改后内容
2:54 
4:33
3:9
2:5
4:4
5:3
7:3
:2
:1
[root@node1 mnt]# sort -t : -k 1 file  #指定分隔符:对第一列排序
:1
:2
2:5
2:54
3:9
4:33
4:4
5:3
7:3

6、uniq

对重复字符作相应的处理
uniq -u 显示唯一的行
uniq -d 显示重复的行
uniq -c 每行显示一次并统计重复次数

[root@node1 mnt]# vim file  #编写文件内容
[root@node1 mnt]# cat file  #对文件内容进行查看
2:54
4:33
3:9
4:4
4:4
5:3
5:3
:2
:1
[root@node1 mnt]# uniq -u file  #显示文件唯一的行
2:54
4:33
3:9
:2
:1
[root@node1 mnt]# uniq -d file  #显示文件重复的行
4:4
5:3
[root@node1 mnt]# uniq -c file  #文件内容每行显示一次并统计重复次数
      1 2:54
      1 4:33
      1 3:9
      2 4:4
      2 5:3
      1 :2
      1 :1

7、test

和[ ]等同
test “$A” == “$B” 等同 [ “$A” == “$B” ]
[ “$A” = “$B” ]
[ “$A” != “$B” ]
[ “$A” -eq “$B” ] 等于
[ “$A” -ne “$B” ] 不等于
[ “$A” -le “$B” ] 小于等于
[ “$A” -lt “$B” ] 小于
[ “$A” -ge “$B” ] 大于等于
[ “$A” -gt “$B” ] 大于
[ “$A” -ne “$B” -a “$A” -gt “$B” ] ne表示不等于,a表示and都满足
[ “$A” -ne “$B” -o “$A” -gt “$B” ] o表示or至少满足一个
[ -z “$A” ] 表示值为空
[ -n “$A” ] 表示值不为空
[ “file1” -ef “file2” ] ef 表示文件是否为同一个文件
[ “file1” -nt “file2” ] 表示new,file1是否比file2文件新
[ “file1” -ot “file2” ] 表示old,file1是否比file2文件老
注意:在编写文档时注意[ ]里面的内容前后要有空格,“”必须是英文的,不然在执行脚本时会报错。

[root@node1 mnt]# a=1
[root@node1 mnt]# b=2
[root@node1 mnt]# test "$a" == "$b" && echo yes || echo no #判断a和b是否相等
no  
[root@node1 mnt]# [ "$a" == "$b" ] && echo yes || echo no
no
[root@node1 mnt]# ls
check_ip.sh  file  file.sh  ip_show.sh  linux  number  passwd  unix
[root@node1 mnt]# ln /mnt/file /mnt/file1  #创建硬连接
[root@node1 mnt]# ls -li *  #查看连接
11759340 -rw-r--r-- 1 root root 363 Jun 13 10:49 check_ip.sh
11759361 -rw-r--r-- 2 root root  36 Jun 13 10:56 file
11759361 -rw-r--r-- 2 root root  36 Jun 13 10:56 file1
11759332 -rw-r--r-- 1 root root   2 Jun 13 10:06 file.sh
11759341 -rwxr-xr-x 1 root root  60 Jun 13 10:39 ip_show.sh
11759348 -rw-r--r-- 1 root root  20 Jun 13 10:52 number
11759343 -rw-r--r-- 1 root root 215 Jun 13 10:41 passwd

linux:
total 0
33572969 -rw-r--r-- 1 root root 0 Jun 13 10:30 haha

unix:
total 0
[root@node1 mnt]# [ "/mnt/file" -ef "/mnt/file1" ] && echo yes || echo no  
#判断文件是否为硬链接
yes
[root@node1 mnt]# [ "/mnt/file" -ef "/mnt/number" ] && echo yes || echo no  
no 
[root@node1 mnt]# [ "/mnt/file" -ot "/mnt/number" ] && echo yes || echo no  
#判断file是否比number文件老
no
[root@node1 mnt]# [ "/mnt/file" -nt "/mnt/number" ] && echo yes || echo no  
#判断file是否比number文件新
yes

脚本实验:输入一个数与10比较大小

[root@node1 mnt]# vim num_check.sh

这里写图片描述
测试:
这里写图片描述

8、test测试文件类型

-e 表示存在
-f 普通文件
-L 软连接,在脚本文件中写判断文件类型时,将软连接判断写在普通文件判断前面,因为软连接也是一种文本文件
-S 套接字
-b 块设备
-d 目录
-c 字符设备

[root@node1 mnt]# vim file.sh

文件内容如下:
这里写图片描述

[root@node1 mnt]# ls
file.sh
[root@node1 mnt]# sh file.sh -e  #判断file是否存在
no
[root@node1 mnt]# touch file
[root@node1 mnt]# sh file.sh -e
yes
[root@node1 mnt]# sh file.sh -f  #判断file是否为普通文件
yes
[root@node1 mnt]# sh file.sh -L  #判断file是否为软连接
no
[root@node1 mnt]# ln -s /mnt/file.sh file  #创建软连接
[root@node1 mnt]# sh file.sh -L 
yes
[root@node1 mnt]# sh file.sh -S  #判断file是否为套接字
no
[root@node1 mnt]# yum install mariadb-server -y  #下载mariadb服务软件
[root@node1 mnt]# rsync -D /var/lib/mysql/mysql.sock /mnt/file  #复制mysql套接字文件到file
[root@node1 mnt]# sh file.sh -S
yes
[root@node1 mnt]# sh file.sh -b  #判断file是否为块设备
no
[root@node1 mnt]# rsync -D /dev/vdb /mnt/file  #将设备vdb复制到文件file
[root@node1 mnt]# sh file.sh -b
yes
[root@node1 mnt]# sh file.sh -d  #判断file是否是目录
no
[root@node1 mnt]# rm -f file   #删除file
[root@node1 mnt]# mkdir file  #创建目录file
[root@node1 mnt]# sh file.sh -d
yes
[root@node1 mnt]# sh file.sh -c  #判断file是否为字符设备
no
[root@node1 mnt]# rsync -D /dev/pts/ /mnt/file  #输入键放在/dev/pts后按Tab查看字符设备 
0     ptmx  
[root@node1 mnt]# rsync -D /dev/pts/0 /mnt/file  #将字符设备同步到file
[root@node1 mnt]# sh file.sh -c
yes

9、tr

tr 转换字符大小
格式:tr 参数1 参数2 标准输入

[root@node1 mnt]# vim file
[root@node1 mnt]# cat file
abc 
def
[root@node1 mnt]# tr 'a-z' 'A-Z' < file  #将文件小写字符转换为大写
ABC 
DEF
[root@node1 mnt]# tr 'A-Z' 'a-z' < file   #将文件大写字符转换为小写
abc 
def

脚本实验:
判断执行脚本时输入的内容和hello是否相等

[root@node1 mnt]# vim haha.sh

这里写图片描述
这里写图片描述
出现上面的情况是因为执行判断时不能自动转换字母的大小写,以致输入大写时会出现不相等的情况,这时就需要 tr 命令对输入的内容进行转义

[root@node1 mnt]# vim haha.sh

修改后文件内容为:
这里写图片描述
然后进行判断大小写都可以:
这里写图片描述

10、shell 脚本排错

[root@node1 mnt]# vim haha.sh

文件内容如下(将命令ifconfig写错):
这里写图片描述
执行文件会进行报错但是不知道具体时间那个命令写错了,这时加 -x 参数观察运行情况,会对具体命令以及行数进行报错。
这里写图片描述
查看脚本内容的具体错误提示,根据提示进行相应修改即可

脚本建立用户

步骤:
1、查看脚本后所跟字符是不是两串
2、查看用户是否存在,如果不存在
3、建立不存在的用户并设定密码

[root@node1 mnt]# vim user_create.sh

文件内容如下:
这里写图片描述
测试执行脚本时后面不跟字符,以及跟字符建立用户,和再次建立用户:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: b'shell脚本基础知识'是指对b'shell脚本'进行基础掌握的知识,包括b'shell脚本'的语法、变量、流程控制、函数等基础内容。了解b'shell脚本基础知识,可以帮助用户更好地编写和运行b'shell脚本',提高工作效率和准确性。 ### 回答2: Shell是一种可以执行Linux命令的脚本语言,是Linux系统中必不可少的一部分。Shell脚本是一种文本文件,其扩展名通常为.sh或.bash。Shell脚本可以编写一些自动化的任务,使得Linux操作更加方便和高效。 Shell脚本基础知识包括以下内容: 1. Shell脚本的创建和执行 Shell脚本可以使用vi或其他文本编辑器创建,创建完成后用chmod命令设置为可执行权限。执行脚本有两种方式:直接输入脚本名,或用bash命令执行脚本。例如,执行名为test.sh的脚本,可用以下两种方式: ./test.sh bash test.sh 2. Shebang行 Shell脚本的第一行需要写上Shebang行,指定解释器的路径。在Linux系统中,默认的解释器为/bin/bash。因此,Shebang行通常是: #!/bin/bash 3. 变量和环境变量 Shell脚本中使用的变量需要先定义,然后才能使用。定义变量的方式为: 变量名=变量值 变量名前面必须添加美元符号$,才能获取到变量的值。可以使用echo命令输出变量值,例如: name="tom" echo $name 环境变量是一种全局变量,可以在Shell脚本中使用。Linux系统中有很多预定义的环境变量,例如: $HOME:当前用户的家目录。 $PATH:程序搜索路径。 $USER:当前登录用户的用户名。 4. 控制流语句和函数 Shell脚本支持各种控制流语句,例如if、for、while等。函数的定义和使用也和其他编程语言类似,例如: function_name(){ commands } function_name 5. 输入和输出重定向 在Shell脚本中,可以使用重定向符号>和<来重定向输入和输出。例如,将输出重定向到文件中,可以使用: echo "hello" > output.txt 将输入重定向到文件中,可以使用: read input_var < input.txt Shell脚本基础知识是编写自动化任务的基础,了解和掌握这些知识可以使得Shell脚本更加高效和便捷。 ### 回答3: Shell脚本是一个用来编写命令行脚本脚本语言。脚本语言和编译型语言不同,它的代码不需要被编译成可执行文件,而是直接解释执行。 Shell脚本的特点是写文本文件,执行系统命令。在Unix/Linux操作系统中,Shell是最基本的界面,与其他操作系统类似,用户可以在Shell界面下输入各种命令来控制和操作计算机系统。 Shell脚本基础知识包括: 1. Shell脚本的文件格式,一般以.sh作为文件扩展名,脚本的执行需要给定执行权限(chmod +x filename.sh)。 2. 开始行(Shebang):开头的两个字符#!(Shebang)指定执行本脚本文件所使用的Shell解释器。一般来说,使用Bash解释器,开始行应该这样写:#!/bin/bash 3. 变量:在Shell脚本中,用$符号表示,变量名和等号之间不能有空格。例如:var=123 4. 数组:在Shell脚本中,用小括号()表示,使用花括号{}和下标来引用数组中的元素。例如:arr=(1 2 3) echo ${arr[1]} 5. 流程控制语句:if、while、case、for等,用于实现分支和循环等控制流程。 6. 命令行参数:在执行脚本时从命令行传入,用$符号表示。例如:在命令行执行:./test.sh arg1 arg2,则脚本中可以用$1表示arg1,$2表示arg2。 7. 取键盘输入:使用read命令,例如:read name,表示从键盘取一行文本并存储到变量name中。 8. 函数:用于将一些重复的命令封装起来,实现代码复用。例如: function test(){ echo "hello world"}。 Shell脚本是Unix/Linux操作系统的基础,掌握Shell脚本基础知识是很重要的。在实践中不断熟练掌握Shell脚本,可以提高个人的工作效率和工作质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值