Shell编程快速入门

Shell 编程学习笔记——初探shell语法

  • 如何使用bash执行脚本

    1. bash < test.sh
    2. bash test.sh // bash 脚本名 [参数]
    3. ./test.sh // 这种方式会使用脚本内的#! 后面的参数 比如#! /bin/bash -v 相当于 bash test.sh -v
    4. . test.sh // · ex3[参数]
  • 变量赋值

    1. dir = `pwd`
    2. dir = $(pwd) // $(命令表)
  • 数组

    Bash 只提供一维数组,并且没有限定数组的大小。类似与 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标。下标可以是整数或算术表达式,其值应大于或等于 0 。用户可以使用赋值语句对数组变量赋值。

    • 赋值, 数组名[下标]

      city[0] = beijing // 此处有坑, 等号两边不能加空格

      city[1] = shanghai

      city[2] = shenzhen

    • 显示声明数组 declare -a 数组名

      declare -a city

    • 访问, ${数组名[下标]}

      echo ${city[0]}

      echo ${city[1]}

    • 组合赋值(初始化)。格式:数组名=(值1 值2 值3)

      city=(beijing shanghai shenzhen)

      tianxu@DLC00078F8D43D:/mnt/c/Users/xu.tian/shellScript$ echo ${city[2]} ${city[0]}
      shenzhen beijing
      
    • 访问数组所有元素。 使用*和@

      $ echo ${city[*]}
      beijing shanghai shenzhen
      
      echo ${city[@]}
      beijing shanghai shenzhen
      
    • 获取数组元素个数

      echo ${#shell[*]}
      
  • 传递参数方式一, 在shell脚本中使用$1, $2这样的格式使用参数,其中1和2的编号分别对应用户传进来的参数的顺序,例如:bash add.sh 1 2

    • 编写脚本add.sh

      let sum=$1+$2
      echo $sum
      
    • 传递参数执行脚本

      $ bash add.sh 10 11
      21
      
  • 传递参数方式二,自定义参数名称

    • 修改脚本add.sh

      let sum=$X+$Y
      echo $sum
      
    • 传递参数执行脚本

      $ X=10 Y=11 ./add.sh
      21
      

      使用这种语法是可以的,也尝试过使用bash add.sh X=10 Y=11 和 ./add.sh X=10 Y=11都会报错

  • 设置环境变量

    export myhome=/home/myhome
    
  • 键盘输入值

    • 编写脚本input.sh

      #! /bin/bash
      read -p "请输入一个数值:" num
      echo "你输入的数值是:" ${num}
      
    • 执行脚本

      $ ./input.sh
      请输入一个数值:111
      你输入的数值是: 111
      
  • 设值变量只允许读

    tianxu@DLC00078F8D43D:/mnt/c/Users/xu.tian/shellScript$ java_home=java
    tianxu@DLC00078F8D43D:/mnt/c/Users/xu.tian/shellScript$ readonly java_home
    tianxu@DLC00078F8D43D:/mnt/c/Users/xu.tian/shellScript$ java_home=ss
    -bash: java_home: readonly variable
    
  • 条件测试命令——test

    语法:test 表达式 如果表达式为真,则返回真,否则,返回假。

    • 数值比较

      -eg ==;-ne !=;-gt >;-ge >=;-lt <;-le <=

    • 测试文件属性

      文件的可读、可写、可执行,是否为普通文件,是否为目录分别对应:

      -r; -w; -x; -f; -d
      
      $ test -r filename
      
  • 字符串

    • 非空 -n , 空 -z
    • 可以使用 = 或者 != 以及 < 等符号按照字典序比较
  • 运算符

    可用该命令进行的运算有:

    算术运算:+ - * / %;逻辑运算:= ! < <= > >=

    如:

    $ i=5;expr $i+5
    

    另外,bc 是一个命令行计算器,可以进行一些算术计算。

  • 流程控制

    • if分支, 输入一个路径,判断该路径是文件还是文件夹,输出当前文件,或文件夹下的所有内容

      #! /bin/bash
      if test -f $1; then
              echo "是一个文件"
              cat $1
      elif test -d $1; then
              echo "进入了文件夹" $1
              cd $1 && cat *
      else
              echo "not a file or dir"
      fi
      
    • case分支,输入一个数字,判断是星期几

      #! /bin/bash
      case $1 in
              1)
                      echo "周一";;
              2)
                      echo "周二";;
              3)
                      echo "周三";;
              *)
                      echo "随便周几吧。";;
              esac
      
    • while循环, 写一个死循环,直到用户输入Y|y时退出

      #! /bin/bash
      while [ $input!="Y" ] && [ $input!="y" ]
      do
              echo "break loop?"
              read input
              case $input in
                      (y|Y) break;;
                      (n|N) continue;;
              esac
      done
      
    • for循环, 计算1到10的和

      #! /bin/bash
      sum=0
      for((i=1;i<=10;i++));
      do
              sum=$[$sum+$i]
      done
      echo $sum
      

      计算斐波那契1

      #! /bin/bash
      fib[0]=1
      fib[1]=1
      for((i=2;i<10;i++));
      do
              ((fib[$i]=fib[$i-1]+fib[$i-2]))
      done
      echo ${fib[*]}
      

      计算斐波那契2

      #! /bin/bash
      fib[0]=1
      fib[1]=1
      for((i=2;i<10;i++));
      do
              let fib[$i]=fib[$i-1]+fib[$i-2]
      done
      echo ${fib[*]}
      

      for_in 1

      #! /bin/bash
      for i in {1..10}
      do
              echo $(($i * 3 + 1));
      done
      

      for_in 2

      #! /bin/bash
      arr=$(seq 1 10)
      echo ${arr[*]}
      for i in $arr
      do
              echo $(($i * 3 + 1))
      done
      

      for_copy

      #! /bin/bash
      files=$(ls)
      for filename in $files
      do
              cp $filename $filename".old"
      done
      

      for_rm (这个是因为之前for_copy的时候不小心把copy的文件带了一个+号,所以删掉带+号的文件,后来又修改了copy的代码 就是上面的那个)

      #! /bin/bash
      files=$(ls)
      for filename in $files
      do
              case $filename in
                      *+*) rm $filename ;;
              esac
      done
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值