目录
一、shell概述
二、shell脚本准备知识
三、条件判断
四、结尾
一、shell概述
1、什么是shell
shell是一种命令语言,是为使用者提供操作界面的一种软件,软件可以接收用户的命令,并且执行用户输入的命令,然后对相应的程序进行调用。
2、shell可以分为两种方式
1)shell命令行式
例如一些系统linux,从传统的意义上来说,如果不去注明的话,shell一般是命令行式。shell是传统操作和外部的接口,shell是操作系统的最外层,并且管理用户和操作系统之间的交互,操作系统完成用户的操作,并且处理输出结果。shell实现了用户和系统之间的交互,用户在键盘上输入,并且得到响应,shell基本上算是一个命令解析器吧。
2)图形界面shell
目前应用最广的windows操作系统,还有很多Linux shell,并且包含了FluxBox和CDE。
3、shell的分类
shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、bash、psh、zsh;C家族主要包括csh、tcsh(bash和zsh在不同程度上支持csh的语法)
我们可以通过/etc/shells条件来查询linux支持的shell。命令如下:[root@localhost ~] vi /etc/shells /bin/sh/bin/bash/usr/bin/sh/usr/bin/bash/bin/tcsh/bin/csh
4、shell 编程有哪些注意事项
shell 命名:Shell脚本名称命名一般为英文、大写、小写,后缀以.sh 结尾,不能使用特殊符号、空格,名称最好要写的一眼可以看出功能
shell 编程 首行需要 #!/bin/bash 开头
shell 脚本变量不能以 数字、特殊符号开头,可以使用下划线—,但不能用破折号
二、shell脚本准备知识
1、echo
具体用法使用man或者–help和info查看相关文档帮助
例子
[root@localhost ~] echo -e "\\ \a"\ #这个输出会输出\,同时在系统音响中输出一声提示音[root@localhost ~] echo -e "ab\bc"ac#这个输出中在b键左侧有"\b",所以输出时会有ac[root@localhost ~] echo -e "a\tb\tc\td\tf"abcdf#加入了制表符"\t"和换行符“\n”,所以会按照格式输出[root@localhost ~] [root@localhost ~] echo -e "\e[1;31m abcd \e[0m" abcd [root@localhost ~] echo -e "\e[1;42m abcd \e[0m" abcd[root@localhost ~] 这个命令会显示出设定的颜色,即\e[1是标准格式,代表颜色输出开始,\e[0m代表颜色输出结束。普通颜色:31m定义字体是红色。echo能够识别的颜色如下:30m是黑色,31m是红色,32m是绿色,33m是黄色,34m是蓝色,35m是洋红,36m是青色,37m是白色;背景色:40m是黑色,41m是红色,42m是绿色,43m是黄色,44m是蓝色,45m是洋红,46m是青色,47m是白色
2、脚本的编写与执行
[root@localhost ~] vim hello.sh[root@localhost ~] cat hello.sh #!/bin/bash #第一行代表调用bash的解释器echo hello #英文不需要用括号和双引号echo "我是xxx" #有中文的地方需要用双引号把中文括起来[root@localhost ~] chmod +x hello.sh [root@localhost ~] ./hello.sh hello我是xxx
3、bash的基本功能
1)历史命令的查看[root@localhost ~] history [选项] [历史命令保存文件]选项: -c: 清空历史命令 -w: 把缓存中的历史命令写入历史命令保存文件,如果不手工指定历史命令保存文件,则放入默认的历史命令保存文件/.bash_history中2)历史命令的调用:使用history直接查看*使用上、下箭头调用以前的历史命令*使用“!n”重复执行第n条历史命令*使用“!!”重复执行上一条命令*使用“!字串”重复执行最后一条以该字串开头的命令*使用“!$”重复该上一条命令的最后一个参数3)命令和文件的补全----tab键
4、命令别名查看
[root@localhost ~] alias alias cp='cp -i'alias egrep='egrep --color=auto'alias fgrep='fgrep --color=auto'alias grep='grep --color=auto'alias l.='ls -d .* --color=auto'alias ll='ls -l --color=auto'alias ls='ls --color=auto'alias mv='mv -i'alias rm='rm -i'alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'[root@localhost ~] alias是查询系统中定义的别名,相当于快捷键alias 别名=‘原命令' #设定命令别名
5、快捷键的使用
快捷键ctrl+c 强制终止当前命令ctrl+z 强制终止当前命令ctrl+d 退出当前终端ctrl+l 清屏,相当于clearctrl+a 在命令行输入命令的时候,把当前光标移动到命令行的开头ctrl+e 在命令行输入命令的时候,把当前光标移动至命令行的结尾ctrl+u 在命令行输入命令的时候,删除或者剪切所有命令ctrl+k 在命令行输入命令的时候,删除或者剪切光标之后的内容ctrl+y 在命令行粘贴ctrl+u或者ctrl+k剪切的内容ctrl+s 暂停屏幕输出ctrl+q 恢复屏幕输出
6、输入输出重定向
设备 设备文件名 文件描述符 类型键盘 /dev/stdin 0 标准输入显示器 /dev/stdout 1 标准输出显示器 /dev/stderr 2 标准错误输出
7、输出重定向
8、统计
[root@localhost ~] wc [选项] [文件名]选项: -c 统计字节数 -w 统计单词数 -l 统计行数
9、多行命令顺序执行
10、管道符
[root@localhost ~] grep [选项] "搜索内容" 文件名选项: -A 数字: 列出符合条件的行,并列出后续的n行 -B 数字: 列出符合条件的行,并列出前面的n行 -c: 统计找到符合条件的字符串的次数 -i: 忽略大小写 -n: 输出行号 -v: 反向查找 --color=auto 搜索出的关键字用颜色表示[root@localhost ~] find [选项] [搜索内容]选项: 具体选项这里就不一一列举了,man、--help和info里面都有详细介绍```bash[root@localhost ~] cat /etc/passwd |find -name "root"./.local/share/gvfs-metadata/root[root@localhost ~] cat /etc/passwd |grep "root"root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin[root@localhost ~] 这就是管道符的作用,筛选
11、通配符
12、bash中的其他特殊符号
测试1
[root@localhost ~] name=xxx[root@localhost ~] echo '$name'$name[root@localhost ~] echo "$name"xxx[root@localhost ~] echo `$name`bash: xxx: 未找到命令...#反引号只能调用系统命令[root@localhost ~] echo `date`2022年 04月 26日 星期二 19:39:05 CST[root@localhost ~] echo "`date`"2022年 04月 26日 星期二 19:39:15 CST[root@localhost ~] echo lsls[root@localhost ~] echo `ls`aliyun和epel源.sh anaconda-ks.cfg epel-release-latest-7.noarch.rpm Firefox_wallpaper.png firewalld.sh hello.sh hostname.sh initial-setup-ks.cfg install.sh ip1.sh ip1.yml ip2.sh ip2.yml playbook剧本.yml selinux.sh shell脚本.sh 公共 模板 视频 图片 文档 下载 音乐 桌面[root@localhost ~] echo $(date)2022年 04月 26日 星期二 19:39:43 CST
测试2
root@localhost ~] a=123[root@localhost ~] a="$a"456[root@localhost ~] echo $a123456[root@localhost ~] [root@localhost ~] a=${a}789[root@localhost ~] echo $a123456789[root@localhost ~]
测试3
[root@localhost ~] 2name="yao ming" #变量名不能以数字开头bash: 2name=yao ming: 未找到命令...[root@localhost ~] name = "yaoming" #等号左右两侧不能有空格bash: name: 未找到命令...[root@localhost ~] name=yao ming #变量的值如果有空格,必须用双引号扩起来bash: ming: 未找到命令...[root@localhost ~] name="yao ming" #定义变量[root@localhost ~] echo $name #输出变量的值yao ming变量查看[root@localhost ~] set [选项]选项: -u: 如果没有此选项,调用为声明变量时会报错(默认无任何提示) -x: 如果设置此项,在命令执行之前,会把命令先输出一次变量删除[root@localhost ~] unset 变量名环境变量设置[root@localhost ~] export age="18"#声明export声明的变量既是环境变量环境变量查询和删除[root@localhost ~] unset gender[root@localhost ~] env | grep gender#删除环境变量gender系统默认环境变量[root@localhost ~] envHOSTNAME=localhost.localdomain #主机名TERM=xterm-256color #终端环境SHELL=/bin/bash #当前的shellSSH_CLIENT=192.168.16.135 #当前操作环境是用ssh连接的,这里记录客户端ipHISTSIZE=1000 #历史命令条数SSH_TTY=/dev/pts/1 #ssh连接终端的pts/1USER=root #当前登录的用户LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:age=18 #我们刚才定义的环境变量PATH=usr/lib/gt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin #系统查找命令的路径MAIL=/var/spool/mail/root #用户邮箱PWD=/root #当前所在目录LANG=zh_CN.UTF-8 #当前语系MACHTYPE=i386-redhat-linux-gnu #软件类型是i386兼容类型MATLCHECK=60 #每六十秒去扫描新邮件PPID=2166 #父shell的pid。我们当前是一个子shellPS1='[\u@\h \w]$' #命令提示符PS2='>' #如果命令一行没有输入完成,第二行的提示符UID=0 #当前用户的uid
测试4
查看当前语系[root@localhost ~] localeLANG=zh_CN.UTF-8LC_CTYPE="zh_CN.UTF-8"LC_NUMERIC="zh_CN.UTF-8"LC_TIME="zh_CN.UTF-8"LC_COLLATE="zh_CN.UTF-8"LC_MONETARY="zh_CN.UTF-8"LC_MESSAGES="zh_CN.UTF-8"LC_PAPER="zh_CN.UTF-8"LC_NAME="zh_CN.UTF-8"LC_ADDRESS="zh_CN.UTF-8"LC_TELEPHONE="zh_CN.UTF-8"LC_MEASUREMENT="zh_CN.UTF-8"LC_IDENTIFICATION="zh_CN.UTF-8"LC_ALL=[root@localhost ~] echo $LANGzh_CN.UTF-8查看文件系统[root@localhost ~] df文件系统 1K-块 已用 可用 已用% 挂载点devtmpfs 1913608 0 1913608 0% /devtmpfs 1930632 0 1930632 0% /dev/shmtmpfs 1930632 12600 1918032 1% /runtmpfs 1930632 0 1930632 0% /sys/fs/cgroup/dev/mapper/centos_192-root 52403200 5158304 47244896 10% //dev/sda1 1038336 242936 795400 24% /boot/dev/mapper/centos_192-home 47285700 33108 47252592 1% /hometmpfs 386128 20 386108 1% /run/user/0/dev/sr0 4554702 4554702 0 100% /run/media/root/CentOS 7 x86_64[root@localhost ~]#
13、位置参数变量
14、PATH变量
[root@localhost ~] echo $PATH/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin[root@localhost ~] echo $PS1[\u@\h \W]\$#[用户名@简写主机名 最后所在目录]提示符[root@localhost ~]# ✧. PS1变量:命令提示符设置PS1是一个很有意思的变量(这可不是SONY的游戏机哦) ,是用来定义命令行的提示符的,可以安装我们自己的需求来定义自己喜欢的提示符。PS1 可以支持以下这些选项:\H: 显示完整的主机名。如默认主机名“localhost. localdomain”\h: 显示简写主机名。如默认主机名“localhost”\t: 显示24小时制时间,格式为“HH:M:SS”\T:显示12小时制时间,格式为“H:M:SS”\A: 显示24小时制时间,格式为“HH:MM”\@: 显示12小时制时间,格式为“HH:MM am/ pm”显示当前用户名显示Bash的版本信息:显示当前所在目录的完整名称\W: 显示当前所在目录的最后一个目录\#: 执行的第几个命令\$: 提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
这些选项该怎么用啊?我们先看看PS1变量的默认值吧:[root@localhost ~] echo $PS1[\u@\h \w]\$#默认的提示符是显示“[用户名@简写主机名最后所在目录]提示符”在PS1变量中,如果是可以解释的符号,如“\u”、“\h” 等,则显示这个符号的作用。如果是不能解释的符号,如“@”或“空格”,则原符号输出。那么我们修改下PS1变量,看看会出现社么情况吧:[root@04:50:08 /usr/local/src] PS1=' [\u@\@ \h \# \W]\$'[root@04:53上午localhost 31 src]##提示符又变了。|@: 时间格式是HH:LN am/pom; |#: 会显示执行了多少个命令PS1变量可以自由定制,好像看到了点Linux可以自由定制和修改的影子,还是很有意思的。不过说实话- -个提示符已经使用习惯了,如果换一个还是非常别扭的,还是改回默认的提示符吧:[root@04:53上午localhost 31 src] PS1=' [\u@\h \W]\$[root@localhost src]#LANG变量定义了Linux系统的主语系环境,这个变量的默认值是:[root@localhost src] echo $LANGzh_ CN.UTF-8这是因为我们Linux安装时,选择的是中文安装,所以默认的主语系变量是“zh_ CN. UTF-8”。那么Linux中到底支持多少语系呢?我们可以使用以下命令查询:[root@localhost src] locale -a| moreaa DJ. iso88591aa_ DJ.utf8aa_ ER...省略部分输出..#查询支持的语系[root@localhost src] locale -a| wc -l我们支持这么多的语系,当前系统到底是什么语系呢?使用locale命令直接查询:[root@localhost src] localeLANG=zh_ CN.UTF-8LC CTYPE="zh CN.UTF-8”
15、预定义变量
预定义变量 作用$? 最后一次执行的命令返回状态,0为正常执行$$ 当前进程的进程号(pid)$! 后台运行的最后一个进程的进程号(pid)
16、接收键盘输入
[root@localhost^ ] read [选项] [变量名]选项:-p“提示信息” : 在等待read输入时,输出提示信息-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间-n字符数: read命令只接受指定的字符数,就会执行-s: 隐藏输入的数据,适用于机密信息的输入变量名:变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY如果只提供了一一个变量名,则整个输入行赋予该变量如果提供了一个以上的变量名,则输入行分为若干字,- 一个接一- 个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有字还是写个例子来解释下read命令:[root@localhost sh] vi read. sh#!/bin/bashread -t 30 -p "Please input your name: ”name#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中echo "Name is $name'#看看变量“$name ”中是否保存了你的输入read -S -t 30 -p "Please enter your age:”age #提示输入年龄”并等待30秒, 把用户的输入1车入变量a#年龄是隐私,所以我们用“-5”选项隐藏输入#调整输出格式,如果不输出换行,一会的年龄输出不会换行echo "Age is $age"read -n 1 -t 30 -p "Please select your gender[M/F]:" gender 20/31#提示“请选择性别”并等待30秒,把用户的输入保存入变量gender#使用“-n 1”选项只接收-一个输入字符就会执行 (都不用输入回车)echo -e "\n”echo "Sex is $gender"
17、使用declare声明变量
数值运算的方法那如果我需要进行数值运算,可以采用以下三种方法中的任意-一种:✧使用declare声明变量类型既然所有变量的默认类型是字符串型,那么只要我们把变量声明为整数型不就可以运算了吗?使用declare命令就可以实现声明变量的类型。命令如下:[root@localhost^ ] declare [+/-][选项] 变量名选项:-: 给变量设定类型属性+: 取消变量的类型属性-a: 将变量声明为数组型-i: 将变量声明为整数型(integer)-r: 讲变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过+r 取消只读属性-x: 将变量声明为环境变量-p: 显示指定变量的被声明的类型
例如
[root@localhost ~] aa=10[root@localhost ~] bb=20[root@localhost ~] declare -i cc=$aa+$bb[root@localhost ~] echo $cc30[root@localhost ~] 首先赋予aa和bb值,之后再声明变量cc的值是整数性,他的值是aa和bb的和[root@localhost ~] declare +i cc=$aa+$bb[root@localhost ~] echo $cc10+20[root@localhost ~] 这里就是取消声明他的值不是aa和bb的和其他的具体怎么用自己多多尝试吧,在这里我就不一一例举了
18、使用expr或者let数值以及 $((运算式)) 或 $[运算式] 的运算工具
[root@localhost ~] aa=100[root@localhost ~] bb=200[root@localhost ~] dd=$(expr $aa + $bb)[root@localhost ~] echo $dd300[root@localhost ~] 使用expr运算的时候要注意“+”左右都有空格,否则运算不执行[root@localhost ~] n=200[root@localhost ~] let n+=1[root@localhost ~] echo $n201[root@localhost ~]定义变量n的值,使n的值等于变量本身再加1[root@localhost ~] aa=600[root@localhost ~] bb=300[root@localhost ~] cc=$(( $aa+$bb ))[root@localhost ~] echo $cc900[root@localhost ~] dd=$[ $aa-$bb ][root@localhost ~] echo $dd300[root@localhost ~]这里运算符之间无需空格即可实现数值运算
19、运算符
优先级 | 运算符 | 说明 |
---|---|---|
13 | -,+ | 单目负、单目正 |
12 | !,~ | 逻辑非、按位取反或补码 |
11 | *,/,% | 乘,除,取模 |
10 | +,- | 加,减 |
9 | << , >> | 按位左移、按位右移 |
8 | <= , => , < , > | 小于或等于、大于或等于、小于、大于 |
7 | == , != | 等于、不等于 |
6 | & | 按位与 |
5 | ^ | 按位异或 |
4 | 符号是一竖杆 | 按位或,由于无法识别,这里用汉字代替 |
3 | && | 逻辑与 |
2 | 两条竖杠 | 逻辑或,由于无法识别,这里用汉字代替 |
1 | =,+=,-=,*=,/=,%=,&=,^=,竖杠加等于,<<=,>>= | 赋值、运算且赋值 |
例如
[root@localhost ~] [root@localhost ~] aa=$(( (100+2)*3/2 ))[root@localhost ~] echo $aa153[root@localhost ~] bb=$(( 1 && 0 ))[root@localhost ~] echo $bb0[root@localhost ~]
20、变量的测试与内容置换
21、删除变量
unset [指定变量名]
例如:
unset y删除变量y
22、环境变量配置文件
source 配置文件或. 配置文件
在linux系统登录的时主要生效的配置文件有以下五个/etc/profile/etc/profile.d/*.sh~/.bash_profile~/.bashrc/etc/bashrc
查询所有快捷键
[root@localhost ~] stty -aspeed 38400 baud; rows 24; columns 80; line = 0;intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;lnext = ^V; flush = ^O; min = 1; time = 0;-parenb -parodd -cmspar cs8 hupcl -cstopb cread -clocal -crtscts-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff-iuclc ixany imaxbel iutf8opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprtechoctl echoke[root@localhost ~]更改快捷键[root@localhost ~] stty 关键字 快捷键[root@localhost ~]例如[root@localhost ~] stty intr ^p[root@localhost ~] 最后强制终止变成了ctrl+p快捷键
23、shell登录信息
24、正则表达式
扩展正则表达式
扩展元字符 | 作用 |
---|---|
+ | 前一个字符匹配1次或任意多次 |
? | 前一个字符匹配0次或1次 |
一条竖杠(这里由于显示不出来,所以用汉字表示) | 匹配两个或者多个分支选择 |
() | 匹配其整体为一个字符,即模式单元。可以理解为由多个单个字符组成的大字符 |
25、字符截取和替换命令
[root@localhost ~] cut 用法:cut [选项]... [文件]...-f 列号-d 分隔符-c 字符范围例如:cut (内容之间只能使用tab键,不能使用空格,否则会出错) 提取列cut -f 2 xxx.txt #在xxx.txt这个文本中提取第二列cat xxx.txt | grep "xxx" |cut -d ":" -f 1 #在xxx.txt这个文件中搜索xxx的信息,最后提取以冒号为分割的并输出第一行[root@localhost ~]#
awk的条件
awk内置变量
awk中printf以及print的使用
[root@localhost ~] printf 格式化并显示数据(提取出的内容无空格)%ns: 输出n个字符%ni: 输出n个整数%m.nf:输出[root@localhost ~] awk (可以提取有空格和tab键的内容)例如:[root@localhost ~] df -h文件系统 容量 已用 可用 已用% 挂载点devtmpfs 1.9G 0 1.9G 0% /devtmpfs 1.9G 0 1.9G 0% /dev/shmtmpfs 1.9G 13M 1.9G 1% /runtmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup/dev/mapper/centos_192-root 50G 5.0G 46G 10% //dev/sda1 1014M 238M 777M 24% /boot/dev/mapper/centos_192-home 46G 33M 46G 1% /hometmpfs 378M 4.0K 378M 1% /run/user/42tmpfs 378M 24K 378M 1% /run/user/0/dev/sr0 4.4G 4.4G 0 100% /run/media/root/CentOS 7 x86_64[root@localhost ~] df -h |awk '{printf $5}' #无空格已用%0%0%1%0%10%24%1%1%1%100%[root@localhost ~]# [root@localhost ~] df -h |awk '{print $5}' #有空格已用%0%0%1%0%10%24%1%1%1%100%[root@localhost ~]# [root@localhost ~] df -h |awk '{print $5 "\t" "\n"}' #排列整齐已用%0%0%1%0%10%24%1%1%1%100%[root@localhost ~]#
又或者:
#这是在截取的内容最末尾显示想要的内容,比如666[root@localhost ~] df -h |awk 'END{print 666} {printf $2 "\t" "\n"}'容量1.9G1.9G1.9G1.9G50G1014M46G378M378M4.4G666[root@localhost ~] df -h |awk 'BEGIN{print 666} {printf $2 "\t" "\n"}'666容量1.9G1.9G1.9G1.9G50G1014M46G378M378M4.4G#这是在截取的内容最开头显示想要的内容,比如666
sed命令
sed命令[root@localhost ~] sed [选项] '[动作]' 文件名例:sed '3c 4 abc 11 22 33' xxx.txt#将xxx.txt文件中第三行的内容换成“4、abc、11、22、33”```bashsed '2p' xxx.txt #查看某文档的第二行,具体用法这里就不一一列举了
sort命令
例子:sort /etc/passwd #从a开始排序sort -r /etc/passwd #在上一步的基础上反过来排序-u 取消重复行
三、条件判断
按文件类型判断:
2、按文件权限判断
3、两个文件之间的比较
4、两个整数之间的比较
5、字符串的判断
6、多重条件判断
四、结尾
首先恭喜您能够看到这里,当然看到这里仅仅是不够的,希望能边看便练习、形成记忆,并自己尝试不看代码就能够很轻松写出一些来,那么再次恭喜您,又往更加深一层迈去,不过还只是刚踏进一只脚进去、不要灰心,多多学习多多思考,我相信如果这些内容您学得都差不多了、又或者了解了个大概,以后不管是学哪门编程语言都很轻松!
如果本文对您有一点点帮助,可以点赞、关注、收藏一下
来源地址:https://blog.csdn.net/qq_51625703/article/details/124430435