第一章 shell
一、shell脚本的基本元素
1.1 基本元素构成 :
- 第一行 '#!/bin/bash"
- 注释 :说明某些代码的功能
- 可执行语句:实现程序的功能
1.2shell脚本:
- shell脚本文件名应见名知意,扩展名为sh,如:file.sh
- shell没有强制要求,但是建议缩进,这样可以提高阅读性,程序更有层次感
- 例题:99乘法表
[root@server ~]# vim 99.sh
#!/bin/bash
for (( i=1; i<10; i++ ))
do
echo -ne "$i\t"
done
echo
for (( i=1; i<70; i++ ))
do
echo -n "="
done
echo
for (( i=1; i<10; i++ ))
do
for (( j=1; j<=i; j++ ))
do
echo -en "$i*$j=$[i*j]\t"
done
echo
done
1.2.1shell脚本的执行
- 方法一:
使用sh或bash命令执行脚本,不需要执行权限(建议使用),脚本中不需要指定脚本解释器
[root@server ~]# bash 99.sh
- 可以使用bash -n 脚本名.sh ,进行语法检错,且不执行脚本
- 方法二:
切换到脚本所在目录使用./执行脚本,但是需要增加权限
[root@server ~]# chmod +x 99.sh #增加权限
[root@server ~]# ./99.sh
- 方法三:
使用 . 或source执行脚本,不需要执行权限
[root@server ~]# . 99.sh
[root@server ~]# source 99.sh
- 注意
方法一、二都是启动一个子shell,在子shell中执行脚本,脚本中设置的变量在脚本执行完毕后不会保存
方法三是在当前shell执行的,不需要启动一个子shell,脚本中设置变量在执行完毕后会保存下来
1.3 bash shell 基本功能
1.3.1 echo 打印命令
- 格式:echo -参数 内容
- 参数
1. -n :取消输出后行末的换行符号
2.-e :启用转义符
- 可以输出带颜色的字体 :
1.格式:echo -e "\e[字体控制;字体背景或背景颜色 字符串内容 \e[0m"
2. \e[表示控制开始,\e[0m表示控制结束
3.字体控制选项 :1表示高光,4表示下划线,5颜色闪朔
4.颜色如下:字颜色:30-37,背景色:40-47
[root@server ~]# vim yanse.sh
#!/bin/bash
echo -e "\e[30m 黑色字\e[0m"
echo -e "\e[1;31m 红色字\e[0m"
echo -e "\e[32m 绿色字\e[0m"
echo -e "\e[33m 黄色字\e[0m"
echo -e "\e[34m 蓝色字\e[0m"
echo -e "\e[35m 紫色字\e[0m"
echo -e "\e[36m 天蓝色字\e[0m"
echo -e "\e[37m 白色字\e[0m"
echo -e "\e[40;37m 黑底白字\e[0m"
echo -e "\e[41;37m 红底白字\e[0m"
echo -e "\e[42;37m 绿底白字\e[0m"
echo -e "\e[43;37m 黄底白字\e[0m"
echo -e "\e[44;37m 蓝底白字\e[0m"
echo -e "\e[45;37m 紫底白字\e[0m"
echo -e "\e[46;37m 天蓝底白字\e[0m"
echo -e "\e[47;30m 白底黑字\e[0m"
~
[root@server ~]# bash yanse.sh
1.3.2 printf 命令
格式:
printf 格式控制字符串 参数列表
- 示例
[root@server ~]# printf "Hello shell\n"
Hello shell
[root@server ~]# printf "%d %s\n" 1 "abc"
1 abc
[root@server ~]# printf %s abcdef
abcdef[root@server ~]#
[root@server ~]# printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
姓名 性别 体重kg
[root@server ~]# printf "%-10s %-8s %-4.2f\n" 张三 男 66.333
张三 男 66.33
%s %c %d %f 都是格式代替符,%s 输出一个字符串,%d整形输出,%c 输出一个字符,%f 输出实数,以小数的形式输出
%-10s 指一个宽度为10个字符 (- 表示左对齐,没有则表示右对齐),任何字符都会被显示在10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
1.3.3 histroy 历史命令
- 格式 :
history [参数] [历史命令保存文件]
参数
1.-c : 清空历史记录
2. -w :把缓存中的历史命令写入历史命令保存文件。如果不手工指定历史命令保存文件,则放入历史命令保存文件~/.bash_history 中
[root@server ~]# vim /etc/profile
HISTSIZE=1000 #可以修改值
[root@server ~]# reboot #重启生效
- 面试题:显示history历史命令出现次数最高的top 10
[root@server ~]# history | tr -s " " |cut -d " " -f3 |sort |uniq -c | sort -nr | head -10
59 vim
48 ls
43 cd
31 ll
25 echo
22 cat
16 find
12 bash
11 date
10 yum
#浏览历史命令 | 压缩为1个空格 | 截取以空格为间隔符的第三部分 | 排序 |统计并去重 | 降序排序
-
面试题:增加history显示的信息,如:历史命令执行的时间
[root@server ~]# vim /root/.bashrc #编辑配置文件
#最后一行添加新行增加如下内容:
export HISTTIMEFORMAT="%Y-%m-%d %H-%M-%S: "
[root@server ~]# source ~/.bashrc #执行配置脚本,刷新配置
[root@server ~]# history #测试
1 2023-07-18 08-34-32: ifconfig
2 2023-07-18 08-34-32: touch a
3 2023-07-18 08-34-32: ls
1.3.4 命令与文件补全 :tab
1.3.5 命令别名
- 格式 :alias 别名=原命令
- 例如:
[root@server ~]# alias hi=history
[root@server ~]# hi
- 注意:别名的优先级比命令高,命令执行时的顺序如下
- 第一顺位:执行用绝对路径或相对路径执行命令
- 第二顺位 :执行别名
- 第三顺位 :执行Bash 的内部命令
- 第四顺位 :执行按照$PATH 环境变量定义的目录查找顺序找到的第一个命令。
- 为了让这个别名永久生效,可以把别名写入环境变量配置文件”~/.bashrc“
[root@server ~]# vim ~/.bashrc
#最后面添加
alias hi=history
1.3.6 命令执行顺序
- 顺序执行 : ;
[root@server ~]# date ; ls -l /etc/passwd
Tue Jul 18 07:15:01 PM CST 2023
-rw-r--r-- 1 root root 2475 Jul 14 18:01 /etc/passwd
- 前面命令执行不成功,后面命令不执行 :&& (前面命令执行成功,后面命令执行)
[root@server ~]# mkdir /file && echo 123 > file4
- 前面命令成功,后面就不执行,如果前面不成功后面就执行: ||
[root@server ~]# mkdir tt || ls /
[root@server ~]# mkdir tt || ls / #可以再次执行
1.3.7 管道符
- 符号: |,当在两个命令之间设置管道符时,管道符 | 左边命令的输出就变成右边命令的输入。只要第一个命令向标准输出写入,二第二个命令是从标志输入读取,那么这两个命令就可以形成一个管道
- 面试题:提取网卡的IP地址
[root@server ~]# ip a | grep ens160 | grep inet | cut -d "/" -f1 | tr -s " " |cut -d " " -f3
192.168.145.128
- 面试题:显示内存的剩余容量
[root@server ~]# free -h
total used free shared buff/cache available
Mem: 1.7Gi 831Mi 508Mi 15Mi 576Mi 912Mi
Swap: 1.9Gi 0B 1.9Gi
[root@server ~]# free -h | grep Mem | tr -s " " | cut -d " " -f4
508Mi
[root@server ~]# free -h | grep Mem | awk '{print $4}'
508Mi
1.3.8 exit退出程序
- 作用:终止shell程序执行
- 格式:exit 状态码
- 状态码 :该参数是一个整数值,其取值范围为0-255
- 注意:shell 程序的退出状态码储存在系统变量$?中,因此,用户可以通过该变量取得shell程序返回父进程的退出状态码
- 常见状态码
0------------------------命令运行成功 1------------------------通知未知错误 2------------------------误用shell命令 126----------------------命令不可执行 127----------------------没有找到命令 128----------------------无效退出 128+x--------------------Linux信号x的严重错误 130----------------------命令通过ctrl+c终止 255----------------------退出状态码越界