一. Shell参数传递
* 以单个字符串形式显示所有传入的参数
@ 与 @ 与@与*的意思一样的,输出所有传入的参数,只不过? 获取最后退出的值,如果有return 则返回return的值,如果没有return 返回0 或 1(异常)
二.算术运算符
加法 + expr b
减法 - expr b
乘法 * expr b
除法 / expr b
求余 % expr b
赋值 = a=$b
相等== a = = a==a==b 返回 true 或false
不相等 != a ! = a!=a!=b 返回true 或false
三.数字关系运算符
关系运算符只支持数字,不支持字符串,除非字符串是数字。一般用于判断,返回true或false(比较的时候字符串和运算符之间有一个空格)
-eq 等于 [ b ]
-ne 不等于 [ b ]
-gt 大于 [ b ]
-lt 小于 [ b ]
-ge 大于等于 [ b ]
-le 小于等于 [ b ]
四.字符串关系运算符
a=str1 b=str2 (比较的时候字符串和运算符之间有一个空格)
= 等于,检测字符串是否相等 [ str2 ]
!= 不等于 检验字符串不等 [ str2 ]
-z 校验字符串长度是否为0,为0返回true, [ -z str1 ]
str1 ]
五.布尔运算符
!非运算,表达式为false,返回true [ ! true ]
-o 或运算,有一个表达式为true,返回true
-a 与运算,两个表达式都为true才返回false
六.逻辑运算符
&& [ b -lt 50 ] 返回true 或false
|| [ b -lt 10 ] 返回true或false
七.文件测试运算符
校验文件是否为指定类型,返回true或false
-b file 校验文件是否为块文件 [ -b file ]
-c file 校验文件是否为设备文件 [ -f file ]
-g file 校验文件是否设置了SGID(Set Group ID)位, [ -g file ]
-k file 校验文件是否粘着位 [ -k file ]
-s file 校验文件是否为空 [ -s file ]
-r file 校验文件是否有读权限 [ -r file ]
-x file 校验文件是否有执行权限 [ -x file ]
-S fiel校验文件是否socket
八. 流程控制
- if else 结构
# if elif else fi结构
if [ $1 -gt $2 ]; then
echo "变量1[$1]大于变量2[$2]"
elif [ $1 -eq $2 ]; then
echo "变量1[$1]等于变量2[$2]"
else
echo "变量1[$1]小于变量2[$2]"
fi
2)for循环结构
写法一:
for itm in $(ls $usrPath) ; do
if [ -s $itm ]; then
echo "file name is $itm"
else
echo "file not exits"
fi
done
写法二:
for (( i = 0; i < 3; i++ )); do
#$RANDOM 随意获取一个随机数
echo $RANDOM
done
- case 语句
# 每个选项必须以;;结尾,*)相当于default
case $1 in
1)
echo "输入的值[$1]=1"
;;
2)
echo "输入的值[$1]=2"
;;
3)
echo "输入的值[$1]=3"
;;
*)
echo "default输入的值为[$1]"
esac
4)while循环
number=$1
while [ $number -gt 5 ]; do
if [ $number -eq 6 ]; then
echo "number=6 continue"
((number--))
continue
fi
echo "$number 大于5 "
let number-=1
done
九.函数
函数的定义
function wileFunction() {
local number=$1
while [ $number -gt 4 ]; do
if [ $number -eq 6 ]; then
echo "number=6 continue"
((number--))
continue
fi
echo "$number 大于4 "
# let number-=1
# ((number--))
let number--
done
}
函数的调用: 函数调用直接调用函数名即可
#因为wileFunction函数需要传递一个参数$1 ,所以在调用的时候传入参数 7
wileFunction 7
十. 变量的作用域
Shell脚本变量的作用域有三种: Global (全局变量),local (局部变量) ,export (环境变量)
Global (全局变量)
Shell脚本中默认定义的变量为全局变量Global,从变量定义的位置开始,直到脚本执行完毕
local 局部变量,多用于函数内部
function wileFunction() {
local number=$1
while [ $number -gt 4 ]; do
if [ $number -eq 6 ]; then
echo "number=6 continue"
((number--))
continue
fi
echo "$number 大于4 "
# let number-=1
# ((number--))
let number--
done
}
export环境变量 (将自定义变量设置为环境变量),当前Shell中有效
定义形式:
export JAVA_HOME=/usr/local/java
十一. (倒引号)``与$()的区别
1.相同点:
Shell脚本中 ``和$()都可以完成内部命令的执行,如:
dateStr1=`date +"%Y-%m-%d %H:%M:%S"`
dateStr2=$(date +"%Y-%m-%d %H:%M:%S")
echo $dateStr1
echo $dateStr2
#输出结果:
2020-09-28 11:53:26
2020-09-28 11:53:26
2.不同点
$()并不是在每一种Shell中都可以执行,在bash版本肯定可以执行。但是``在所有的版本中都可以执行
$() 可以正常的执行\转移字符,转移后为一个\,``必须使用成对使用,才会起到转移的作用
十二.数组
Shell脚本中数组只支持一维数组,不支持多维数组。数组初始化的时候不需要定义数组的大小,数组元素的
下标由0开始,数组用()来表示,数组的元素之间用空格分隔。
数组的定义:
array=(tom jack lucene dock)
数组元素的获取
#1.获取指定下标的元素
echo ${array[1]}
#输出: jack
#2.获取数组中所有的元素
echo ${array[*]}
echo ${array[@]}
#3.获取数组元素的个数
echo ${#array[*]}
#4.获取数组中元素的长度 ,tom 的len =3
echo ${#array[0]}
数组的遍历
function arrayFunction() {
local array=(tom tick jack link)
# shellcheck disable=SC2068
echo ${array[@]}
for item in ${array[*]} ; do
echo "数组元素="${item}
done
for (( i = 0; i < ${#array[@]}; i++ )); do
echo "第二种输出方式="${array[i]}
done
}
数组元素的删除 通过unset删除
function arrayFunction() {
local array=(tom tick jack link)
# shellcheck disable=SC2068
echo ${array[@]}
for item in ${array[*]} ; do
echo "数组元素="${item}
done
for (( i = 0; i < ${#array[@]}; i++ )); do
if [ $i -eq 2 ]; then
unset array[$i]
fi
echo "第二种输出方式="${array[i]}
done
echo "删除后数组的元素="${array[*]}
}
字符串分割 数组
#只是一种方式,还有其他的分割方式
function splitStr() {
local str="test,dateStr2,strFunction,dateStr2"
#最后一个/后边有一个空格
local strArray=(${str//,/ })
echo ${strArray[*]}
for i in ${strArray[*]} ; do
echo $i
done
}
十三. ( ( ) ) 和 (()) 和(())和[]
( ( ) ) 和 (())和(())和[]是一样的都是进行算数运输的。支持 + - * / %(加、减、乘、除、求余)。需要注意的是:bash脚本只能做整数运算,不能做浮点数的运算,对于浮点数当作字符串处理
function expr() {
local var1=15
local var2=20
echo $((15+22))
echo $((var1+var2))
local sum=$((10+22))
echo "输出的结果="$sum
echo $[var1-var2]
echo "减法结果="$[15-5]
}
#输出的结果为
37
35
输出的结果=32
-5
减法结果=10
十四. [[]] 和(())
(()) 是针对[] 数学表达式运算的加强版, (())不需要将表达式里面的大小写进行转义,(())除了支持标准的+ - * / %之外,还支持一下操作:
image.png[[]] 是针对[] 对字符串表达式判断额加强版
十五.Shell脚本中调用另外一个Shell脚本
Shell脚本中调用另外一个脚本的方式有三种,分别是: fork ,exec , source三种方式。
Fork方式
Fork方式是最普通的调用方式,就是在脚本里直接调用 ,如果脚本有执行权限的话,/path/to/foo.sh 。如果没有执行权限,sh /path/to/foo.sh。
Fork方式是新开启一个子Shell,子Shell在执行的时候父Shell还在,子Shell执行完毕后返回父Shell,子Shell从父Shell中继承环境变量,但是子Shell不会将环境变量带会父Shell。
exec方式
exec 与fork不同,exec不需要开启一个子Shell来执行调用的脚本,被调用的Shell和父脚本在同一个Shell里。但是使用exec 调用一个脚本之后,父脚本中exec之后的内容就不会再执行了,这是exec和source的一个区别。
exec调用方式: exec /path/to/foo.sh
source方式
source与fork的区别不是新开一个Shell来执行调用的脚本,而是在同一个Shell中执行,所以被调用的脚本中声明的变量和环境变量,都可以在主脚本中获取和使用
source 的调用方式: . /path/to/foo.sh ,如果在当前目录: . ./foo.sh
示例:
定义一个 1.sh脚本
#!/bin/bash
tmp_var1="我是测试值1"
tmp_var2=15
echo "PID=$$" ${tmp_var1} ${tmp_var2}
定义一个test.sh脚本,并调用1.sh脚本
#!/bin/bash
function otherShell() {
local type=$1
case $type in
fork)
echo "fork 调用"
./1.sh
;;
source)
echo "source 调用"
. ./1.sh
;;
exec)
echo "exec 调用"
exec ./1.sh
;;
*)
echo "请输入调用的方式"
esac
echo "PID=$$" ${tmp_var1} ${tmp_var2}
}
otherShell fork
网友评论