0.1Shell应用举例
比如,我要查看我的docker镜像的情况和docker容器的情况
说明:使用docker必须先安装docker,并且后面的shell总结与docker无关
查看docker镜像
[root@hadoop100 shelldemo]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c324703d35a nginx:1.10 "nginx -g 'daemon of…" 6 months ago Up 6 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp nginx
b4b9ba3fd00f kibana:7.6.2 "/usr/local/bin/dumb…" 7 months ago Up 6 hours 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp kibana
78964ce16473 elasticsearch:7.6.2 "/usr/local/bin/dock…" 7 months ago Up 6 hours 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearch
707fca681ada mysql:5.7 "docker-entrypoint.s…" 11 months ago Up 6 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
03aefa8dc8f4 redis "docker-entrypoint.s…" 11 months ago Up 6 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
查看docker容器
[root@hadoop100 shelldemo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq management 813865544c51 5 months ago 253MB
redis latest bc8d70f9ef6c 11 months ago 105MB
mysql 5.7 2c9028880e58 11 months ago 447MB
kibana 7.6.2 f70986bc5191 2 years ago 1.01GB
elasticsearch 7.6.2 f29a1ee41030 2 years ago 791MB
nginx 1.10 0346349a1a64 5 years ago 182MB
代码举例
创建文件demo.sh(vim demo.sh),写入以下内容
#!/bin/bash
echo "===================我的docker镜像======================="
docker ps
echo "===================我的docker容器======================="
docker images
赋予脚本执行权限
chmod +x demo.sh
执行脚本,执行结果:
[root@hadoop100 shelldemo]# ./demo.sh
===================我的docker镜像=======================
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c324703d35a nginx:1.10 "nginx -g 'daemon of…" 6 months ago Up 5 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp nginx
b4b9ba3fd00f kibana:7.6.2 "/usr/local/bin/dumb…" 7 months ago Up 5 hours 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp kibana
78964ce16473 elasticsearch:7.6.2 "/usr/local/bin/dock…" 7 months ago Up 5 hours 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearch
707fca681ada mysql:5.7 "docker-entrypoint.s…" 11 months ago Up 5 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
03aefa8dc8f4 redis "docker-entrypoint.s…" 11 months ago Up 5 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
===================我的docker容器=======================
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq management 813865544c51 5 months ago 253MB
redis latest bc8d70f9ef6c 11 months ago 105MB
mysql 5.7 2c9028880e58 11 months ago 447MB
kibana 7.6.2 f70986bc5191 2 years ago 1.01GB
elasticsearch 7.6.2 f29a1ee41030 2 years ago 791MB
nginx 1.10 0346349a1a64 5 years ago 182MB
通过这个例子,我们可以通过shell将一些复杂的命令封装成一个简单的命令
0.2Shell入门
创建shell脚本hello.sh(vim hello.sh)输入:
#!/bin/bash
echo "hello world"
执行脚本:
-
采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)
[root@hadoop100 shelldemo]# bash ./hello.sh hello world
-
添加权限执行
[root@hadoop100 shelldemo]# chmod +x hello.sh [root@hadoop100 shelldemo]# ./hello.sh hello world
0.3Shell基础
3.1注释
单行注释
# 注释内容
多行注释
:<<!
注释内容
!
3.2输入输出
输出
echo [Options] [String]
Options:
- -n 不换行输出
- -e 启用反斜线转义解释
- -E 禁用反斜线转义解释(默认)
输入
read (选项) (参数)
选项:
- -p:读取指定输入值时的提示内容;
- -t:读取指定读取值时等待的时间(秒)如果-t 不加表示一直等待
参数
- 变量:指定读取值的变量名
具体案例
#!/bin/bash
# 10s内输入数据并且输出
read -p "输入案例,10s内输入" -t 10 inputVar
echo "输入数据为:$inputVar"
执行结果
[root@hadoop100 shelldemo]# ./inputdemo.sh
输入案例,10s内输入10086
输入数据为:10086
3.3变量
系统预定义变量
H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER 等
[root@hadoop100 shelldemo]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
查看系统自带的全局变量
env
env | less #或
自定义变量
- 定义变量:变量名=变量值,注意,=号前后不能有空格
- 撤销变量:unset 变量名
[root@hadoop100 shelldemo]# echo $a
[root@hadoop100 shelldemo]# a=2
[root@hadoop100 shelldemo]# echo $a
2
[root@hadoop100 shelldemo]# unset a
[root@hadoop100 shelldemo]# echo $a
[root@hadoop100 shelldemo]#
环境变量
临时环境变量:使用export命令行声明即可,变量在Shell脚本进程结束后仍然有效,但在关闭当前Shell会话后失效。
[root@hadoop100 shelldemo]# a=22 #定义一个全局变量
[root@hadoop100 shelldemo]# echo $a #在当前Shell中输出a,成功
22
[root@hadoop100 shelldemo]# bash #进入Shell子进程
[root@hadoop100 shelldemo]# echo $a #在子进程中输出a,失败
[root@hadoop100 shelldemo]# exit #退出Shell子进程,返回上一级Shell
exit
[root@hadoop100 shelldemo]# export a #将a导出为环境变量
[root@hadoop100 shelldemo]# bash #重新进入Shell子进程
[root@hadoop100 shelldemo]# echo $a #在子进程中再次输出a,成功
22
全局变量:在脚本中定义,仅在当前Shell脚本中有效,其他Shell脚本进程不能访问,其作用域从定义的位置开始,到脚本结束或被显示删除的地方为止。注意,全局变量既可以在Shell函数内定义,也可以在Shell函数外定义,因为Shell函数内定义的变量默认为global,且作用域从“函数被调用时执行变量定义的地方”开始,到脚本结束或被显示删除的地方为止。
具体案例:Java配置环境变量
vim /etc/profile
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
执行效果
[mhzzj@hadoop102 ~]$ echo $JAVA_HOME
/opt/module/jdk1.8.0_212
只读变量/常量
注意:只读变量不能unset
[root@hadoop100 shelldemo]# readonly x=5
[root@hadoop100 shelldemo]# x=10
-bash: x: 只读变量
[root@hadoop100 shelldemo]# unset x
-bash: unset: x: 无法反设定: 只读 variable
位置参数变量
- $n n 为数字,$0 代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10}
- ∗ 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , * 这个变量代表命令行中所有的参数, ∗这个变量代表命令行中所有的参数,*把所有的参数看成一个整体
- @ 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @ 这个变量也代表命令行中所有的参数,不过 @这个变量也代表命令行中所有的参数,不过@把每个参数区分对待
- $# 这个变量代表命令行中所有参数的个数
演示代码
#!/bin/bash
b=$1 #变量b=参数1
c=$2 #变量c=参数2
echo "$0 $b $c"
echo "$@"
echo "$*"
echo "参数个数=$#"
执行结果
[root@hadoop100 linuxstudy]# vim paramterdemo.sh
[root@hadoop100 linuxstudy]# chmod +x paramterdemo.sh
[root@hadoop100 linuxstudy]# ./paramterdemo.sh p1 p2
./paramterdemo.sh p1 p2
p1 p2
p1 p2
参数个数=2
预定义变量
-
$$ 当前进程的进程号(PID)
-
$! 后台运行的最后一个进程的进程号(PID)
-
$? 最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定), 则证明上一个命令执行不正确了。
演示代码
#1/bin/bash
echo "当前进程进程号 = $$"
echo "最后进程进程号 = $!"
echo "当前进程进程号 = $?"
执行结果
[root@hadoop100 shelldemo]# ./demo01.sh
当前进程进程号 = 24381
最后进程进程号 =
值 = 0
3.4运算符
语法格式 :“$((运算式))”
或 “$[运算式]”
[root@hadoop100 shelldemo]# echo $[(2+3)*5]
25
[root@hadoop100 shelldemo]# echo $(((2+3)*5))
25
3.5流程控制
if判断
条件表达式
语法格式:test condition
或 [ condition ]
符合条件则返回0,不符合条件则返回1
两个数字之间的比较
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
字符串测试
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
文件测试
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
if语句
单分支
if [ 条件判断式 ]
then
程序
fi
多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
案例
#!/bin/bash
param=$1
if [ $param -eq 10 ]
then
echo "param=$parm"
elif [ $param -lt 10 ]
echo "param < 10,param=$param "
else
echo "param > 10,param=$param "
fi
执行情况
[root@hadoop100 shelldemo]# ./ifdemo.sh 6
param < 10,param=6
case判断
语法格式
case $变量名 in
"值 1")
变量的值等于值 1,则执行程序 1
;;
"值 2")
变量的值等于值 2,则执行程序 2
;;
# TODO
*)
变量的值都不是以上的值,则执行此程序
;;
esac
具体案例
#!/bin/bash
case $1 in
"10")
echo "======输入值为10====="
;;
"100")
echo "******输入值为100****"
;;
*)
echo "-----以上值都不是----"
;;
esac
执行结果
[root@hadoop100 shelldemo]# ./casedemo.sh 99
-----以上值都不是----
[root@hadoop100 shelldemo]# ./casedemo.sh 100
******输入值为100****
while循环
while [ 条件判断式 ]
do
程序
done
具体案例(1+2+…+100)
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo "sum=$sum"
执行结果
[root@hadoop100 shelldemo]# ./whiledemo.sh
sum=5050
for循环
格式一
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
具体案例
#!/bin/bash
for ((x=0;x<5;x=$x+1))
do
for ((y=$x;y<5;y++))
do
echo -n "*"
done
echo ""
done
执行结果
[root@hadoop100 shelldemo]# ./fordemo01.sh
*****
****
***
**
*
格式二
for 变量 in 值 1 值 2 值 3…
do
程序
done
具体案例
#!/bin/bash
for i in x,y,x
do
echo "i的值为$i"
done
执行结果
[root@hadoop100 shelldemo]# ./fordemo.sh
i的值为x,y,x
0.4函数
4.1系统函数
basename
basename [string / pathname] [suffix] 功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename 为取路径里的文件名称
选项:suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
[root@hadoop100 shelldemo]# basename /opt/linuxstudy/shelldemo/hello.sh
hello.sh
[root@hadoop100 shelldemo]# basename /opt/linuxstudy/shelldemo/hello.sh .sh
hello
dirname
dirname 文件绝对路径 功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
dirname 为取文件路径的绝对路径名称
[root@hadoop100 shelldemo]# dirname /opt/linuxstudy/shelldemo/hello.sh
/opt/linuxstudy/shelldemo
4.2自定义函数
基本语法
[ function ] funname [()]
{
action;
[return int;]
}
具体案例
#!/bin/bash
function add(){
return $[$1+$2]
}
add $1 $2
echo "sum=$?"
执行结果:
[root@hadoop100 shelldemo]# ./functiondemo.sh 3 5
sum=8