shell脚本编程

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  #;###设置超时间(秒)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容