1.shell 脚本
1.1 格式
#!/bin/bash #指定执行器
#author:大王
#funDesc:脚本功能说明
#version:版本
#contact:联系方式
#history:历史记录
#环境变量的声明(与Java中的导包类似)
source /etc/profile
source ~/.bashrc
1.2 调用方式
source 脚本名称
1.将脚本作为source命令的参数
2.在当前线程下运行($$-pid不变)
3.脚本可以没有执行权限
[root@gaocun user]# source demo.sh
demo.sh 执行了
当前进程id:17583
[root@gaocun user]# echo $$
17583
/bin/bash 脚本名称
sh 脚本名称
1.将脚本作为sh命令的参数
2.在当前线程的子线程运行($$-pid改变)
3.脚本可以没有执行权限
[root@gaocun user]# sh demo.sh
demo.sh 执行了
当前进程id:25696
[root@gaocun user]# echo $$
17583
./脚本名称
1.必须授予脚本执行权限(x)
2.在当前线程的子线程运行($$-pid改变)
[root@gaocun user]# ./demo.sh
-bash: ./demo.sh: 权限不够
[root@gaocun user]# ll demo.sh
---------- 1 root root 65 5月 8 17:57 demo.sh
脚本名称
1.必须授予脚本执行权限(x)
2.在当前线程的子线程运行($$-pid改变)
3.脚本必须在 环境PATH路径内
[root@gaocun user]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/software/jdk1.8/bin:/home/software/hadoop-3.1.3/bin:/home/software/hadoop-3.1.3/sbin:/home/software/hive/bin:/home/software/scala-2.13.6/bin:/home/software/spark-3.2.1-local/bin:/root/bin
[root@gaocun user]# demo.sh
demo.sh 执行了
当前进程id:6097
1.3 执行顺序
1.相对路径、绝对路径
2.别名 alias
3.环境变量 $PATH 按顺序扫目录
1.4 脚本的参数
格式: sh arg1 arg2 arg3 脚本
参数调用:
echo "当前进程id:$$"
echo "当前脚本参数个数:$#"
echo "当前脚本数组:$@"
echo "当前脚本字符串:$*"
echo "当前脚本的名称:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
1.5 脚本的返回值
2. 数值运算
2.1 整数运算
方式1: var=$((运算内容))
[root@gaocun bin]# var=$((1+1))
[root@gaocun bin]# echo $var
2
[root@gaocun bin]# echo $((var++))
2
[root@gaocun bin]# echo $((++var))
4
方式2: 格式 var=$[运算内容]
[root@gaocun bin]# var=$[1+1]
[root@gaocun bin]# echo $var
2
[root@gaocun bin]# echo $[var++]
2
[root@gaocun bin]# echo $[var++]
3
方式3: 格式 let var=运算表达式
[root@gaocun bin]# let var=1+1
[root@gaocun bin]# echo $var
2
[root@gaocun bin]# let var++
[root@gaocun bin]# echo $var
3
[root@gaocun bin]# let ++var
[root@gaocun bin]# echo $var
4
方式4: 格式 expr 运算表达式
[root@gaocun bin]# var=`expr 1 + 1`
[root@gaocun bin]# echo $var
2
2.2 浮点数运算
格式:
bc -参数 -文件
echo 运算内容 | bc -参数
运算符号:
+ - * / ^ %
参数:
scale=x 保留x位小数
ibase=y;var 输入数据进制(后)
obase=x;var 输出数据进制(前)
-l 使用标准数学库(使用特殊函数时需要指定)
例子 打印π
示例:
设置小数精度
echo "scale=2;3/8" | bc
进制转化
2to10: echo "obase=10;ibase=2;1100100" | bc
10to2: echo "obase=2;ibase=10;100" | bc
计算平方
echo "10^10" | bc
计算平方根
echo "sqrt(100)" | bc
计算π值
echo "scale=100;4*a(1)" |bc -l
3. if判断语句
3.1 基本语法
格式1:
if 逻辑表达式 ;then
command ;
fi
格式2:
if 逻辑表达式 ;then
command ;
else
command ;
fi
格式3:
if 逻辑表达式 ;then
command ;
elif 逻辑表达式 ;then
command ;
else
command ;
fi
格式4:(适用于终端命令提示符)
if 逻辑表达式; then command; else command;fi
3.2 逻辑表达式
格式: test 或 []
注意:
[] 内的每个元件都要用空格分开
[] 内的变量、常量最好用“var” 编码空格导致语法歧义
3.3 判断档案 test -参数 file | [ -参数 file ]
#判断档案 test -参数 file | [ -参数 file ]
参数:
-e 是否存在
-f 是否存在且为文件
-d 是否存在且为目录
-L 是否存在且为连接档
-r 是否存在且有读权限
-w 是否存在且有写权限
-x 是否存在且有执行权限
-s 是否存在且为非空档案
示例:
#判断文件是否存
if test -e bash.sh; then
echo 文件存在
fi
#是否存在且为文件
if [ -f bash.sh ]; then
echo 存在且为文件
fi
# -d 是否存在且为目录
if [ -d ../bash ]; then
echo 存在且是目录
fi
3.4 判断整数 test int1 -参数 int2 | [ int1 -参数 int2 ]
#判断整数 test int1 -参数 int2 | [ int1 -参数 int2 ]
参数:
-eq 整数是否相等 ==
-ne 整数是否不等 !=
-gt 大于 >
-lt 小于 <
-ge 大于等于 >=
-le 小于等于 <=
示例:
if [ 10 -eq 10 ];then
echo "10 = 10"
fi
if [ 11 -gt 10 ];then
echo "11 >= 10"
fi
3.5 判断字符串 test -参数 字符串 | [ -参数 字符串 ]
#判断字符串 test -参数 字符串 | [ -参数 字符串 ]
参数:
-z 是否为空
-n 是否非空
str1 == str2 是否相等
str1 != str2 是否不等
#示例
var=""
var1="大王"
if [ -z $var ];then
echo 字符串为空
fi
if [ -n $var1 ];then
echo 字符串不为空
fi
3.6 逻辑运算
#逻辑运算
参数:
-a and
-o or
!非
|| 或 假|| 执行
&& 与 真&&执行
注意:
-a -o 和 || &&的区别
-a -o 在 [ true -a false ] 内使用
|| && 在 [ true ] || [ false ] 内使用
示例:
var=""
var1="大王"
# || && 使用
if [ -z $var ] && [ -n $var1 ] ;then
echo "字符串1为空 且 字符串2不为空"
fi
# -a -o ! 的使用
if [ 1 == 1 -a "1" == "2" ];then
echo "字符串1为空 且 字符串2不为空"
else
echo "hahaha"
fi
3.7 if语句的返回结果
#if语句的返回结果
$? 0-true 1-false
示例:
if [ 1 == 2 ];then
echo true
else
echo false
fi
#查看if执行结果
echo $?
4. case选择语句
4.1 格式
#格式
case 变量 in
变量内容1)
command1
command2
command3
;;
变量内容2)
command1
command2
command3
;;
*) #默认值
command1
esac
#注意事项
匹配到相等内容后会自动停止
4.2 示例
echo "root@gaocun's password:"
read -p "root@gaocun's password:" var
echo $var
case $var in
123)
echo 执行命令1
echo 执行命令2
echo 执行命令3
;;
345)
echo 执行命令4
echo 执行命令5
echo 执行命令6
;;
*)
echo 执行了defalt
esac
5. 循环语句
5.1 while 为true时进入循环体
格式:
while 逻辑表达式
do
command;
done
示例:
var=10
while [ $var -gt 0 ]
do
echo $var
var=$((var-1))
done
#对话脚本
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的历史人物: '
while read FILM
do
echo "是的!$FILM 是一个好人"
done
#无限循环(监控脚本)
while :
do
echo "判断逻辑"
sleep 1 #沉睡1秒
done
5.2 for.in 遍历数组
格式1:
for var in item1 item2 item3(按空格\n\t切分为数组)
do
command1
command2
command3
done
格式2:
for var in hadoop01 hadoop02 hadoop03;do command1;command2;command3 done;
示例:
for var in hadoop01 hadoop02 hadoop03
do
echo $var
done
for var in hadoop01 hadoop02 hadoop03;do echo $var; done
5.3 普通for循环
格式:
for ((i=10;i>=0;i--))
do
command;
done
示例:
for ((i=10;i>=0;i--))
do
echo $i
done
5.4 遍历数组
#定义数组
arr=('飞龙' '飞虎' '飞豹' '飞彪')
#数组的使用
#根据索引获取单个元素
echo ${arr[1]}
#获取指定数组的length
echo ${#arr[*]} 或 ${#arr[@]}
#获取整个数组元素,用空白符分割 类似scala中的 arr.mkstring(" ")
echo ${arr[*]} 或 ${arr[@]}
#获取整个数组的索引
echo ${!arr[*]} 或 echo ${!arr[@]}
#获取字符串的字符个数
name="123asd"
echo ${#name}
#遍历方式1
for e in ${arr[*]}
do
echo ${e}
done
#遍历方式2
for (( VAR = 0; VAR < ${#arr[*]}; ++VAR ));
do
echo $VAR:${arr[$VAR]}
done
6. Bash中的函数
6.1 函数定义
格式:
[function] 方法名 [()] {
command;
}
note: 不能定义形参,即(var) ❌
6.2 函数调用之实参传递
6.3 函数体内可以使用的变量(形参)
第x参数: $1 $2 $3
参数个数: $?
参数数组的字符串: $* | $@
运行当前脚本的进程id: $$
上一条命令的执行状态: $? 0-true 1-false
6.4 函数的返回值
格式: return [0-255] => $?
限制: 只能是 0-255 的整数
6.5 函数体内怎样获取shell脚本的参数
6.7 示例
#定义一个方法
function oneFun {
#获取参数
echo firstFunction
echo 第一个参数:$1
echo 第二个参数:$2
echo 第三个参数:$3
echo 参数数组的字符串:$*
echo 参数的个数:$@
echo 当前脚本进程id:$$
echo 当前脚本进程id:$-
#定义返回值
return 255
}
# 调用方法(传递参数)
# 如果方法体内想使用脚本的参数,调用时需指定
oneFun $*
echo $?
7. Bash 的debug
格式:
/bin/bash -参数 xx.sh
参数:
-n(只检查不执行) 只检查语法,语法有问题会报错,语法没问题不输出信息
-x(打印-检查-执行) 检查语法,有问题报错,没问题会打印脚本的执行过程
-v(检查-执行