shell脚本

  • shell脚本已关闭评论
  • 189 次浏览
  • A+
所属分类:linux技术
摘要

当我们执行一个shell脚本时希望获取命令行参数信息时,可以用到位置参数变量
如:./123.sh 111 222,这就是一个执行shell的命令,123.sh就可以使用位置参数变量获取到参数信息


一、shell脚本基本介绍

格式要求

  1. 脚本要以 #!/bin/bash 开头,debain需要改成#!/bin/dash
  2. 脚本需要有可执行权限

shell常用执行方式

  • 输入脚本的绝对路径或相对路径(该方式首先要赋予脚本执行权限)
  • sh+脚本 不用执行赋予脚本执行权限也可以执行
  • #!/bin/bash 开头的需要 bash+脚本

二、shell的变量

变量介绍

  1. Linux Shell中变量分为:系统变量和用户自定义变量
  2. 系统变量:shell脚本
  3. 显示当前shell中所有变量:set

变量定义

  1. 定义变量:变量名=值
  2. 撤销变量:unset 变量
  3. 声明静态变量:readonly 变量 ,静态变量不能unset
  4. 变量命名规则:
    • 变量可以由字母、数字和下划线组成,但不能以数字开头
    • 等号两侧不能有空格
    • 变量名称一般习惯为大写(shell编写的一个规范)
  5. shell注释规则
单行注释 # 内容 多行注释 :<<! 内容     ! 

设置环境变量

  1. export 变量名=变量值 将shell变量输出为环境变量/全局变量
  2. source 配置文件 将修改后的配置信息立即生效

位置参数变量

介绍

当我们执行一个shell脚本时希望获取命令行参数信息时,可以用到位置参数变量
如:./123.sh 111 222,这就是一个执行shell的命令,123.sh就可以使用位置参数变量获取到参数信息

基本语法

  • $n (功能描述:n为数字,$0代表命令本身,$1-(9代表第1-9个参数,10以后的参数需要用大括号包裹起来例如:){100})
  • $* (功能描述:该变量代表命令行中所有参数)
  • $@ (功能描述:该变量也代表命令行所有参数,(@与)*不同的是前者吧每个参数区别对待,后者是看成一个整体)
  • $# (功能描述:变量代表命令行中所有参数的个数)

预定义变量

介绍:shell设计之初就已经定义好的变量,可以直接使用
基本语法

  • $$当前进程的进程号
  • $!后台运行的最后一个进程的进程号
  • $?最后一次执行的命令的返回状态,如果为零者上一个命令正确执行,非零则上一次命令执行不正确

shell要在后台方式运行一个脚本:脚本名称 &

#!/bin/bash #以后台方式运行123.sh /home/kali/123.sh & 

三、运算符

  1. (((运算式))或)[运算式]或者expr m + n
  2. expr运算符之间要有空格,如果希望将expr的结果赋给某个变量需要使用 ``
  3. expr 的乘,除,取余:* /%
#!/bin/bash #案例1:计算(2+3)*4 #第一种 R1=$(((2+3)*4)) #第二种 R2=$[(2+3)*4] #第三种 T=`expr 2 + 3` R3=`expr $T * 4` 

四、条件判断

基本语法:

[ condition ]
注:条件前后需要有空格
非空返回ture

判断语句

  1. = 字符串比较
  2. 两个整数的比较
    • -lt 小于
    • -le 小于等于
    • -eq 等于
    • -gt 大于
    • -ge 大于等于
    • -ne 不等于
  3. 按照文件权限进行判断
    • -r 有读的权限
    • -w 有写的权限
    • -x 有执行的权限
  4. 按照文件类型进行判断
    • -f 文件存在并且是一个常规文件
    • -e 文件存在
    • -d 文件存在并是一个目录

五、流程判断

1.if判断

基本语法

#!/bin/dash if[ 条件判断式 ] then 代码 elif[ 条件判断式 ] then 代码 fi 

注意事项:[ 条件判断 ] 中括号和条件判断式之间必须有括号
应用案例

#!/bin/dash if [ $1 -ge 60 ] then     echo "及格了" elif [ $1 -lt 60 ] then     echo "不及格" fi # 执行命令 bash xxx.sh 

2.case语句

基本语法

case $变量 in "值1") 程序1            #如果变量的值等于值1,则执行程序1 ;; "值2") 程序2            #如果变量的值等于值2,则执行程序2 ;; #省略其他分支 *) 如果变量的值都不是以上的值,则执行此程序 ;; esac 

案例:

#!/bin/dash case $1 in "1") echo "周一" ;; "2") echo "周二" ;; "3") echo "周三" ;; "4") echo "周四" ;; "5") echo "周五" ;; *) echo "该放假了" ;; esac 

3.for循环

基本语法

#!/bin/dash、 for (( 初始值; 循环控制条件; 变量变化)) do  程序 done 

案例:遍历数组

#!/bin/dash a=(10 20 30 40) for (( i=0; i<4; i++)) do echo ${a[i]} done 

shell中数组用括号包围,数和数之间用空格间隔

4.while循环

基本语法

#!/bin/dash while [ 条件判断式 ] do  程序 done #注:while与[]符号之间需要有空格分割 

案例:从命令行输入一个num,计算从1加到num是多少

#!/bin/dash SUN=0 i=0 while [ $i -le $1 ] do SUM=$[$SUM+$i] i=$[$i+1] done echo $SUM 

六、read读取控制台输入

基本语法:read 【选项】 【参数】
选项:

  • -p指定读取值时的提示符
  • -t指定读取值时等待的时间(秒)

参数:指定读取值的变量名
案例:读取控制台输入值并输出输入值的平方

#!/bin/dash read -p "请输入一个数num=" NUM NUM1=$[$NUM*$NUM] echo "num的平方=$NUM1" 

七、函数

1.系统函数

basename 函数

语法:basename 【文件路径】 【后缀】
功能:返回完整路径最后/的部分,常用于获取文件名字
后缀:若后缀被指定,将会去除相应后缀
案例:
shell脚本

dirname函数

语法:dirname 【文件绝对路径】
功能:返回完整路径最后/的前面的部分,常用于返回路径部分
案例:
shell脚本

2.自定义函数

基本语法

function 函数名 (){     程序代码 } 

调用时直接写函数名称
案例:计算输入的两个参数的和

#!/bin/dash function getSum(){ SUM=$[$n1+$n2] echo "和是=$SUM" } read -p "n1=" n1 read -p "n2=" n2 getSum $n1 $n2