ITPub博客

首页 > Linux操作系统 > Linux操作系统 > bash基础

bash基础

Linux操作系统 作者:nh39304 时间:2019-09-08 22:42:19 0 删除 编辑

基础知识:

    变量:  变量名+指向的内存空间;
    变量赋值:  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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69934036/viewspace-2656415/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2019-06-22

  • 博文量
    7
  • 访问量
    2831