比如,我要查看我的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镜像=======================" docko 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
单行注释
# 注释内容
多行注释
:< 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 输入数据为:100863.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 最后进程进程号 = 值 = 03.4运算符
语法格式 :“$((运算式))” 或 “$[运算式]”
[root@hadoop100 shelldemo]# echo $[(2+3)*5] 25 [root@hadoop100 shelldemo]# echo $(((2+3)*5)) 253.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 [ 条件判断式 ] 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=6case判断
语法格式
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=5050for循环 格式一
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,x0.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 hellodirname
dirname 文件绝对路径 功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
dirname 为取文件路径的绝对路径名称
[root@hadoop100 shelldemo]# dirname /opt/linuxstudy/shelldemo/hello.sh /opt/linuxstudy/shelldemo4.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



