zoukankan      html  css  js  c++  java
  • 【夯实shell基础】shell基础面面观

    本文地址

     

          点击关注微信公众号 wenyuqinghuai

    分享提纲:

      1. shell中的函数

      2. shell中的数组

      3. shell中的变量

      4. shell中的运算符

      5. Linux的一些命令

      6. 几个自定义的脚本(可以添加到命令中)

    1. shell中的函数


      1.1)【定义shell函数(define function)】

        [ function ] funname [()]
    
        {
    
        action;
    
        [return int;]
    
        }

    说明:

    • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
    • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

    实例(testfun1.sh):

     1 #!/bin/sh
     2 
     3  fSum 3 2;
     4  function fSum()
     5  {
     6    echo $1,$2;
     7    return $(($1+$2));
     8  }
     9  fSum 5 7;
    10  total=$(fSum 3 2);
    11  echo $total,$?;
    12 
    13 sh testfun1.sh
    14 testfun1.sh: line 3: fSum: command not found
    15 5,7
    16 3,2
    17 1
    18 5
    testfun1.sh
    
    

    从上面这个例子我们可以得到几点结论:

    • 1、必须在调用函数地方之前,声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译。一次必须在使用函数前先声明函数。
    • 2、total=$(fSum 3 2); 通过这种调用方法,我们清楚知道,在shell 中 单括号里面,可以是:命令语句。 因此,我们可以将shell中函数,看作是定义一个新的命令,它是命令,因此 各个输入参数直接用 空格分隔。 一次,命令里面获得参数方法可以通过:$0…$n得到。 $0代表函数本身。
    • 3、函数返回值,只能通过$? 系统变量获得,直接通过=,获得是空值。其实,我们按照上面一条理解,知道函数是一个命令,在shell获得命令返回值,都需要通过$?获得。

      1.2)【函数作用域,变量作用范围】

    先我们看一个实例(testfun2.sh ):

     1 #!/bin/sh
     2 
     3 echo $(uname);
     4 declare num=1000;
     5 
     6 uname()
     7 {
     8   echo "test!";
     9   ((num++));
    10   return 100;
    11 }
    12 testvar()
    13 {
    14   local num=10;
    15   ((num++));
    16   echo $num;
    17 
    18 }
    19 
    20 uname;
    21 echo $?
    22 echo $num;
    23 testvar;
    24 echo $num;
    25 
    26 sh testfun2.sh
    27 Linux
    28 test!
    29 100
    30 1001
    31 11
    32 1001
    testfun2.sh

    我们一起来分析下上面这个实例,可以得到如下结论:

    • 1、定义函数可以与系统命令相同,说明shell搜索命令时候,首先会在当前的shell文件定义好的地方查找,找到直接执行。
    • 2、需要获得函数值:通过$?获得
    • 3、如果需要传出其它类型函数值,可以在函数调用之前,定义变量(这个就是全局变量)。在函数内部就可以直接修改,然后在执行函数就可以读出修改过的值。
    • 4、如果需要定义自己变量,可以在函数中定义:local 变量=值 ,这时变量就是内部变量,它的修改,不会影响函数外部相同变量的值 。

    2. shell中的数组


      2.1)【数组的定义】

      两种方法

    arr=(1 2 3 4 5) # 注意是用空格分开,不是逗号!!

      和

    array
    array[0]="a"
    array[1]="b"
    array[2]="c"

      2.2)【数组的遍历】

    for var in ${ arr[@] };
    do
        echo $var
    done

      2.3)【数组其他】

        -- 【读取数组】

        

    valuen=${array_name[n]} #获取单个元素
    echo ${array_name[@]}  #获取所有元素
    
    # 取得数组元素的个数
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    # 取得数组单个元素的长度
    lengthn=${#array_name[n]}
    

    3. shell中的变量


      3.1)定义

          your_name="runoob.com"

        -- 不能有空格

                --可以使用表达式赋值 

          for file in `ls /etc`

      3.2)【使用变量】

      

    your_name="qinjx"
    echo $your_name
    echo ${your_name}
    

       -- 可以加 {}, 也可以不加

       --【只读变量】 readonly myUrl

       --【删除变量】 unset variable_name

      3.3)【Shell 字符串】

        -- 可以单引号或者双引号,双引号会解析变量

        --获取字符串长度

        

    string="abcd"
    echo ${#string} #输出 4
    

         -- 截取字符串

    string="runoob is a great site"
    echo ${string:1:4} # 输出 unoo
    

          -- 查找字符串

    string="runoob is a great company"
    echo `expr index "$string" is`  # 输出 8
    

    4. shell中的运算符


      4.1)【基本运算符】

      原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

      

    #!/bin/bash
    
    val=`expr 2 + 2`
    echo "两数之和为 : $val"
    

       

      4.2)【关系运算符】

          lt : litter than

                     gt: grater than

    运算符说明举例
    -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
    -ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

     

        4.3)【字符串运算符】

     -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
    -n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
    str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

        4.4)【文件测试运算符】

    文件测试运算符用于检测 Unix 文件的各种属性。

    属性检测描述如下:

    操作符说明举例
    -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

      5.Linux的一些命令


      5.1)【一些不太常见的命令】

        -- 查看当前发行版本可以使用的shell:cat  /etc/shells

      5.2)【正则表达式】

        基础正则表达式(BRE)

      5.3)【awk命令】

        http://blog.csdn.net/shanyongxu/article/details/46563997

      5.4)【xargs命令】

        http://blog.csdn.net/shanyongxu/article/details/46859829

      6. 几个自定的脚本(可以添加到命令中)


      1)【实现scp下载远程文件到本地】

        -- down.sh 放到  ~/my_cmd

    #!/bin/bash
        
         if [ -z $1 ]
         then
             echo "请输入要下载的远程文件"
         else
             scp -P5860 root@10.x.xx.xx:$1 ~/Downloads
             echo "文件下载到了 ~/Downloads"
         fi
    down.sh

        然后在 vim ~/.bashrc 加上 

    alias down='sh ~/my_cmd/down.sh'
    

          就可以使用 down yourRemoteFile  命令下载远程文件到本地了

  • 相关阅读:
    美国常青小组:“4+2”,成功的企业的普遍特征
    与你的商业伙伴建立信任关系的12条准则
    成功12级跳:你还是穷人只因为你没有立下成为富人的目标
    生日与谁共
    猎取人心的36条黄金法则
    谢谢你能为我落泪
    要锤炼出营销魔法,口碑营销“无招胜有招”
    怎样成为下一个比尔·盖茨?总结决定他成功的几大要素
    只要你能够幸福
    史玉柱:创业不是靠忽悠,我的最后四个忠告
  • 原文地址:https://www.cnblogs.com/aiweixiao/p/6363239.html
Copyright © 2011-2022 走看看