shell脚本基础-bash脚本编程
2018-07-25 本文已影响23人
willerhehehe
程序通常可理解为由指令+数据组成
数据
先说数据:数据有很多种,如磁盘文件,io设备输入数据,内存中的变量等
而数据中变量是很重要一种,按照作用域范围可分为:
-
本地变量:作用域为当前shell
只能在当前bash下使用的,子bush就不能生效了,例如在当前bash下再次输入bash会进入子bash,此时上一个bash中定义的本地变量就无法使用了。(通过pstree命令可以查看当前所在的bash位置)
本地变量的定义:name=value
本地变量的删除:unset name
[root@localhost ~]# name1=tom 本地变量赋值
[root@localhost ~]# echo $name1 #本地bash可以显示
tom
[root@localhost ~]# bash #进入子bash
[root@localhost ~]# echo $name1 #子bash无法显示
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $name1
tom
[root@localhost ~]# unset name1 #取消bash
[root@localhost ~]# echo $name1
[root@localhost ~]#
- 环境变量:作用域为当前shell和子shell
[root@localhost ~]# export name1=tom
[root@localhost ~]# echo $name1
tom
[root@localhost ~]# bash
[root@localhost ~]# echo $name1
tom
- 局部变量:作用域为函数内部
指令
指令也就是命令,这里主要关注命令的几个特性:
-
多命令执行:
COMMAND1;COMMAND2;COMMAND3;...
-
短路法则:通过与、或、非等命令对代码的执行进行控制
与&&
:例如COMMAND1&&COMMAND2
,若COMMAND1
执行不成功,则COMMAND2
就不会被执行,只有COMMAND1
执行成功COMMAND2
才会被执行;
或||
:例如COMMAND1||COMMAND2
,若COMMAND1
执行成功,则COMMAND2
就不会被执行;
如何写shell脚本
shell脚本基本就是简单的命令堆砌,不过若想直接当作可执行文件运行时需要在脚本第一行给出shebang,也就是解释器的位置:#!/bin/bash
,此外还需注意新建的文件通常没有执行权限,可通过chamod +x /PATH/FILE_NAME
来添加执行权限。
常见的解释器还有:#!/usr/bin/python
,#!/usr/bin/perl
。
例如以下bash脚本:
#!/bin/bash
id user3||useradd user3 #若没有user3用户,则创建(此处用到了短路法则中的或||命令)
echo "user3" | passwd --stdin user3 #将'user3'作为user3用户的密码
mktemp -d /tmp/test.XXXXXX #创建一个随机临时文件
运行结果为:
[root@localhost ~]# bash myfirst.sh
uid=4008(user3) gid=4008(user3) 组=4008(user3)
更改用户 user3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
/tmp/test.3AGefp
bash的配置文件:突破shell的生命周期
因为bash程序所使用的变量依赖于shell,而shell的本地变量与环境变量,通常只能在当前shell或当前shell和其子shell中使用,一旦重启shell就会遗失,这会导致bash脚本仅能在当前shell有效运行,换个shell就不行了,失去了脚本的复用性。而这种问题,可以通过修改配置文件来解决
shell通常分为交互式shell与非交互式shell,而这两种方式读取的配置文件并不相同:
1、交互式shell的配置文件
-
全局:对所有用户都生效;
/etc/profile
/etc/profile.d/*.sh
-
用户个人:仅对当前用户有效;
~/.bash_profile
-
功用:
1、用于定义环境变量;
2、运行命令或脚本;
2、非交互式shell的配置文件
-
全局:
/etc/bashrc
-
用户个人:
~/.bashrc
-
功用:
1、定义本地变量;
2、定义命令别名;
应用1:定义一个对当前用户生效的命令别名
[root@localhost ~]# cat /root/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias cls='clear' #增加的命令别名
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
应用2:让centos用户登录时,提示其已经登陆,并显示当前系统时间
[root@localhost ~]# nano /etc/profile.d/welcome.sh
echo "Welcome home,$USER"
date
重启shell时就会看到
Last login: Wed Jul 25 15:55:31 2018 from 172.16.74.1
Welcome home,root
2018年 07月 25日 星期三 17:31:01 CST