一 基础
1、打印 echo
[root@docker2 test]# touch helloworld.sh
[root@docker2 test]# vim helloworld.sh
[root@docker2 test]# cat helloworld.sh
#!/bin/bash
echo Helloworld!!!!
[root@docker2 test]# sh helloworld.sh
Helloworld!!!!
2、系统变量
[root@docker2 test]# echo $HOME
/root
[root@docker2 test]# echo $USER
root
3、用户定义变量
例子定义一个A变量并赋值为1
[root@docker2 test]# A=1 # ”=“ 等号两边不能有空格
[root@docker2 test]# echo A
A
[root@docker2 test]# echo $A #需要带$
1
[root@docker3 pinpoint-docker]# unset A
[root@docker3 pinpoint-docker]# echo $A
4、多命令、变量引入
例子 定义一个变量D并赋值字符串”I love Shell“
[root@docker2 test]# D="I love Shell"
[root@docker2 test]# vim helloworld.sh
[root@docker2 test]# cat helloworld.sh
#!/bin/bash
echo Helloworld!!!!
echo $D
[root@docker2 test]# sh helloworld.sh
Helloworld!!!!
#没有显示D变量字符串内容
[root@docker2 test]# export D #需要设置变量D
[root@docker2 test]# sh helloworld.sh
Helloworld!!!!
I love Shell
[root@docker2 test]#
备注 系统当前变量
[root@docker2 test]# export -p
declare -x D="I love Shell"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="docker2.changhongit.com"
declare -x LANG="en_US.UTF-8"
declare -x LC_ALL="en_US.utf8"
declare -x LC_CTYPE="en_US.utf8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
5、特殊变量 $n
例子 代参数 执行命令 获取参数
(如hostname xxx.changhongit.com hostname为命令 xxx.changhongit.com为参数)
[root@docker3 pinpoint-docker]# touch par1.sh
[root@docker3 pinpoint-docker]# vim par1.sh
[root@docker3 pinpoint-docker]# cat par1.sh
#!/bin/bash
echo "$0 $1 $2 $3"
[root@docker3 pinpoint-docker]# sh par1.sh
par1.sh # 命令本身为$0
[root@docker3 pinpoint-docker]# sh par1.sh a
par1.sh a # 第一个参数为a
[root@docker3 pinpoint-docker]# sh par1.sh a b c
par1.sh a b c # 第一个参数为a,第二个参数为b,第三个参数为c,
6、特殊变量 $#
$# 查看输入了多少参数,常用于循环
[root@docker3 pinpoint-docker]# vim par1.sh
[root@docker3 pinpoint-docker]# cat par1.sh
#!/bin/bash
echo "$0 $1 $2 $3"
echo "total $#"
[root@docker3 pinpoint-docker]# sh par1.sh a b c
par1.sh a b c
total 3
6、特殊变量 $?
$? 上一条命令是否允许成功 0为成功
[root@docker3 pinpoint-docker]# tree
-bash: tree: command not found
[root@docker3 pinpoint-docker]# echo $?
127
[root@docker3 pinpoint-docker]# yum install tree
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* extras: mirrors.huaweicloud.com
* updates: mirrors.huaweicloud.com
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
Resolving Dependencies
--> Running transaction check
---> Package tree.x86_64 0:1.6.0-10.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================================
Package Arch Version Repository Size
==========================================================================================================================================
Installing:
tree x86_64 1.6.0-10.el7 base 46 k
Transaction Summary
==========================================================================================================================================
Install 1 Package
Total download size: 46 k
Installed size: 87 k
Is this ok [y/d/N]: y
Downloading packages:
tree-1.6.0-10.el7.x86_64.rpm | 46 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : tree-1.6.0-10.el7.x86_64 1/1
Verifying : tree-1.6.0-10.el7.x86_64 1/1
Installed:
tree.x86_64 0:1.6.0-10.el7
Complete!
[root@docker3 pinpoint-docker]# echo $?
0
参数 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。如"$* "用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数 |
$$ | 脚本运行的当前进程ID号 |
$@ | 与$* 相同,但是使用时加引号,并在引号中返回每个参数。 |
如"$@"用「"」括起来的情况、以"$1" "2"…"2"…"n" 的形式输出所有参数 | |
$- | 显示Shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
6、运算符
加减乘除、求余数
expr + - * / % 运算符两边需要空格
3+2=5
[root@docker3 pinpoint-docker]# expr 3 + 2
5
3-2=1
[root@docker3 pinpoint-docker]# expr 3 - 2
1
3*2=6
[root@docker3 pinpoint-docker]# expr 2 \* 3
6
9/3=3
[root@docker3 pinpoint-docker]# expr 9 / 3
3
10%3=1
[root@docker3 pinpoint-docker]# expr 10 % 3
1
混合运算
(3+2)*3=15
[root@docker3 pinpoint-docker]# expr `expr 3 + 2` \* 3
15
[root@docker3 pinpoint-docker]# s=$[(3+4)*5]
[root@docker3 pinpoint-docker]# echo $s
35
6.1 Shell (( )) 的用法
双小括号 (( )) 的语法格式为:
((表达式))
[root@jump shelldemo]# echo $((3+5))
8
7、条件判断
基本语法
[ condition ] (注意condition两边有空格)
条件非空即真, 返回 true或false
常用条件
两个整数之间比较
符合 | 解释 |
---|---|
= | 字符串比较 |
-lt | 小于(less than) |
-le | 小于等于(less equal) |
-eq | 等于(equal) |
-gt | 大于(greater than) |
-ge | 大于等于(greater equal) |
-ne | 不等于(Not equal) |
例子:判断5是否小于6,判断7是否小于6
[root@ngnix01 ~]# [ 5 -lt 6 ]
[root@ngnix01 ~]# echo $?
0
[root@ngnix01 ~]# [ 7 -lt 6 ]
[root@ngnix01 ~]# echo $?
1
按照文件权限判断
符合 | 解释 |
---|---|
-r | 有读的权限(read) |
-w | 有写的权限(write) |
-x | 有执行权限(execute |
[root@ngnix01 ~]# ll
total 22832
-rw-------. 1 root root 1630 Oct 18 10:26 anaconda-ks.cfg
-rw-r--r-- 1 root root 974241 Nov 23 00:28 atlassian-agent.jar
-rw-r--r-- 1 root root 328 Nov 23 00:28 Dockerfile
-rw-r--r-- 1 root root 22381786 Nov 23 14:21 fileshare.war
-rw-r--r-- 1 root root 452 Nov 23 11:40 jira_proxy.conf
-rw-r--r-- 1 root root 1366 Nov 23 14:34 nginx.conf
-rw-r--r-- 1 root root 1130 Nov 23 08:09 nginx.conf.bak
[root@ngnix01 ~]# [ -w nginx.conf ]
[root@ngnix01 ~]# echo $?
0
按照文件类型判断
符合 | 解释 |
---|---|
-f | 文件存在并且是一个常规文件(file) |
-e | 文件存在(existence) |
-d | 文件存在并且是一个目录(directory) |
[root@ngnix01 ~]# [ -f nginx.conf ]
[root@ngnix01 ~]# echo $?
0
多条件
[root@ngnix01 ~]# [ 9 -lt 8 ] && echo true || echo false
false
[root@ngnix01 ~]# [ 7 -lt 8 ] && echo true || echo false
true
8、流程控制
if 语句语法格式
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
例子
[root@ngnix01 ~]# cat ifDemo.sh
#!/bin/bash
var1=$1
echo $var1
if [ $var1 -eq 1 ]
then
echo "1"
elif [ $var1 -eq 2 ]
then
echo "2"
else
echo "other"
fi
[root@ngnix01 ~]# sh ifDemo.sh 1
1
1
[root@ngnix01 ~]# sh ifDemo.sh 2
2
2
[root@ngnix01 ~]# sh ifDemo.sh 3
3
other
for 循环
与其他编程语言类似,Shell支持for循环。
for循环一般格式为:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
例子
[root@ngnix01 ~]# cat forDemo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
[root@ngnix01 ~]# sh forDemo.sh
1
2
3
4
5
for ((初始化条件;循环控制条件;变量变化))
do
程序
done
for 例子2
[root@jump shelldemo]# sh fordemo1.sh
5050
[root@jump shelldemo]# cat fordemo1.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
case
case 语句和 if...elif...else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系
case 语句的语法如下:
case $变量名 in
"值 1")
;;
如果变量的值等于值1,则执行程序1,
值2")
如果变量的值等于值2,则执行程序2
…省略其他分支…
- )
如果变量的值都不是以上的值,则执行此程序
;;
esac
例子:
[root@jump shelldemo]# cat menu.sh
#!/bin/bash
#create by guoke
#function print menu
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
RES='\E[0m'
echo ' #使用echo打印菜单
#############################
1.banana
2.apple
3.pear
4.cherry
#############################
'
read -p "please select a num:" num
case "$num" in
1)
echo -e "${YELLOW_COLOR} banana ${RES}"
;;
2)
echo -e "${RED_COLOR} apple ${RES}"
;;
3)
echo -e "${GREEN_COLOR} pear ${RES}"
;;
4)
echo -e "${BLUE_COLOR} cherry ${RES}"
;;
*)
echo "please input {1|2|3|4}"
sh menu.sh
esac
Shell while循环详解
while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。
Shell while 循环的用法如下:
while condition
do
statements
done
例子
[root@jump shelldemo]# sh whiledemo1.sh
5050
[root@jump shelldemo]# cat whiledemo1.sh
#!/bin/bash
i=1
sum=0
while ((i <= 100))
do
((sum+=i))
((i++))
done
echo $sum
9.Shell read命令:读取从键盘输入的数据
read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。
read 命令的用法为:
read [-options] [variables]
options表示选项,如下表所示;variables表示用来存储数据的变量,可以有一个,也可以有多个。
options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。
[root@jump shelldemo]# sh readdemo1.sh
Enter password in 20 seconds(once) >
Enter password in 20 seconds(again)>
Valid password
[root@jump shelldemo]# sh readdemo1.sh
Enter password in 20 seconds(once) >
Enter password in 20 seconds(again)>
Invalid password
[root@jump shelldemo]# cat readdemo1.sh
#!/bin/bash
if
read -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" && #第一次输入密码
read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" && #第二次输入密码
[ $pass1 == $pass2 ] #判断两次输入的密码是否相等
then
echo "Valid password"
else
echo "Invalid password"
fi
[root@jump shelldemo]#
10、Shell let命令:对整数进行数学运算
let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算,读者已经学习了《Shell (())》,再学习 let 命令就相当简单了。
注意:和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。
Shell let 命令的语法格式为:
let 表达式
或者
let "表达式"
或者
let '表达式'
它们都等价于((表达式))。
[root@jump shelldemo]# a=10 b=20
You have new mail in /var/spool/mail/root
[root@jump shelldemo]# echo $((a+b))
30
[root@jump shelldemo]# echo let a+b
let a+b
[root@jump shelldemo]# let a+=6
[root@jump shelldemo]# echo $a
16
[root@jump shelldemo]# let c=a+b
[root@jump shelldemo]# echo c
c
[root@jump shelldemo]# echo $c
36
11、Shell函数详解(函数定义、函数调用)
Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。
Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。
Shell 函数定义的语法格式如下:
function name() {
statements
[return value]
}
[root@jump shelldemo]# cat functiondemo1.sh
#!/bin/bash
#函数定义
function url(){
echo "cpaas.changhongit.com"
}
#函数调用
url
[root@jump shelldemo]# sh functiondemo1.sh
cpaas.changhongit.com
例子2
[root@jump shelldemo]# cat functiondemo2.sh
#!/bin/bash
function getsum(){
local sum=0
for n in $@
do
((sum+=n))
done
return $sum
}
getsum 10 20 55 15 #调用函数并传递参数
echo $?
[root@jump shelldemo]# sh functiondemo2.sh
100
例子3
[root@jump shelldemo]# sh functiondemo2.sh 3 4 5
12
12
[root@jump shelldemo]# cat functiondemo2.sh
#!/bin/bash
function getsum(){
local sum=0
for n in $@
do
((sum+=n))
done
echo $sum
return $sum
}
getsum $@
let a=$?
echo $a
12 debug模式
sh -x xxx.sh
set 方式设置开始debug和结束