文章目录
1. Shell 概述
- Shell 是一个命令行解释器,接收应用程序/用户命令,调用操作系统内核
- Shell 也是一种编程语言,易编写、易调试、灵活性强
2. Shell 脚本入门
-
脚本格式
脚本以
#!/bin/bash
开头(指定 Shell 的解析器) -
helloworld
需求:创建 Shell 脚本,输出 helloworld
-
编写脚本
root@iZwz9guplfkml2vvggil90Z:~# vi helloworld.sh #!/bin/bash echo "helloworld"
-
执行脚本
-
使用 bash 命令
root@iZwz9guplfkml2vvggil90Z:~# bash helloworld.sh helloworld
-
直接执行
# 赋予脚本可执行权限 root@iZwz9guplfkml2vvggil90Z:~# chmod 777 helloworld.sh # 执行脚本 root@iZwz9guplfkml2vvggil90Z:~# ./helloworld.sh helloworld
-
-
-
多命令处理
需求:在 /root 目录下创建 ddd 文件,在 ddd 文件中增加 “I’m ddd”
root@iZwz9guplfkml2vvggil90Z:~# vi ddd.sh #!/bin/bash cd /root touch ddd echo "I'm ddd" >> ddd
3. Shell 中的变量
1. 系统变量
# $HOME,输出家目录
root@iZwz9guplfkml2vvggil90Z:~# echo $HOME
/root
# $PWD,输出当前路径
root@iZwz9guplfkml2vvggil90Z:/opt# echo $PWD
/opt
# $SHELL,输出当前Shell解析器所在位置
root@iZwz9guplfkml2vvggil90Z:~# echo $SHELL
/bin/bash
# $USER,输出当前用户名
root@iZwz9guplfkml2vvggil90Z:~# echo $USER
root
2. 自定义变量
-
基本语法
#定义变量:变量=值 root@iZwz9guplfkml2vvggil90Z:~# c=2 #撤销变量:unset 变量 root@iZwz9guplfkml2vvggil90Z:~# unset c #声明静态变量:readonly 变量,注意静态变量不能被 unset root@iZwz9guplfkml2vvggil90Z:~# readonly w=2 #使用变量:$变量名字 root@iZwz9guplfkml2vvggil90Z:~# echo $w 2
-
变量定义规则
-
变量名可以由字母、数字和下划线组成,但是不能以数字开头,环境变量建议大写
-
等号两侧不能有空格
root@iZwz9guplfkml2vvggil90Z:~# c = 2 c: command not found root@iZwz9guplfkml2vvggil90Z:~# c= 2 2: command not found root@iZwz9guplfkml2vvggil90Z:~# c =2 c: command not found
-
变量默认为字符串类型,无法直接进行数值计算
root@iZwz9guplfkml2vvggil90Z:~# h=1+2 root@iZwz9guplfkml2vvggil90Z:~# echo $h 1+2
-
变量的值如果有空格,需要使用双引号或单引号括起来
root@iZwz9guplfkml2vvggil90Z:~# h=h h h h: command not found root@iZwz9guplfkml2vvggil90Z:~# h="h h h" root@iZwz9guplfkml2vvggil90Z:~# echo $h h h h
-
3. 特殊变量
1. $n
$n,n为数字,$0代表该脚本名称,$1~$9代表第一到第九个参数,十以上的参数需要大括号括起来,如${10}
root@iZwz9guplfkml2vvggil90Z:~# vi para.sh
#!/bin/bash
echo "$0 $1 $2"
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh p1 p2
para.sh p1 p2
2. $#
$#,获取所有输入参数个数
root@iZwz9guplfkml2vvggil90Z:~# vi para.sh
#!/bin/bash
echo $#
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1
1
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1 s2 s3
3
3. $*、$@
- $*:代表命令行中所有的参数,把所有参数看成一个整体
- $@:代表命令行中所有的参数,但是把每个参数区分看待
root@iZwz9guplfkml2vvggil90Z:~# vi para.sh
#!/bin/bash
echo $*
echo $@
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1 s2 s3
s1 s2 s3
s1 s2 s3
4. $?
$?,返回上一次执行的命令的返回状态,值为0,证明上一个命令执行正确,反之
root@iZwz9guplfkml2vvggil90Z:~# echo $w
2
# 上一个命令执行成功,返回 0
root@iZwz9guplfkml2vvggil90Z:~# echo $?
0
root@iZwz9guplfkml2vvggil90Z:~# h = 22
h: command not found
# 上一个命令执行失败,返回非 0
root@iZwz9guplfkml2vvggil90Z:~# echo $?
127
4. 运算符
- $((运算式)) 或 $[运算式]
- expr 表达式1 +,-,\*,/,% 表达式2
# 计算2+3
root@iZwz9guplfkml2vvggil90Z:~# echo $((2+3))
5
# 计算3-2
root@iZwz9guplfkml2vvggil90Z:~# echo $[3-2]
1
# 计算 2*3,注意空格
root@iZwz9guplfkml2vvggil90Z:~# expr 2 \* 3
6
# expr 计算 (2+3)*4
root@iZwz9guplfkml2vvggil90Z:~# expr `expr 2 + 3` \* 4
20
# $[] 计算 (2+3)*4
root@iZwz9guplfkml2vvggil90Z:~# echo $[(2+3)*4]
20
5. 条件判断
-
基本语法:
[ condition ],[] 返回 false
注意:condition 前后都有空格
-
常用判断条件
- 两个整数之间比较
- -lt 小于(less than)
- -le 小于等于(less equal)
- -eq 等于(equal)
- -gt 大于(greater than)
- -ge 大于等于(greater equal)
- -ne 不等于(Not equal)
- 按照文件权限进行判断
- -r 有读的权限(read)
- -w 有写的权限(write)
- -x 有执行的权限(execute)
- 按照文件类型进行判断
- -f 文件存在并且是一个常规的文件(file)
- -e 文件存在(existence)
- -d 文件存在并是一个目录(directory)
- 两个整数之间比较
-
案例实操
&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令
#23 是否大于等于 22 root@iZwz9guplfkml2vvggil90Z:~# [ 23 -ge 22 ] && echo "true" || echo "false" true #para.sh 是否具有写权限 root@iZwz9guplfkml2vvggil90Z:~# [ -w para.sh ] && echo "true" || echo "false" true #/root/shell/ccc.txt 文件是否存在 root@iZwz9guplfkml2vvggil90Z:~# [ -f /root/shell/ccc.txt ] && echo "true" || echo "false" false
6. 流程控制
1. if
基本语法:
if [ 条件判断式1 ]
then
#do something..
elif [ 条件判断式2 ]
then
#do something..
else
#do something..
fi
注意事项:
- if 后必须有空格
- [ 条件判断式 ],中括号和条件判断式之间必须有空格
- then 写 [ 条件判断式 ] 中间一定加 ;
# 输入一个数字,如果是1,输出"1";如果是2,输出"2",如果是其他,什么也不输出
root@iZwz9guplfkml2vvggil90Z:~# vi if
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "1"
elif [ $1 -eq 2 ]
then
echo "2"
fi
root@iZwz9guplfkml2vvggil90Z:~# bash if 2
2
root@iZwz9guplfkml2vvggil90Z:~# bash if 1
1
2. case
基本语法:
case $变量名 in
"值1")
#do something..
;;
"值2")
#do something..
;;
....
*)
#do something..
;;
esac
注意事项:
- case 行尾必须为 in
- 每一种模式匹配以 ) 结束
- ;; 相当于 Java 中的 break
- *) 表示默认模式,相当于 Java 中的 default
# 输入一个数字,如果是1,输出"1";如果是2,输出"2",如果是其他,输出"666"
root@iZwz9guplfkml2vvggil90Z:~# vi case
#!/bin/bash
case $1 in
1)
echo "1"
;;
2)
echo "2"
;;
*)
echo "666"
;;
esac
root@iZwz9guplfkml2vvggil90Z:~# bash case 1
1
root@iZwz9guplfkml2vvggil90Z:~# bash case 2
2
root@iZwz9guplfkml2vvggil90Z:~# bash case 3
666
3. for
基本语法1:
for((初始值;循环控制条件;变量变化))
do
#do something...
done
# 从1加到100
sdbserver1:~ # vi loop.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
sdbserver1:~ # bash loop.sh
5050
基本语法2:
for 变量 in 值1 值2...
do
#do something...
done
# 从1加到100
sdbserver1:~ # vi loop.sh
#!/bin/bash
s=0
for i in {1..100}
do
s=$[$s+$i]
done
echo $s
sdbserver1:~ # bash loop.sh
5050
4. while
基本语法:
while [ 条件判断式 ]
do
#do something...
done
# 从1加到100
sdbserver1:~ # vi while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$i+$s]
i=$[$i+1]
done
echo $s
sdbserver1:~ # bash while.sh
5050
参考资料: