Linux系统

shell脚本基础-bash脚本编程

2018-07-25  本文已影响23人  willerhehehe

程序通常可理解为由指令+数据组成

数据

先说数据:数据有很多种,如磁盘文件,io设备输入数据,内存中的变量等
而数据中变量是很重要一种,按照作用域范围可分为:

  1. 本地变量:作用域为当前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 ~]# 
  1. 环境变量:作用域为当前shell和子shell
[root@localhost ~]# export name1=tom
[root@localhost ~]# echo $name1
tom
[root@localhost ~]# bash
[root@localhost ~]# echo $name1
tom
  1. 局部变量:作用域为函数内部

指令

指令也就是命令,这里主要关注命令的几个特性

  1. 多命令执行:COMMAND1;COMMAND2;COMMAND3;...
  2. 短路法则:通过与、或、非等命令对代码的执行进行控制
    &&:例如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的配置文件

2、非交互式shell的配置文件


应用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
上一篇 下一篇

猜你喜欢

热点阅读