基础知识:
变量: 变量名+指向的内存空间;
变量赋值: 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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。