绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
bash基础
2019-09-10 10:15:05

基础知识:

    变量:  变量名+指向的内存空间;

    变量赋值:  var_name=value;

    变量类型: 

        数据存储的格式,表示的数据范围;

        字符型,数字型,布尔型;

        C语音是强变量类型(使用前必须声明类型,类型声明后不能改变);bash是弱变量类型(无需事先声明,

                类型随需求改变);

        bash默认变量类型为字符型;

        要进行算术运算,需要声明为数字型:

        declare -i  var_name

        变量引用:  ${var_name}   $var_name

算术运算:

       let VAR=expression;

       VAR= $[expression];

       VAR= $((expression));

       VAR= $(expr argu1 argu2 argu3 )

       注意:有些时候乘法符号需要用转义字符;

       增强型赋值: += ,-= , *=, %=

       变量做某种运算后回存到此变量中

         let i=$i+n  ---> let i+=n  --->这个let的变量不用出现$

         let i+=1    ---> let i++

         let i-=i    ---> let i--

条件测试:

    (1)执行命令,并利用命令返回状态判断, $?

       0: 成功  ,1~255失败 

      脚本的状态返回值:默认是返回后一条命名的状态返回值

     自定义退出状态码:exit [n]:  n为指定的状态码

    (2)测试表达式

     test expression

     [ expression ]   ----注意expression两边必须有空白字符

     [[ expression ]]   

数值测试:

  -eq:  是否等于   [ $sum1  -eq  $sum2 ]

  -ne:  是否不等于

  -gt:  是否打于

  -ge:  是否大于等于

  -lt:  是否小于

  -le:  是否小于等于

字符测试:

  ==:  等于

  >:   大于

  <:   小于

  !=   不等于

注意: a.字符串要加双引号;

       b.字符串测试要是有[[  ]];

          

          =~ : 左侧字符串是否能够被右侧的PATTERN所匹配;

          -z “string”: 判断指定的字符串是否为空,空为真;

          -n “string”: 判断指定的字符串是否为空,非空为真;

       

        文件测试

           存在性测试:

             -a FILE  存在为真

             -e FILE  存在为真

           存在性及类型测试:

             -b FILE   块文件

             -c FILE   字符文件

             -d FILE   目录

             -f FILE   普通文件

             -h FILE   符合链接文件

             -P FILE   管道文件(大写P)

             -S FILE   套接字文件(大写S)

            

            文件权限性测试

             -r FILE   ;  -w FILE  ;-x FILE  ;

             -U FILE (suid权限) ; -g FILE(sgid权限); -K FILE(sticky权限)

            文件是否有内容

             -s FILE

            时间戳

             -N FILE 文件自上一次读后是否被修改过;

            从属关系

             -O 当前用户是否文件的属主

             -G 当前用户是否文件的属组

            双目测试

              FILE1 -ef FILE2  是否指向相同inode的硬连接

              FILE1 -nt FILE2  FILE1是否新于FILE2

              FILE1 -ot FILE2  FILE1是否旧于FILE2

组合测试条件

  逻辑运算

  (1)  

        COMMAND1 && COMMAND2

        可以这样来使用:相当于if command1 is true then command2,

        因为先判断command1,ture才会执行command2

     COMMAND1 || COMMAND2

          可以这样来使用:相当于else,因为先判断command1,command1是ture的话,就不执行command2了

     COMMAND1 !  COMMAND2

  (2) 

     EXPRESSION1 -a EXPRESSION2

     EXPRESSION1 -0 EXPRESSION2

     !EXPRESSION2

     注意: 逻辑运算符前后都有空白字符

     逻辑运算优先级别 !> -a > -o, 改变级别用括号,括号要用转义字符,前后留空

 示例:

logic_script.sh

#!/bin/bash

#

file=/tmp/logic_script.sh

  [ 6 -lt 7 ] && echo "1" || echo "0"

  [ "is a good day" =~ "day" ] && echo "1" || echo "0"   

  [ -a $file] && echo "1" || echo "0"          

[root@localhost tmp]# bash -x logic_script.sh 

+ file=/tmp/logic_scritp.sh           ---看||的逻辑,前面为真,后面就不执行了

+ '[' 6 -lt 7 ']'

+ echo 1

1

+ '[' isagoodday '=~' day ']'

logic_script.sh: line 6: [: =~: binary operator expected  ---字符串比较要两个中括号[[]]

+ echo 0

+ '[' -a '/tmp/logic_scritp.sh]'

logic_script.sh: line 7: [: missing `]'  ---看错误提示,]没有空格隔开,变为missing `]'

+ echo 0

            

修改后: 

logic_script.sh  

#!/bin/bash

#

file=/tmp/logic_script.sh

  [ 6 -lt 7 ] && echo "1" || echo "0"

  [[ "isagoodday" =~ "day" ]] && echo "1" || echo "0"

  [ -a $file ] && echo "1" || echo "0"

[root@localhost tmp]# bash -x logic_script.sh 

+ file=/tmp/logic_script.sh

+ '[' 6 -lt 7 ']'

+ echo 1

1

+ [[ isagoodday =~ day ]]

+ echo 1

1

+ '[' -a /tmp/logic_script.sh ']'

+ echo 1

1

变量作用域            

 环境变量: 当前shell进行及子进程有效

                赋值: (1)export var_name=value

                       (2)var_name= value

                            export var_name

                       (3)declare -x var_name=value

                       (4)var_name=value

                            delare -x var_name

                       注意: bash内嵌了许多环境变量(通常全为大写字母)

                查看: export , declare -x  , env

                

            本地变量: 当前运行脚本的shell进行的生命周期,对子shell

                赋值: var_name=value

                引用: ${var_name}  , $var_name

                查看: set

                撤销: unset var_name(此处不能用$)

                   

            

            局部变量: 某代码的片段,如函数的上下文,作用在函数的生命周期,函数结束就销毁;

                赋值: local var_name=vaule               

                             

            位置参数变量:当前执行脚本的shell进程传递的参数

                使用方式:myscript argue1  argu2 argu3 ... --->执行脚本时直接赋值给参数

                引用方式:$1 , $2  ,$3,...   

                

                轮替: shift n  把后面第n个参数轮替到个参数,n前面的参数都踢掉

                

            

                特殊变量:

                    $0: 脚本文件名;

                    $#: 脚本参数的个数

                    $*: 所有参数

                    $@: 所有参数   

                 --假设在脚本运行时写了三个参数 1、2、3

                    " * " 等价于 "1 2 3"(传递了一个参数),

                    "@" 等价于 "1" "2" "3"(传递了三个参数)

                    $$: 脚本运行的当前进程ID号;

                    $!: 后台运行的后一个进程的ID号

 例子:

sum_scirp.sh             

#!/bin/bash

#

declare -i sum

echo "the script filename is: $0"

echo "the script argu is : $*"

echo "the script argu's number is : $#"

shift 2                     ---- 前连个参数被踢了

echo "the script argu is : $*"

echo "the script argu's number is : $#"

for ((i=1;i<=$#;i++));do    ----仿C语言风格的for循环,需要两个括号

let sum+=$i;            ----$i,i循环的值,怎样取传递参数的值$($i)?

done

echo "the sum is $sum"

    [root@localhost tmp]# bash sum_script.sh  1 2 13 14 15 16 17 18 9

the script argu is : 1 2 13 14 15 16 17 18 9

the script argu's number is : 9

the script argu is : 13 14 15 16 17 18 9    ---- shift 2 的效果

the script argu's number is : 7

the sum is 28                ---- 28=1+2+3+4+5+6+7 ,这个$i不是取传递参数的值!

修改for语句

    for i in $*;do

      echo "$i"

      let sum+=$i         ---- 这个$i是列表里的数据,!

    done

[root@localhost tmp]# bash  sum_script.sh  1 2 13 14 15 16 17 18 9

the script argu is : 1 2 13 14 15 16 17 18 9

the script argu's number is : 9

the script argu is : 13 14 15 16 17 18 9

the script argu's number is : 7

13

14

15

16

17

18

9

the sum is 102

分享好友

分享这个小栈给你的朋友们,一起进步吧。

应用开发
创建时间:2020-06-17 15:31:04
应用软件开发是指使用程序语言C#、java、 c++、vb等语言编写,主要是用于商业、生活应用的软件的开发。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~