千家信息网

bash基础

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,基础知识: 变量: 变量名+指向的内存空间; 变量赋值: var_name=value; 变量类型: 数据存储的格式,表示的数据范围; 字符型,数字
千家信息网最后更新 2024年11月30日bash基础

基础知识:

    变量:  变量名+指向的内存空间;    变量赋值:  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 11+ '[' 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 11+ [[ isagoodday =~ day ]]+ echo 11+ '[' -a /tmp/logic_script.sh ']'+ echo 11

变量作用域

 环境变量: 当前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 sumecho "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)?doneecho "the sum is $sum"    [root@localhost tmp]# bash sum_script.sh  1 2 13 14 15 16 17 18 9the script argu is : 1 2 13 14 15 16 17 18 9the script argu's number is : 9the script argu is : 13 14 15 16 17 18 9    ---- shift 2 的效果the script argu's number is : 7the 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 9the script argu is : 1 2 13 14 15 16 17 18 9the script argu's number is : 9the script argu is : 13 14 15 16 17 18 9the script argu's number is : 71314151617189the sum is 102
0