shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,
主要是方便管理员进行设置或者管理用的。相对于Perl、Python等脚本语言优势在于它能处理底层业务,
因为有大量Linux命令作为支撑,“自动安装”等用shell脚本写就会非常简单。


Linux下的shell脚本默认为bash ,sh其实是bash的一个链接。



(1)查看默认shell的两种方法:
1)echo $SHELL
/bin/bash

2)grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash


(2)样例脚本:
基于这个脚本来学习一下简单的shell脚本。
#!bin/bash
#变量定义
ETC_DIR=/etc/sysconfig/network-scripts
NET_DIR=/etc/sysconfig
ROOT_UID=0 

#if条件判断
if [ "$UID" -ne "$ROOT_UID" ]  #判断是否为root权限
then
   echo "Must be root to run this script"
   exit 1
fi

cd $ETC_DIR || {
    echo "Cannot change to necessary directory,">&2
    exit 1
}
#清除原来的网卡配置文件

cat /dev/null  >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"


#写入eth0配置:init_ip是先编辑好的网卡配置文件
cat /root/init_ip >ifcfg-eth0 && echo "write eth0 sucessfully"
cd $NET_DIR || {
    echo "Cannot change to necessary directory,">&2
    exit 1
}
service network restart   #重启网络命令
exit 0  #返回成功


(2)UID说明
UID是一个系统变量,当前是root权限 UID=0,当前非root权限UID不等于0
所以我们在这设置了一个变量ROOT_UID=0,来判断当前是否为root状态,因为我们对系统的配置文件进行修改必须使用root权限。所以执行的时候必须加sudo。

脚本执行时候会先调用环境变量,去找相关变量,有的变量是系统已经定义可直接使用,如上文用到的UID。
1)cat /etc/profile (全局)
2)cat /etc/profile.d   (全局)可以把变量放在这里面就可以直接用
3).bashrc:用户环境变量
4).bash_profile:用户环境变量

(3)清空文件的三种方法:
清空日志的三种方法:
1、echo "">test.log
2、echo  >test.log

3、cat /dev/null >test.log

/dev/null称之为黑洞
在代码中用的是第三种方法:cat /dev/null >network

(4)&&与||的使用:
cat /dev/null  >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"

1.&&表示只有当前面的命令执行成功以后才执行后面的命令。 
2.||表示前面执行不成功就执行后面命令。

在这两个符号后面,用大括号,可以写入多条命令
cd $NET_DIR || {
    echo "Cannot change to necessary directory,">&2
    exit 1
}

如果不能够进入到该目录下,就打印错误信息。
1)&0表示标准输入。
2)&1表示标准输出。
3)&2表示标准出错,


(5)脚本执行的三种方法:
1)bash或sh + 脚本名 (文件无可执行权限,或者没指定解释器)
2)绝对路径/脚本名 (需要可执行权限)或者./(和第一种方法类似,不过需要可执行权限)
3)source +脚本名 或者. 脚本名

bash或sh 指定的bash执行脚本,然后启动子shell去执行,比如,没有在脚本第一行指定使用哪一种脚本命令,就要在执行时指定解释器。
一般脚本都会在第一行写上‘#!/bin/bash’,且只能放在第一行,放在其他行就作注释处理,则需要用使用第一种方法。但是在Linux系统默认是bash,所以无需指定也可以,但是在其他系统就不行了。

(6)source xxx.sh 
source和.命令是Shell的内建命令,这种方式也不会创建子Shell,直接在当前的shell中执行,并且调用系统默认的shell去执行脚本,不管脚本中是不是指定shell命令解析器。
source和.命令不启动子shell,所以会直接执行子shell里的语句,并把变量传给父shell。脚本里面所有新建、改变变量的语句都会保存在当前shell里面。





Logo

更多推荐