shell编程实战
把命令,变量,流程控制语句等结合在一起,就形成了一个强大的Shell脚本
第一关,必须是root才能执行脚本,否则给出友好提示并终止脚本运行。
第二关,成功切换目录(cd /var/log) ,否则给出友好提示并终止脚本运行。
第三关,清理日志(cat /dev/null > messages),清理成功,给出正确提示。
第四关,通关或失败,给出相应提示(echo输出) 。
Shell脚本语言的种类
Shell脚本语言是弱类型语言(无需定义变量的类型就可使用),在Unix/Linux中主要有两大类Shell,
一类是Bourne shell,(包括sh,ksh,bash)默认
另一类是Cshell.(包括csh,tcsh)
设置vi别名vim,当用vi时,自动调用vim
[root@m01 ~]# echo "alias vi=vim" >>/etc/profile
[root@m01 ~]# . /etc/profile
[root@m01 ~]# alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
ias l.='ls -d .* --color=auto'
▽lias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
1.脚本里第一行:
#!/bin/bash
意思是用bash解释器解释,不加默认也是bash,但是要习惯性的加上解释器
检查bash解释器是否需要升级,返回如下一行,则不需要升级
[root@m01 ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
this is a test
如果返回:
be careful
this is a test
则需要升级bash
升级方法:
yum -y update bash
执行脚本的五种方式:(sh 是 bash的软连接,所以几乎没有区别)
[root@m01 ~]# sh 1.sh (推荐)
heihei nihao
[root@m01 ~]# cat 1.sh|bash
heihei nihao
[root@m01 ~]# sh <1.sh
heihei nihao
[root@m01 ~]# chmod +x 1.sh
[root@m01 ~]# . /root/1.sh (需要执行权限)
heihei nihao
[root@m01 ~]# source 1.sh
heihei nihao
[root@m01 ~]# vim 1.sh
#!/bin/bash
user=`whoami`
[root@m01 ~]# sh 1.sh
[root@m01 ~]# echo $user
[root@m01 ~]# . 1.sh
[root@m01 ~]# echo $user
root
儿子Shell脚本会直接继成父亲Shell脚本的变量、函数(儿子随父亲姓,基因也继承父亲的)等,反之不可以。
如果希望反过来继承(让父亲随儿子姓,让父亲的基因也继承儿子),就要用source或者点号在父亲Shell脚本中事先加载儿子Shell脚本。
使用sh执行脚本,会开启一个子Shell,而使用source或者,执行脚本,则不会开启子Shell,而是在同一个Shell里执行。
shell变量
1,什么是变量?
在小学或初中时,我们开始接触数学方程式,例如:已知x1, y=x+1,那么y等于多少?
在上述问题中,等号左边的x和y当时被称做未知数,但在Shell编程里就叫做变量名,等号右边的1和x+1则是变量的内容(变量的值) 。
注意,这里的等号符号被称为赋值,而不是等号。
[root@m01 ~]# oldboy="heihei"
[root@m01 ~]# echo $oldboy
heihei
变量分为两类:
1.环境变量(全局变量)
一般写在/etc/profile里或者/etc/bashrc推荐放到/etc/bashrc
因为/etc/bashrc比/etc/profile生效优先级高。
[root@m01 ~]# export OLDBOY=1
[root@m01 ~]# echo $OLDBOY
1
想要永久生效,把export OLDBOY=1放到/etc/bashrc 然后用.或者source生效一下环境变量即可
2.普通变量(局部变量)
定义环境变量需要大写,举例:
export OLDBOY="I am oldboy"
查看环境变量:
set(局部变量和全局变量)
env(全局变量)
unset 接变量名 取消变量
环境变量的知识小结:
变量名通常要大写。
变量可以在自身的Shell以及子Shell中使用。
常用export来定义环境变量。
执行env默认可以显示环境变量名称及对应值。
输出环境变量可用“$变量名” ,
取消用"unset变量名”。
书写crond定时任务时要注意,脚本用到的环境变量需要在执行的Shell脚本中重新定义。定时任务读不到环境变量。。。
如果希望永久生效可以放在用户环境变量文件或者全局环境变量文件里。(/etc/bashrc 或/etc/profile)
普通变量(及不变量)
本地变量,自定义变量
写法: 变量名="内容"
变量可以有数字,字母,下划线组成,但是不能以数字开头,不能含有特殊符号
变量也可以用反引号,解析命令。
单引号:所见即所得
双引号:有命令先解析命令,无命令原文输出 (推荐日常使用)
反引号:解析命令,作用等同于$()
老男孩老师建议:
1)在脚本中定义普通字符串变量,如果变量后边有内容,需要把变量的内容用双引号括起来。
2)单纯连续的数字的变量内容可以不加引号。
3)希望变量的内容原样输出需加单引号。
4)希望变量值引用命令并获取命令的结果就用反引号或$().
三剑客中awk使用引号比较特殊:
[root@web02 ~]# ETT=123
[root@web02 ~]# echo $ETT
123
[root@web02 ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@web02 ~]# awk 'BEGIN {print '$ETT'}'
123
[root@web02 ~]# awk 'BEGIN {print '"$ETT"'}'
123
awk,单引号解析命令,双引号所见即所得
变量定义知识小结:
1.变量名及变量内容小结:
变量名只能用字母,数字,下划线,且只能用字母或者下划线开头
变量名的定义要有一定的规范,并且要见名知意
示例:
OldboyAge=1 #<==每个单词的首字母大写的定义写法。
oldboy age=1 <==单词之间用“”的定义写法。
oldboyAgeSex=1 #<==驼峰语法:首个单词的首字母小写,其余单词首字母大写
OLDBOYAGE-1 <==单词全大写的定义写法。
一般的变量定义赋值用双引号,简单连续的字符串可以不用引号,希望原样输出,用单引号
希望变量的内容是命令的解析结果,要用反引号或$()把命令括起来再赋值
2.shell定义变量时使用”=“的知识
=是赋值的意思
3.打印变量或者使用变量是,要加双引号如:echo "$oldboy"其他字符
总结:
1.变量名
变量名组成:字母,数字,下划线,只能用字母下划线开头,不可用数字开头
定义规范:前边已经说过,为自己定义使用全大写的方式
2.等号
赋值号,两边不能有空格
3.变量内容
单引号,双引号,反引号,无引号的区别
4.输出变量内容
变量名加$符号,如果变量后边有内容,用{}引用变量部分
单引号,双引号,反引号,无引号
用echo输出
三道考试题:
1.用source执行脚本和用bash执行脚本有什么区别
使用sh执行脚本,会开启一个子Shell,而使用source或者,执行脚本,则不会开启子Shell,而是在同一个Shell里执行。
2.如何自定义环境变量
自定义环境变量需要注意以下几点:
1.变量名要大写
2.前边要加export
3.等号前后无空格
4.要想永久生效,把它写到/etc/bashrc。并用source或者点生效一下变量
3.定义变量内容,不加引号,单引号,双引号,反引号结果有什么不同?应该怎么用?
不加引号和双引号效果基本相同,但是前提是变量内容为简单的且没有空格
单引号为所见即所得
双引号为有命令先解析命令,无命令直接输出原文
反引号为解析命令,相当于在命令行执行了反引号内命令。等价于$()
网友评论