Shell 脚本编程1(常用命令+概述)
shell:命令解释器,将我们一直以来使用的命令翻译成机器可以懂得指令,让其执行。
脚本:可以运行的文本就是脚本。
编程:将已经学习过得命令,按照一定顺序(流程控制)组合起来,批量执行。
1. 常用命令
1.1 设置主机名
方式1:修改 /etc/hostname 文件,在文件中写入主机名称
vim /etc/hostname
# 添加如下内容
openEuler
# 保存退出
方式2:使用hostname 命令修改
#格式
hostnamectl set-hostname 主机名称# 修改主机名称
[root@localhost ~]# hostnamectl set-hostname OpenEuler
方式3:脚本传参
shell脚本中可以使用$num表示调用传入的第几个参数,参数之间使用空格进行间隔的。
以下脚本用于设置虚拟机的名称
echo $1 > /etc/hostname
echo "你传入的第一个参数是:"$1# 在运行此脚本的时候 $1就表示 第一个参数 如果有多个参数 依次以$2 $3 $4...表示
# 改脚本还可以改为
hostnamectl hostanme $1
echo "你传入的第一个参数是:"$1
1.2 nmcli
格式
nmcli [OPTIONS] OBJECT { COMMAND | help }
查看网卡名称
nmcli [OPTIONS] OBJECT { COMMAND | help }
设置IP地址为150
[root@server ~]# nmcli c modify ens32 ipv4.addresses 192.168.72.150/24 ipv4.method manual ipv4.dns 114.114.114.114
[root@server ~]# nmcli c modify ens32 ipv4.gateway 192.168.72.2
[root@server ~]# nmcli c modify ens32 autoconnect yes
[root@server ~]# nmcli c up ens32
增加ip
[root@server ~]# nmcli c modify ens32 +ipv4.addresses 192.168.72.151/24
[root@server ~]# nmcli c up ens32
1.3 echo
作用
echo是用于终端打印的基本命令,默认情况下,echo 在每次调用后会添加一个换行符
示例
echo参数选项 | 说明 |
---|---|
-n | 不换行输出内容 |
-e | 解析转义字符 |
示例
# -n输出内容并且内容之后不换行
[root@22222 ~]# echo -n hhahaha
hhahaha[root@22222 ~]## -e 对转义符进行转义
[root@22222 ~]# echo "i\nam\nyour\nteacher\n"
i\nam\nyour\nteacher\n
[root@22222 ~]# echo -e "i\nam\nyour\nteacher\n"
i
am
your
teacher
[root@server ~]# echo -n i have a cat[root@server ~]# echo i\thave\ta\tcat[root@server ~]# echo -e i\thave\ta\tcat[root@server ~]# echo -e "i\thave\ta\tcat"
1.4 export
- export命令用于设置或者显示环境变量
[root@server ~]# mingzi=hehe
[root@server ~]# echo $mingzi
hehe# 进入子shell
[root@server ~]# bash
[root@server ~]# echo $mingzi
# 返回父shell
[root@server ~]# exit
exit[root@server ~]# export mingzi
# 进入子shell
[root@server ~]# bash
[root@server ~]# echo $mingzi
hehe
# 导出环境变量将普通变量name升级为环境变量
[root@22222 ~]# name=liuyinghao
[root@22222 ~]# echo $name
liuyinghao
[root@22222 ~]# export name
[root@22222 ~]# zsh
[root@22222]~# echo $name
liuyinghao# 直接使用export创建环境变量
[root@22222 ~]# export name=heroliu
[root@22222 ~]# echo $name
heroliu
[root@22222 ~]# zsh
[root@22222]~# echo $name
heroliu
[root@22222]~# bash
[root@22222 ~]# echo $name
heroliu
1.5 read
作用
read 命令可从标准输入读取字符串等信息,然后传递给shell程序内部定义的变量使用。
read 是一个重要的 bash 命令,用于从键盘或标准输入读取文本,我们可以使用 read 命令以交互形式读取来自用户的输入,当然 read 能做的远不止这些。
通常我们按下回车键表示命令输入完成,但是很特殊情况下,我们需要基于字符数或者特定字符来表示命令输入完成
语法
read [选项]
常用选项:
-a 读取的内容存入数组
-d 持续读取直到读入 DELIM 变量中的第一个字符,而不是换行符
-i 用于给变量一个默认值
-k 用于读取指定数量的键盘输入内容
-n/N 读取N个字符
-p 指定提示信息,用于等待输入
-r 不允许反斜杠转义任何字符
-s 从标准输入中读取密码而不在屏幕上显示输入的字符
-t 设置读取输入的超时时间,单位为秒
示例
# 1. 读取单个或多个变量
[root@server ~]# read a[root@server ~]# echo $a[root@server ~]# read a b c [root@server ~]# echo $a $b $c# 2. 将读取的数据存入数组中
[root@server ~]# read -a array[root@openEuler ~]# echo ${array[@]}[root@openEuler ~]# echo ${array[0]}[root@openEuler ~]# echo ${array[1]}# 3. 显示输入提示符
[root@server ~]# read -p "please input your name: " name
[root@server ~]# echo $name# 4. 显示输入提示符且设置读取超时
[root@server ~]# read -t 10 -p "please input your name:" name[root@server ~]# echo $name# 5. 读取N个字符
[root@server ~]# read -n 3 -p "please input content:" answer
[root@server ~]# echo $answer# 6. 用读取一个定长的验证码
[root@server ~]# read -k 6 -p "请输入6位验证码: " code
[root@server ~]# echo $code# 7. 提示用户输入年份,如果用户不输入则使用默认值
[root@server ~]# read -i 2025 -p "请输入当前所处的年份(默认为2025): " year
[root@server ~]# echo "当前年份是: $year"# 8. 提示用户输入密码
[root@server ~]# read -s -p "请输入您的密码: " password
[root@server ~]# echo $password
heheheheheheh# 9. 用定界符输入
[root@server ~]# read -d ":" haha
heheheheeheheheh:[root@server ~]#
[root@server ~]# echo $haha
heheheheeheheheh
1.6 lscpu
在Linux系统中,lscpu命令是用于显示和收集有关CPU(中央处理器)架构和相关信息的命令。它提供了关于CPU的详细信息,包括处理器类型、架构、核心数、线程数、缓存大小等。
[root@server ~]# lscpu
Architecture: x86_64CPU op-mode(s): 32-bit, 64-bitAddress sizes: 45 bits physical, 48 bits virtualByte Order: Little Endian
CPU(s): 4On-line CPU(s) list: 0-3
Vendor ID: AuthenticAMDBIOS Vendor ID: AuthenticAMDModel name: AMD Ryzen 7 5800H with Radeon GraphicsBIOS Model name: AMD Ryzen 7 5800H with Radeon Graphics CPU family: 25Model: 80Thread(s) per core: 1Core(s) per socket: 2Socket(s): 2Stepping: 0BogoMIPS: 6387.99
1.7 重定向
三个数据流概念
标准输入(standard input,简称stdin):默认情况下标准输入指从键盘获取的输入,用数字 0 表示
标准输出(standard output,简称stdout):默认情况下将命令执行所回传的正确信息输出到屏幕上,用数字 1 表示
标准错误输出(standard error output,简称stderr):默认情况下是将命令执行失败后所回传的错误信息输出到屏幕上,用数字 2 表示
符号
输出重定向操作符:
>
、>>
输入重定向操作符:
<
、<<
、<<<
输出重定向
输出重定向是将命令执行后的信息输出到指定设备或文件中,如果文件不存在会自动创建。使用格式如:
# 1. 将命令执行后的标准输出信息输出到指定文件中
command > output_file
# 或者
command 1> output_file# 2. 将命令执行后的标准错误信息输出到指定文件中
command 2> output_file# 3. 将命令执行后的标准错误信息输出到空设备中(即将输出的错误信息丢弃掉)
command 2> /dev/null# 4. 将命令执行后的信息(包括正确和错误)输出到指定文件中
command &> 文件
# 或
command >&文件
输入重定向
输入重定向是使用指令从指定的文件和内容中读取数据作为该指令的输入数据。有以下三种输入重定向符:
-
<:能够将文件中的数据传递给某个命令,从而让命令以文件内容作为输入进行操作。格式:
command < input_file
- <<:引入了一种特殊的文本块,称为Here Document。Here Document 允许在命令行中嵌入多行文本块作为命令的输入。格式:
command << delimiter
unquoted content here
$variable_expansion
$(command_substitution)
delimiter
输入重定向案例:
# 1. 从文件读取数据作为cat命令的输入
[root@server ~]# echo test > file
[root@server ~]# cat < file
test# 2. 统计文件内容的行数
[root@server ~]# wc -l file
1 test
[root@server ~]# wc -l < file
1# 3. 将指定内容写入到文件中
[root@server ~]# cat > file3 << end
> hello
> world
> end
# 利用<<右侧的控制字符,我们可以终止输入,不必输入ctrl+d来结束。[root@server ~]# cat file3
hello# 4. mysql表结构导入
[root@server ~]# mysql -uroot -p123 < bbs.sql# 5. 应用于at计划任务
[root@server ~]# vim at.txt
echo hello
[root@server ~]# at now +2 min < at.txt
job 2 at 2015-06-09 11:55# 6. 在一个字符串中查找特定的关键词
[root@server ~]# grep "keyword" <<< "This is an example text containing the keyword."
1.8 wget
作用
从指定的URL下载文件
wget命令非常稳定,一般即便网络波动也不会导致下载失败,而是不断尝试重连,直到整个文件下载完毕
wget命令支持如HTTP、HTTPS、FTP等常见协议,可以在命令行中直接下载网络文件
格式
wget [OPTION]... [URL]...
常用选项:
-V:查看wget的版本
-O,--output-document=FILE:将下载的内容写入到文件中
-c,--continue:支持断点续传
-b:后台下载
--limit-rate=RATE:限制下载速度
-q:静默下载,即无信息输出
-T,--timeout=SECONDS:下载的超时时间
-t,--tries=NUMBER:用于设置重试次数(0 代表无限制)
--spider:不下载任何文件
示例
# 安装wget
[root@server ~]# dnf install -y wget# 1. 查看版本
[root@server ~]# wget -V# 2. 下载文件
[root@server ~]# wget https://n.sinaimg.cn/sinakd2020723s/213/w2048h1365/20200723/3918-iwtqvyk4060964.jpg# 3. 下载文件,使用 -O 参数来指定保存文件名
[root@server ~]# wget -O ./hzha.jpg https://n.sinaimg.cn/sinakd2020723s/213/w2048h1365/20200723/3918-iwtqvyk4060964.jpg# 4. 限制下载速度,使用 --limit-rate 参数
[root@server ~]# wget --limit-rate=1k -O ./hzha2.jpg https://n.sinaimg.cn/sinakd2020723s/213/w2048h1365/20200723/3918-iwtqvyk4060964.jpg# 5. 支持断点续传的形式,使用 -c 参数
[root@server ~]# wget -c --limit-rate=2k -O ./hzha2.jpg https://n.sinaimg.cn/sinakd2020723s/213/w2048h1365/20200723/3918-iwtqvyk4060964.jpg
# 然后按 ctrl+c 终断,然后再执行这个命令,可以看到断点续传# 6. 后台下载,使用 -b 参数
[root@server ~]# wget -b --limit-rate=2k -O ./hzha3.jpg https://n.sinaimg.cn/sinakd2020723s/213/w2048h1365/20200723/3918-iwtqvyk4060964.jpg# 可看下载日志
[root@server ~]# tail -f wget-log# 7. 通过 --user-agent 参数设置客户端身份。
[root@server ~]# wget -O /tmp/xxx.index http://www.baidu.com # 默认为PC端
[root@server ~]# wget --user-agent="" -O /tmp/xxx.index http://www.baidu.com
# user-agent 的值可以从 f12 的 Request Headers 部分中找到# 8. 下载整个网站,使用 -r 参数
[root@server ~]# wget -O /tmp/ -r http://www.baidu.com# 9. 利用wget可检测网站是否存活,可以使用 -q 参数(表示安静模式,即无信息输出),-T或--timeout 参数用于将所以超时设置为指定的秒,-t或--tries 参数用于设置重试次数(0 代表无限制),--spider 参数表示不下载任何文件
[root@server ~]# wget -q -T 3 -t 2 --spider http://www.baidu.com[root@server ~]# echo $?
1.9 watch
作用
watch命令是周期性的用来执行某命令,并把某命令执行结果输出到屏幕上
使用watch命令,可以周期性的监测并输出某命令的执行结果到屏幕上,省得手动一遍一遍运行某命令,提高工作效率。
常用参数
参数 | 说明 |
---|---|
-h | watch帮助文档 |
-n | 设置watch时间间隔,默认为2s |
-d | 高亮显示变化的区域 |
-t | 不显示顶部的时间间隔信息 |
示例
1.10 xargs
作用
xargs 命令作用是将标准输入数据转换成命令行参数,能够处理管道或者标准输入并将其转换成特定命令的命令参数
格式
xargs [选项] [命令]
常用选项:
-I:用于指定替换字符串,将输入数据中的特定字符串替换为命令行参数。
-n:用于指定每次执行命令的参数个数。
-t:用于打印执行的命令。
-p:用于提示用户确认是否执行命令。
-r:当标准输入为空时,不执行命令。
示例
# 准备数据
[root@server ~]# cat > test.txt << EOF
>
> a b c d e f g
> h i j k l m n
> o p q
> r s t
> u v w x y z
>
> EOF# 多行输入单行输出:
[root@server ~]# cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z# 使用 -n 参数指定一次输出的参数个数
[root@server ~]# cat test.txt | xargs -n3a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z# 使用 -d 参数指定分割输入定界符
[root@server ~]# echo "nameXnameXnameXname" | xargs -dX
name name name name# 结合 -n 选项使用:
[root@server ~]# echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name# 结合 -I 选项指定一个替换字符串{},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次。
#如:复制所有txt文件到 /d1 目录下:
[root@server ~]# mkdir d1
[root@server ~]# ls *.txt | xargs -n1 -I {} cp {} d1/
2. shell概述
2.1 基本构成
第1行的 “#!/bin/bash”
注释:说明某些代码的功能
可执行语句:实现程序的功能
2.2 注释及风格
作用:通过在代码中增加注释可以提高程序的可读性
传统的Shell只支持单行注释,其表示方法是一个井号“#”,从该符号开始一直到行尾都属于注释的内容
多行注释:使用冒号“:”配合here document,语法如下:
:<<'xxxx' comment1 comment2 comment3 …… xxxx
xxxx 可以是字符或数字,单引号可以不加,但以防出现莫名其妙的意外发生,比如发生字符扩展,命令替换
2.3 编写规范
脚本开头
开头指定脚本解释器:#!/bin/sh 或 #!/bin/bash
其他行#表示注释
程序段开头需要加版本版权等信息,如:
# Date:创建日期
# Author:作者
# Mail:联系方式
# Function:功能
# Version:版本
脚本自动增加注释版权信息
[root@server ~]# vim ~/.vimrc # 新建配置文件
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()if expand("%:e") == 'sh'call setline(1,"#!/bin/bash")call setline(2,"##############################################################")call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: Andy_Sun")call setline(6, "# Email: Andy_Sun@163.com")call setline(7, "# Organization: http://www.cnblogs.com/Andy_Sun/")call setline(8, "# Created Time : ".strftime("%F %T"))call setline(9, "# Description:")call setline(10,"##############################################################")call setline(11, "")endif
endfunc
脚本中尽量不用中文注释
别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
单行注释,可以放在代码行的尾部或代码行的上部
多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分 代码修改时,对修改的内容
多使用内部命令
无论碰到哪种情况,请尽量考虑使用内部命令而不是外部命令
内部命令执行的效率高,性能好
没有必要使用cat命令
这是我们经常在论坛里讨论的话题之一。没有必要使用cat命令指的是在有些时候,我们会发现根本没有必要使用cat命令。使用了多余的cat命令会让你的代码看起来很丑陋,而且还会带来性能上的问题
例如:以下两条命令的结果一样
[root@server ~]# cat /etc/passwd | grep root[root@server ~]# grep root /etc/passwd
仔细阅读出错信息
我们常犯的一个错误是:当我们敲入的命令报错后,我们中的大多数人只是对错误信息一瞥而过,而不会去认真的读一读,很多时候,错误信息里就包含了解决办法
有时候我们修改了某个错误并再次运行后,系统依旧会报错。然后我们再次修改,但系统再次报错。这可能会持续很长时间。但实际上,旧的错误可能已经被纠正,只是由于出现了其它一些新错误才导致系统再次报错。而我们依旧在怀疑为什么修改好的代码依然不能正常运行。
因此,请你养成仔细阅读错误信息的习惯。
文件名以sh结尾
shell脚本文件名应见名知义 ,扩展名位sh,如:backup_mysql.sh
代码缩进
shell没有强制要求,但建议缩进,这样可以提高阅读性,程序更有层次感,
例:编写99乘法表
#!/bin/bashfor((i=1; i<10; i++))
doecho -ne "$i\t"
doneecho for((i=1;i<70;i++))
doecho -n "="
doneechofor((i=1; i<10; i++))
dofor((j=1;j<=i;j++))doecho -en "$i*$j=$[i*j]\t"doneecho
done [root@server ~]# bash 99.sh # 运行
# 结果:
1 2 3 4 5 6 7 8 9
=====================================================================
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
2.4 脚本执行
方法1
使用sh或bash命令执行脚本,不需要执行权限(建议使用),脚本中可以不指定解释器
[root@server ~]# vim test.sh
#!/bin/bash
echo "china"[root@server ~]# bash test.sh
china
[root@server ~]# sh test.sh
china
- 可以使用bash -n 脚本名 ,进行语法检测,且不执行脚本
- 可以使用bash -x 脚本名 ,进行脚本执行跟踪,逐条语句的跟踪执行
方法2
切换到脚本所在目录使用./执行脚本,需要执行权限
[root@server ~]# ./test.sh
-bash: ./test.sh: 权限不够
[root@server ~]# chmod +x test.sh
[root@server ~]# ./test.sh
方法3
绝对路径执行脚本,需要执行权限
[root@server ~]# vim /t1.sh
#!/bin/bash
echo "china"[root@server ~]# /t1.sh
-bash: /t1.sh: 权限不够[root@server ~]# chmod +x /t1.sh
[root@server ~]# /t1.sh
china
方法4
使用点(.)或者source 执行脚本,不需要执行权限
[root@server ~]# source /t1.sh
china
[root@server ~]# . test.sh
china
注意
法1、2、3都是启动一个子shell,在子shell中执行此脚本,脚本中设置的变量在脚本执行完毕后不会保存
法4 都是在当前shell进程中执行此脚本,而不是重新启动一个shell 在子shell进程中执行此脚本,并且脚本中设置的变量在脚本执行完毕后会保存下来。
[root@server ~]# vim temp.sh
#!/bin/bash
cd /etc[root@server ~]# chmod +x temp.sh
[root@server ~]# bash temp.sh # 目录不变
[root@server ~]# ./temp.sh # 目录不变
[root@server ~]# /root/temp.sh # 目录不变[root@server ~]# source temp.sh
[root@server etc]# cd ~
[root@server ~]# . temp.sh
[root@server etc]# cd ~
[root@server ~]#
2.5 bash shell基本功能
echo打印命令
格式
echo -参数 内容
参数
-n :取消输出后行末的换行符号
-e :启用转义字符
可以输出带颜色的字体
格式:echo -e "\e[字体控制;字体颜色或背景色 字符串内容 \e[0m"
\e[表示控制开始,\e[0m表示控制结束
字体控制选项:1表示高亮,4表示下划线,5颜色闪烁
颜色如下:字颜色:30-37 , 背景色:40-47
[root@server ~]# vim color.sh
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 color.sh
printf 命令
作用
printf 命令模仿 C 程序库(library)里的 printf() 程序, 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好,printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n
格式
printf 格式控制字符串 参数列表
例:
[root@server ~]# echo "Hello, Shell"
[root@server ~]# printf "Hello, Shell\n"
[root@server ~]# printf "%d %s\n" 1 "abc"
[root@server ~]# printf '%d %s\n' 1 "abc" # 单引号双引号效果一样
[root@server ~]# printf %s abcdef # 没有双引号也可输出,没有\n会续连下一个提示符
[root@server ~]# printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg# %s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
# %-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。[root@server ~]# printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
# %-4.2f 指格式化为小数,其中 .2 指保留2位小数
history 历史命令
命令别名
格式
alias 别名=原命令
例:
[root@server ~]# alias hi=history
[root@server ~]# hi
注意
别名的优先级比命令高,命令执行时的顺序如下:
第一顺位:执行用绝对路径或相对路径执行的命令。
第二顺位:执行别名。
第三顺位:执行 Bash 的内部命令。
第四顺位:执行按照 $PATH 环境变量定义的目录查找顺序找到的第一个命令。
-
为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/.bashrc”
命令与文件名补全:tab
命令执行顺序
-
顺序执行:
[root@server ~]# date ; ls -l /etc/passwd
-
前面命令执行不成功,后面的命令不执行: &&
[root@server ~]# mkdir /mnt/iso && mount /dev/sr0 /mnt/iso
-
前面命令成功,后面就不执行,如果前面不成功后面就执行: ||
[root@server ~]# mkdir tt || ls /
[root@server ~]# mkdir tt || ls / # 可以再次执行
管道符(含面试题)
符号:| ,当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道
面试题1:提取系统网卡的IP地址信息
[root@server ~]# ip a | grep ens32 | grep inet | cut -d / -f1 | tr -s " " | cut -d " " -f3
# 显示ip信息 | 过滤包含ens32行 | 过滤包含inet行 | 以/作为分隔符取出第1部分 | 将多个空格压缩为1个空格 | 以空格为分隔符取出第3部分
面试题2:显示内存的剩余数量
[root@server ~]# free -h | grep Mem | tr -s " " | cut -d " " -f4
106Mi
[root@server ~]# free -h | grep Mem | awk '{print $4}' # 使用awk截取第4列
106Mi
exit退出程序
作用:终止Shell程序的执行
格式:exit 状态码
状态码:该参数是一个整数值,其取值范围为0~255
注意:Shell程序的退出状态码储存在系统变量$?中,因此,用户可以通过该变量取得Shell程序返回给父进程的退出状态码
常见状态码
0----------------命令运行成功1----------------通知未知错误2----------------误用shell命令126--------------命令不可执行127--------------没有找到命令128--------------无效退出参数128+x------------linux信号x的严重错误130--------------命令通过Ctrl+C终止255--------------退出状态码越界
演示在不同的情况下,程序返回不同的状态码
[root@server ~]# echo "china"
china
[root@server ~]# echo $?
0
[root@server ~]# ehco "china"
bash: ehco: command not found...
Similar command is: 'echo'
[root@server ~]# echo $?
127