shell练习

一、流程

  1. 新建shell 脚本 :touch test.sh
  2. 编辑脚本: vim test.sh
  3. 赋予权限: chmod 777 test.sh
  4. 运行脚本 : ./test.sh

二、变量

  1. 变量赋值 :a="菜鸡滴滴"
  2. 打印变量: echo $a
  3. 只读变量
    使用 readonly 命令将变量定义为只读
a=”菜鸡滴滴“
readonly a
  1. 删除变量 : unset a

三、shell字符串

  1. 单双引号:字符串可以使用单引号或者双引号,也可以不用引号
  2. 字符串拼接
a="菜鸡滴滴"
b=123
c="$a$b"
#或者 c=$a$b
echo $c
  1. 获取字符串长度:${#string}
a="菜鸡滴滴"
b=123
c=$a$b
# readonly a
echo $c
d=${#c}
echo $d
#或者直接输出 echo ${#c}
  1. 字符串提取
    1. 从指定位置开始提取
      • 从字符串左边开始计数:${string:start:length} ,其中start从0开始,length省略表示到字符串结尾
      • 从右边开始计数:${string:0-start:length},与左边开始相比,仅仅多了-0,这是固定格式。从右边开始时计数从1开始
      • 不管哪种方式,截取方向都是从左到右
a="菜鸡滴滴"
b=123
c=$a$b
# readonly a
echo $c
d=${#c}
e=${c:0-2:2}
echo $e
# 输出:23
  1. 从指定字符串(子字符串)开始截取: 这种截取方式无法指定字符串长度,只能从子字符串截取到字符串末尾。(

四、shell 数组

  1. 定义:array_name=(ele1 ele2 ele3 ele4 … elen) (注意赋值号=两边不能有空格)。
  2. Shell 为弱类型,不要求所有数组元素的类型相同
  3. 获取数组元素的值:${array_name[index]}
  4. 使用@或者* 可以获取数组中所有的元素:${nums[*]}或者${nums[@]}
arr=(1 2 3 "菜鸡滴滴")
arr[10]=9
echo ${arr[@]}
  1. 获取数组元素个数:${#array[@]} 或者${#array[*]}
arr=(1 2 3 "菜鸡滴滴")
arr[10]=9
echo ${arr[@]}
echo ${#arr[@]}
#结果:
#1 2 3 菜鸡滴滴 9
#5
  1. 数组拼接:arr_new=(${arr1[@]} ${arr2[@]})

  2. 删除数组元素:unset关键字

    • 删除单个元素:unset arr[index]
    • 删除整个数组:unset arr

    五、Shell 内置命令

    bash 自身提供的命令,而不是文件系统中某个执行文件

    1. type来确定一个命令是否为内置命令
      在这里插入图片描述
    2. alias: 给命令创建别名
      • 直接使用 alias 则列出当前Shell进程中使用的别名
        在这里插入图片描述
    • 自定义别名: alias new_name='command',这样定义的只能在当前shell 进程中使用
    • 配置自己的alias :
      1. 修改 ~/.bashrc 文件: vi ~/.bashrc
      2. 在文件中添加自己的alias语句
      3. 立即生效: source ~/.bashrc
    1. echo: 输出字符串
    • 不换行: 加上-n 参数

      name="Tom"
      age=20
      echo -n "${name} is ${age} years old" 
      
    • 解析转义字符:加上 -e 参数

    • 在有 -e 参数时,也可使用 转义字符 \c 来命令不换行
      在这里插入图片描述

    1. read命令:读取键盘输入的数据
      在这里插入图片描述
    2. $$ 、$!、$?获得进程ID信息
      • $$ :获得当前进程的ID

      • $! : 获得上一个进程的ID

      • $? : 获得上一个进程结束的状态码

      • 例子:

        echo "当前进程id : $$"
        sleep 100 &
        echo "上一个进程的id: $!"
        echo "上一个结束的进程状态码:$?"
        
        #结果:
        #当前进程id : 13797
        #上一个进程的id: 13798
        #上一个结束的进程状态码:0
        # $$获取当前的进程id为13797,之后后台执行sleep,这个后台进程为13798(可用ps命令验证),接着是$? ,输出上一个结束进程的状态码,上一个结束的进程为echo,顺利结束则为0
        

    6.exit 退出当前进程

    • exit 为Shell 内置命令,用来退出当前Shell进程 ,并返回一个退出状态,可以用 $?(上一个结束进程状态码) 来接收这个退出状态。

    • exit 命令可以接收一个整数值作为参数,代表退出状态,如果不指定,默认状态值为0。一般情况下,退出状态为0表示成功,为非0表示失败。

    • 例子:

      #!/bin/bash
      echo "befor exit"
      exit 8
      echo "after exit"
      # 结果为:before exit。而after exit并未输出
      

      接着使用echo $? 获取退出状态码,获得退出状态为:8

    1. Shell 数学运算
      如果不特别指明,每一个变量的值都是字符串。常用的数学计算如下。
      在这里插入图片描述

    2. if else 语句

      # 格式如下
      if  condition
      then
          statement(s)
      fi
      # condition为判断条件
      

      注意if后面有个then
      或者

      if  condition
      then
         statement1
      else
         statement2
      fi
      

      或者

      if  condition1
      then
         statement1
      elif condition2
      then
          statement2
      elif condition3
      then
          statement3
      ……
      else
         statementn
      fi
      

      也可以将then 和if 写在一行上:
      这样写if和elif后面都有then

      bash
      if  condition;  then
          statement(s)
      fi
      

      注意condition后的分号,当if 和then位于同一行时,这个分号是必须的

    3. test 命令
      test是Shell 内置命令,用来检测某个条件是否成立。test通常与if语句一起使用。
      test命令有很多选项,可以进行数值、字符串、文件三个方面的检测
      Shell test的命令用法:test expression,也可以简写为[ expression ],[]和expression之间的空格是必须的

      • 例子

        read age
        
        if test $age -le 2; then
        	echo "婴儿"
        elif test $age -ge 3 && test $age -le 8;then
        	echo "幼儿"
        elif [ $age -ge 9 ] && [ $age -le 17 ];then
        	echo "少年"
        elif [ $age -ge 18 ] && [ $age -le 25 ];then
        	echo "成年"
        elif [ $age -ge 26 ] && [ $age -le 40 ];then
        	echo "中年"
        else 
        	echo "老年"
        fi
        

      其中 -le 选项表示小于等于, -ge表示大于等于

      • 与文件检测相关的test 选项
        在这里插入图片描述

      • 与数值变焦相关的test选项
        在这里插入图片描述
        注意test只能用来比较整数,小数相关的比较还是得依赖bc命令

      • 与字符串判断相关得test选项
        在这里插入图片描述
        在test中,==、>、<只能用来比较字符串,不能用来比较数字。其次,无论是数字还是字符串,test都不支持>= 和 <= 运算符。

        read str1
        read str2
        # 检测字符串是否为空
        if [ -z "$str1" ] || [ -z "$str2"] ;then
        	echo "字符串不能为空"
        	exit 0
        fi
        
      • 与逻辑相关得test选项

        1. expression1 -a expression2 : 逻辑与
        2. expression1 -o expression2:逻辑或
        3. !expression : 逻辑非
      • 在test中使用变量建议用双引号包围起来,以防止空字符串

    4. [[]] : 检测条件是否成立,test的升级版

      • 在使用[[]] 时,不需要用“” 将变量引起来,即使为空值也不会出错
      • 不需要也不能对 >、< 进行转义,否则会出错
      • [[]] 剔除了 -o和-a 选项,只能使用&&和||
      • [[]]支持正则表达式,可以使用=~判断是否符合某个正则表达式,即[[ str =~ regex ]]
      • 不过[[]] 对数字处理还是不友好,可以使用(()) 处理整形数字,用[[]] 处理字符串或者文件
    5. while 循环

      while condition
      do
      	statements
      done
      
    6. for 循环和for int 循环

      1. c风格
      for((exp1;exp2;exp3))
      do
      	statements
      done
      # exp2为判断条件
      

      2.python 风格

      for variable in value_list
      do 
      	statements
      done
      

      对value_list的说明:

      • 给出具体数值:for i in 1 2 3 4 5
      • 给出取值范围:for i in {1..100} 范围的具体格式为:{start..end}
      • 使用命令的执行结果:for i in $(seq 2 2 100),$() 可以取得命令的执行结果,seq用来产生某个范围内的整数,2起始,100结束,步长为2。再如 :for i in $(ls *.sh)
      • 使用Shell通配符:for i in *.sh
      • 使用特殊变量:for i in $@,还有:$#、$*、$@、$?、$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值