第十二章 Shell_脚本
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 脚本的返回值
$? : 0执行成功 1执行失败
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 函数调用之实参传递
方法名称 arg1 arg2 arg3
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(检查-执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
2020-05-08 06_数组
2020-05-08 05_IDEA
2020-05-08 04_流程控制语句
2020-05-08 03_方法