扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
基础知识:
创新互联-专业网站定制、快速模板网站建设、高性价比突泉网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式突泉网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖突泉地区。费用合理售后完善,十多年实体公司更值得信赖。
变量: 变量名+指向的内存空间; 变量赋值: 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
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流