文章目录
- 1. 前置说明
- 1.1 创建shell脚本
- 1.2 执行shell脚本
- 1.3 调试shell脚本
- 1.4 字符冲突
- 2. 变量
- 2.1 创建&使用变量
- 2.2 位置变量
- 2.3 引号规则
- 2.4 数值变量运算
- 3. 数组
- 3.1 创建数组
- 3.2 使用数组
- 4. 运算符
- 4.1 比较运算符
- 4.1.1 数字比较
- 4.1.2 字符串比较
- 4.2 逻辑运算符
- 4.3 文件运算符
- 5. 控制语句
- 5.1 分支语句
- 5.1.1 if分支
- 5.1.2 模式匹配
- 5.2 循环语句
- 5.2.1 for循环
- 5.2.2 while循环
- 6. 函数定义
- 6.1 没有返回值的函数
- 6. 有返回值的函数
1. 前置说明
shell脚本是linux系统中的一个可执行文件,它可以用来批量执行linux命令,比手动输入大量命令要高。
1.1 创建shell脚本
创建shell脚本有几个必须点:
-
文件必须以
.sh
结尾 -
文件的开头必须加上
#! /biin/bash
,指明脚本解释器cd ~ vim myshell.sh
1.2 执行shell脚本
shell脚本的执行:
-
方式一:使用
sh
命令sh myshell.sh
-
方式二:授予文件可执行权限,这样可以直接输入文件名运行文件
# chmod a+x myshell.sh chmod +x myshell.sh # 为当前用户增加对该文件权限 myshell.sh
1.3 调试shell脚本
在执行脚本前面加上-x
:
sh -x myshell.sh
(未授权)-x myshell.sh
(已授权)
1.4 字符冲突
通过下面可以知道$
字符可以用来获取变量值,但是当我们要打印$
符号怎么办?
使用\
转义。其他字符冲突也是这样处理。
#! /bin/bash
money=100
echo "我有\$${money}元" # 输出:我有$100元
2. 变量
2.1 创建&使用变量
-
创建变量:和Java一样,
=
左边是变量名,右边是变量值。注意事项:
- 变量名首字符必须为字母,名字只能用字母、数字、下滑线,不要用bash关键字。非法的名字:8var、var-8
- 变量名=值,等号两边不能有空格。
- 值只有字符串类型,值可以用单引号、可以用双引号,也可以都不用。但是值中有空格或特殊字符必须需要用双引号或单引号引起来。
#! /bin/bash name="zhansgan" age=18 echo $name # 输出:zhangsan echo "${name}目前${age}岁!" # 输出:zhangsan目前18岁!
-
使用变量:
$变量名
或${变量名}
形式获取变量值。一般首先使用$变量名
,当存在歧义没有达到理想效果时使用${变量名}
方式,获取数组值必须用后者。
2.2 位置变量
如果要想向shell脚本里传入参数,可以在运行shell脚本时携带参数。在shell脚本内可以通过一些符号获取传递的值:
-
$0
:脚本的名称 -
$1
:脚本的第一个参数,$2
是第二个参数,以此类推 -
$#
:传入脚本的参数个数 -
$*
:传入的所有参数拼接为一个字符串后返回#! /bin/bash # 判断当前目录下的所有文件,哪些是文件,哪些不是文件 arr=(`ls ./`) for file in ${arr[*]} do if [ -f file ];then echo "$file is a file" else echo "$file is not a file" if dome
-
$@
:传入的每个参数是一个字符串 -
$?
:上一条命令的执行结果,0表示执行成功,非0表示执行失败 -
$$
:当前进程的id
比如:有 a.sh 脚本,内容如下
#! /bin/bash
echo $0
echo $1
echo $2
echo $#
echo $*
echo $@
echo $?
2.3 引号规则
- 单引号:里面的所有字符都是普通字符,不能够获取变量值。
- 双引号:会保留变量特性。可以使用
$变量名
获取变量值。#! /bin/bash name="zhansan" echo '$name' # 输出:$name echo "$name" # 输出:zhangsan
- 倒引号:引起来的命令将会被执行,执行后的结果作为这个表达式的值
2.4 数值变量运算
- 语法:
((数值运算))
,加上$
可取运算后的值$((数值运算))
。支持的运算有加减乘除
、取模
、自加
、相等不等
、<
、<=
运算
#! /bin/bash
a=10
b=20
echo "$((a+b))" # 输出:30
echo "$((a%2))" # 删除:0
echo "$((a++))" # 输出:10,此时a=11
echo "$((++a))" # 输出:11,此时a=11
echo "$((a!=2))" # 输出:11,此时a=11
echo "$((a==2))" # 输出:11,此时a=11
echo "$((a<=2))" # 输出:11,此时a=11
echo "$((a<2))" # 输出:11,此时a=11
3. 数组
3.1 创建数组
- 方式一:直接定义并初始化。
#! /bin/bash arr=("aaa" "bbb" "ccc")
注意:元素间使用空格,而不是逗号分隔;并且后续可以继续添加元素,并不是静态的。
- 方式二:使用
declare -a
#! /bin/bash # 1. 定义并初始化 declare -a arr=("aaa" "bbb" "ccc") # 2. 先定义,再赋值 declare -a arr arr[0]="aaa" arr[1]="bbb" arr[2]="ccc"
3.2 使用数组
-
获取数组长度:
${#数组名[@|*]}
eg:${#arr[*]}
-
读取数组元素
- 读取一个元素:
${数组名[下标]}
- 一次读取所有元素:
${数组名[*]}
- 读取一个元素:
-
给数组元素赋值:
数组名[下标]=值
-
删除数组元素:
unset 数组名[下标]
[root@localhost shell]# arr1=("a1" "b1" "c1") [root@localhost shell]# echo ${arr1[*]} a1 b1 c1 [root@localhost shell]# declare -a arr2=("a2" "b2" "c2") [root@localhost shell]# echo ${arr2[*]} a2 b2 c2 [root@localhost shell]# declare -a arr3 [root@localhost shell]# arr3[0]="a3" [root@localhost shell]# arr3[1]="b3" [root@localhost shell]# arr3[2]="c3" [root@localhost shell]# echo ${arr3[*]} a3 b3 c3 [root@localhost shell]# # 查看数组长度 [root@localhost shell]# echo ${#arr3[*]} 3 # 获取数组第一个元素 [root@localhost shell]# echo ${arr3[0]} a3 # 删除数组第一个元素,数组长度-1 [root@localhost shell]# unset arr3[0] [root@localhost shell]# echo ${#arr3[*]} 2 [root@localhost shell]# echo ${arr3[*]} b3 c3
4. 运算符
4.1 比较运算符
4.1.1 数字比较
语法:[ 数字 运算符 数字 ]
注意:整体前后空格,运算符前后空格
注意:前后都要有空格
[root@localhost shell]# [ 1 -eq 1 ] && echo 'ok'
ok
[root@localhost shell]# [ 1 -lt 0 ] && echo 'ok'
[root@localhost shell]# [ 1 -lt 2 ] && echo 'ok'
ok
# 没有空格隔开,报错
[root@localhost shell]# [ 1 -lt 2] && echo 'ok'
-bash: [: 缺少 ]
# 变量替换也可以
[root@localhost shell]# a=1
[root@localhost shell]# [ $a -lt 2 ] && echo 'ok'
ok
[root@localhost shell]#
4.1.2 字符串比较
语法:[ 字符串 运算符 字符串 ]
注意:整体前后空格,运算符前后空格
[root@localhost shell]# [ "aaa" == "aaa" ] && echo 'ok'
ok
[root@localhost shell]#
[root@localhost shell]# [ "aaa" != "bbb" ] && echo 'ok'
ok
# 字符串判空
[root@localhost shell]# s=aaa
# 字符串非空
[root@localhost shell]# [ "${s}x" == "x" ] && echo 'ok'
[root@localhost shell]#
# 字符串为空
[root@localhost shell]# s=""
[root@localhost shell]# [ "${s}x" == "x" ] && echo 'ok'
ok
4.2 逻辑运算符
语法:[ 表达式 运算符 表达式 ]
注意:整体前后空格,运算符前后空格
[root@localhost shell]# [ ! 2 -lt 1 ] && echo 'ok'
ok
[root@localhost shell]# [ 1 -eq 1 -o 1 -eq 2 ] && echo 'ok'
ok
[root@localhost shell]# [ 1 -eq 1 -a 2 -eq 2 ] && echo 'ok'
ok
[root@localhost shell]# [ 1 -eq 1 -a 2 -ne 2 ] && echo 'ok'
[root@localhost shell]# [ 1 -ne 1 ] || echo 'ok'
ok
细节:
&&
有一个非常有用的作用—将多行命令变成一行,这对于平台化的shell脚本执行非常有帮助。通过平台执行shell脚本时,往往限制只能执行一行命令。比如:cd bin && sh run.sh $@
4.3 文件运算符
语法:[ 运算符 文件相对路径|绝对路径 ]
注意:整体前后空格,运算符前后空格
[root@localhost shell]# [ -e hello.sh ] && echo 'ok'
ok
[root@localhost shell]# [ -f hello.sh ] && echo 'ok'
ok
[root@localhost shell]# [ -d hello.sh ] && echo 'ok'
[root@localhost shell]#
5. 控制语句
5.1 分支语句
5.1.1 if分支
# 方式一:表达式后面写分号,再写then
if 条件表达式一 ; then
表达式一true时执行这里
elif 条件判断式二 ; then
表达式二true时执行这里
elif 条件判断式三 ; then
表达式三true时执行这里
else
都不成立时,执行这里
fi
# 方式二:表达式后面写不写分号,则必须换行后写thenthen
if 条件表达式一
then 表达式一true时执行这里
elif 条件判断式二
then 表达式二true时执行这里
elif 条件判断式三
then 表达式三true时执行这里
else
都不成立时,执行这里
fi
注意 :最后要以
if
反过来的fi
结尾
例子:
[root@localhost shell]# vim test.sh
#! /bin/bash
cmd=$1
if [ $cmd == "start" ]
then echo "start"
elif [ $cmd == "stop" ]
then echo "stop"
elif [ $cmd == "restart" ]
then echo "restart"
else
echo "other"
fi
[root@localhost shell]# sh test.sh 123 # 输出:other
5.1.2 模式匹配
case $var in
模式1)
代码块1
;;
模式2)
代码块2
;;
模式3)
代码块3
;;
*)
代码块4
;;
esac
注意 :最后要以
case
反过来的esac
结尾
例子:
[root@localhost shell]# vim s6.sh
#! /bin/bash
cmd=$1
case $cmd in
"start") echo "start operation"
;;
"stop") echo "stop operation"
;;
"restart") echo "restart operation"
;;
*) echo "other operation"
;;
esac
5.2 循环语句
5.2.1 for循环
-
语法:
# 方式一:和python一样 for 循环变量 in 数据列表 do 循环体代码段 done # 方式二:和jaava一样 for((控制变量的初始化;循环的条件;循环控制变量的更新)) do 循环体代码段 done
- 数据列表
{1..100}
:表示1到100#! /bin/bash for i in {1..10} do echo $i done # 打印1到10
- 结尾必须写上
done
- 数据列表
-
例子:
#! /bin/bash # 判断当前目录下哪些文件是普通文件 arr=(`ls ./`) # 遍历数组的每个元素(文档) for f in ${arr[*]} do # 判断是否是文件 if [ -f $f ]; then echo "$f is file" fi done
-
例子3
#! /bin/bash # 计算1-10内的偶数之和 sum=0 for((i=1;i<=10;i++)) do if [ $((i%2)) -eq 0 ];then sum=$((sum+i)) fi done echo "sum=${sum}"
5.2.2 while循环
-
语法:
while((循环的条件)) do 循环体代码段 done
-
例子
#! /bin/bash i=1 while((i<10)) do ((i++)) done echo "i=$i" # 输出:i=10
6. 函数定义
6.1 没有返回值的函数
#!/bin/bash
fun(){
echo "hello student!"
}
fun # 输入方法名时,调用函数
6. 有返回值的函数
#!/bin/bash
num1=$1
num2=$2
funandReturn(){
return $(($num1+$num2))
}
funandReturn # 输入函数名,会调用函数
echo "输入的两个数字之和为 $? !" # 通过 $? 获取函数返回值