1.变量
程序:指令+数据
指令:由程序文件提供 ; 数据来源:I/O设备,文件,管道,变量
程序:算法+数据结构
算法:解决问题的方式; 数据结构:组织数据的方式
变量:变量名+指向的内存空间
变量赋值:name=value;将数据存储到变量名指向的内存空间
变量类型:决定了数据存储格式,表示的数据范围,能参与的运算
注意:bash把所有变量都视为字符型;bash中的变量无需事先声明(相当于,把声明和赋值同时实现);声明:变量类型,变量名
变量替换:变量名--->其值
变量引用:${name}或$name
变量名规则:
1.变量名只能包含数字、字母、下划线,而且不能以数字开头;
2.变量名见名知意,命名机制遵循某种法则;
3.变量名不能使用程序的保留字(if,else,while...)
bash变量类型(按作用范围划分)
本地变量:仅对当前shell进程有效;
环境变量:对当前shell进程 及其子进程有效;
局部变量:仅对某代码片段有效(函数上下文)
位置参数变量:向执行脚本的shell进程传递的参数;
特殊变量:shell内置的有特殊公用的变量;
本地变量:
赋值:name=value
引用:${name}或$name
查看:set
撤销:unset
环境变量:
赋值:
1.export name=value
2.name=value export name
3.declare -x name=value
4.name=value declare -x name
引用:${name}或$name
查看:
1.export
2.printenv
3.declare -x
4.env
撤销:unset name
只读变量:
无法重新赋值,且不支持撤销;随当前shell进程的终止而终止;
1.declare -r name
2.readonly name
查看只读变量:declare -r
位置参数变量:
引用方式:$1,$2...${10},${11}...
清空位置变量:set --
轮替:shift [n]
特殊变量:
$0当前脚本的局对路径;
$# 位置参数个数
$*所有位置参数
$@所有位置参数
$$当前进程的id号
$PPID 当前进程的父进程的id号
$与$@的区别:仅$@和$放在双引号中有差别
[root@centos6 bin]# cat f1.sh
#!/bin/bash
echo "all args are $*"
echo "1st is $1"
f2.sh "$*"
[root@centos6 bin]# cat f2.sh
#!/bin/bash
echo "f2.sh"
echo "1st $1"
[root@centos6 bin]# f1.sh 10 20
all args are 10 20
1st is 10
f2.sh
1st 10 20
[root@centos6 bin]# cat f1.sh
#!/bin/bash
echo "all args are $*"
echo "1st is $1"
f2.sh "$@"
[root@centos6 bin]# cat f2.sh
#!/bin/bash
echo "f2.sh"
echo "1st $1"
[root@centos6 bin]# f1.sh 10 20
all args are 10 20
1st is 10
f2.sh
1st 10
小坑:
[root@centos6 ~]# x=haha
[root@centos6 ~]# y=$x
[root@centos6 ~]# echo $y
haha
[root@centos6 ~]# x=xixi
[root@centos6 ~]# echo $y
haha
##i++与++i的区别
[root@centos6 ~]# let j=i++
[root@centos6 ~]# echo $j
100
[root@centos6 ~]# i=100
[root@centos6 ~]# let j=++i
[root@centos6 ~]# echo $j
101
2.bash之多命令执行
多条命令顺序执行:COMMAND1;COMMAND2;COMMAND3;.....
逻辑运算:
1.与运算:&&
1&&1=1
1&&0=0
0&&1=0
0&&0=0 COMMAND1&&COMMAND2 ###前面的命令执行成功,后面的命令才会执行;
2.或运算:||
1||1=1
1||0=1
0||1=1
0||0=0 COMMAND1||COMMAND2 ###前面的命令执行失败,后面的命令才会执行
3.非运算:!
!1=0
!0=1
3.shell脚本编程:
过程式编程;解释运行;依赖于外部程序文件;
执行脚本
1.chmod +x SCRIPT_FILE; ./SCRIPT_FILE
2.bash SCRIPT_FILE ***bash会开子进程
3.source|. SCRIPT_FILE *** .和soruce不会开子进程
4.bash配置文件:
两类:
profile类:为交互式登录的shell进程提供配置
bashrc类:为非交互式登录的shll进程提供配置
交互式登录的shell进程:
直接通过某终端输入账号密码后登录打开的shell进程
使用su - username 或su -l username执行的登录切换
非交互式登录的shell进程:
su username执行的登录切换
图形界面下打开的终端
运行脚本
profile类:定义环境变量;运行命令或脚本
全局:/etc/profile /etc/profile.d/*.sh
用户个人:~/.bash_profile
bashrc类:定义本地变量;定义命令别名
全局:/etc/bashrc
用户个人:~/.bashrc
注意:仅管理员可以修改全局配置文件
交互式shell进程配置文件读取顺序:
/etc/profile--/etc/profile.d/*.sh--/.bash_profile--/.bashrc--/etc/bashrc
非交互式shell进程配置文件读取顺序:
~/.bashrc--/etc/bashrc--/etc/profile.d/*.sh
~/.bash_logout 用户退出时会执行此文件中的指令
注意:通过配置文件定义的特性不会理解生效;让配置文件中新定义的特性立即生效:
1.通过命令行重复定义一次
2.
source /PATH/FROM/CONF_FILE
. /PATH/FROM/CONF_FILE
5.bash算数运算
1.let var=$num1+$num2
2.var=$[$num1+$num2]
3.var=$(($num1+$num2))
4.var=$(expr $num1 + $num2)
增强型赋值:变量做某种算数运算后回存至自身
num=1;let num=$num+i
可简写为let num(+|-|*)=i
自增,自减:当i=1时
let num++ --->相当于 let num=$num+1
let num-- --->相当于 let num=$num-1
[root@centos6 ~]# num=1
[root@centos6 ~]# let num+=2
[root@centos6 ~]# echo $num
3
[root@centos6 ~]# echo $num
3
[root@centos6 ~]# let num+=5
[root@centos6 ~]# echo $num
8
[root@centos6 ~]# let num+=6
[root@centos6 ~]# echo $num
14
[root@centos6 ~]# num=2
[root@centos6 ~]# let num++
[root@centos6 ~]# echo $num
3
[root@centos6 ~]# let num++
[root@centos6 ~]# echo $num
4
[root@centos6 ~]# let num--
[root@centos6 ~]# echo $num
3
6.条件测试:
判断某需求是否满足,需要由测试机制来实现;
1.通过命令状态返回值来判断;0:成功;1-255失败
2.测试表达式:
(1)test EXPRESSION
(2)[ EXPRESSION ]
(3)[[ EXPRESSION ]]
注意:[]两端必须有空格,否则为语法错误;表达式中的变量要加双引,避免出错
bash测试类型:
1.数值测试(即数值大小比较)
-eq -ne 相等 不等
-gt -ge -lt -le 大于 大于等于 小于 小于等于
2.字符串测试:
==是否等于,相等为真
!=不等
>大于,<小于
=~左侧的字符串是否能被右侧的PATTREN匹配
-z "STRING" 判断指定的字符串是否为空,为空为真;
-n "STRING" 判断指定的字符串是否不空;不空为真;
3.文件测试:
存在性测试:-a|-e FILE 文件是否存在,存在为真;
存在性及类型测试:-b,-c,-f,-d,-l,-p,-S,-h|-L FILE 符号链接文件 ###注意:在判断文件类型时,因先判断文件是否为链接文件,因为,链接文件会找其指向的原文件
[root@centos6 ~]# ll /dev/cdrom ##cdrom为链接文件,sr0为块设备文件
lrwxrwxrwx. 1 root root 3 Mar 3 13:54 /dev/cdrom -> sr0
[root@centos6 ~]# ll /dev/sr0
brw-rw----+ 1 root cdrom 11, 0 Mar 3 13:54 /dev/sr0
[root@centos6 ~]# [ -b /dev/cdrom ]
[root@centos6 ~]# echo $?
0
存在性及权限测试:-r,-w,-x FILE
存在性及权限测试:-g,-s,-k FILE
文件是否有内容:-s FILE 文件有内容为真
4.时间戳:
-N FILE 文件自上一次读取操作后是否被修改过
5.从属关系测试:
-O FILE 当前用户是否为文件的属主
-G FIILE 当前用户是否属于文件的属组
6.双目测试:
FILE1 -ef FILE2 1和2是否为指向同一文件系统上的相同inode的硬链接
FILE1 -nt FILE2 1是否新于2
FILE1 -ot FILE2 1是否旧于2
组合测试:
第一种方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
例:[ -O FILE ] && [ -r FILE ]
第二种方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
!EXPRESSION
例:
[ -O file -a -x file ]
[ -z "hostname" -o "$hostname"==localhost -o "$hostname"==localhost.localdomain] && hostname=www.magedu.com
7.读取用户键盘输入:
read -p "描述信息:" 变量名
read -s 键盘输入 变量名 ##静默输入,即键盘输入的内容不显示
read -n 数字 ##限制输入的字符长度
read -d 一个字符; ###输入此处指定的字符即退出;注意:只能是一个字符
read -t #;###设置超时间(秒)