shell脚本学习第一天

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


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

查看默认shell的两种方法:

>echo $SHELL
/bin/bash

>grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash

一个简单的脚本:

之前在这篇文章中配置桥接的静态IP的时候是手动操作的,下次换了一个网络又要重新配置,所以写了个脚本来自动配置。基于这个脚本来学习一下简单的shell脚本。

#!bin/bash

ETC_DIR=/etc/sysconfig/network-scripts
NET_DIR=/etc/sysconfig

ROOT_UID=0

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!"

#写入eth配置:
cat /home/yangni/staticip/myip >ifcfg-eth0 && echo "write eth0 sucessfully"


cd $NET_DIR || {
    echo "Cannot change to necessary directory,">&2
    exit 1
}

cat /dev/null  >network   #清空network

#将默认网关相关配置写入network
cat /home/yangni/staticip/mynetwork > network && echo "write network sucessfully"

service network restart   #重启网络命令

exit 0
1、UID是一个系统变量,当前是root权限 UID=0,当前非root权限UID不等于0

这里写图片描述
所以我们在这设置了一个变量ROOT_UID=0,来判断当前是否为root状态,因为我们对系统的配置文件进行修改必须使用root权限。所以执行的时候必须加sudo。

2、清空文件的三种方法:
清空日志的三种方法:
1、echo "">test.log
2、echo  >test.log
3、cat /dev/null >test.log

在改代码中我们用的是第三种方法:cat /dev/null >network

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

这里&&表示,只有当前面的命令执行成功以后才执行后面的命令。
而 || 则是表示前面执行不成功就执行后面命令。

cd $NET_DIR || {
    echo "Cannot change to necessary directory,">&2
    exit 1
}

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


脚本执行:

脚本执行时候会先调用环境变量,去找相关变量,有的变量是系统已经定义可直接使用,如上文用到的UID。

cat /etc/profile (全局)
cat /etc/profile.d  (全局)可以把变量放在这里面就可以直接用
.bashrc:用户环境变量
脚本执行的三种方法:
  • bash或sh + 脚本名 (文件无可执行权限,或者没指定解释器)
  • 绝对路径/脚本名 (需要可执行权限)或者./(和第一种方法类似,不过需要可执行权限)
  • source +脚本名 或者 . 脚本名

>bash xxx.sh
>bash >xxx.sh
bash或sh 指定的bash执行脚本,然后启动子shell去执行。如果没有在脚本第一行指定使用哪一种脚本命令(`#!/bin/bash,只能放在第一行,放在其他行就作注释处理),则需要用使用第一种方法。但是在Linux系统默认是bash,所以无需指定也可以,但是在其他系统就不行了。


>source xxx.sh
>. xxx.sh
source或者.命令是Shell的内建命令,这种方式也不会创建子Shell,直接在当前的shell中执行,并且调用系统默认的shell去执行脚本,不管脚本中是不是指定shell命令解析器。

所以用 . 和sh运行时就会出现如下现象:
这里写图片描述
因为 . 不启动子shell,所以会直接执行子shell里的语句,并把变量传给父shell。脚本里面所有新建、改变变量的语句都会保存在当前shell里面。


执行结果截图:

如果没有使用root权限:
如果没用root权限:

加上sudo之后:
加上suodo后可顺利执行


贴上myip和mynetwork两个文件:
myip:

DEVICE=eth0
HWADDR=00:0C:29:03:4D:EC  #物理地址无需修改
BOOTPROTO=static
NM_CONTROLLED=yes        #实时生效,修改后无需要重启网卡立即生效
IPADDR=192.168.0.27
BROADCAST=192.168.0.255
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
ONBOOT=yes          #开机启用网络配置。
TYPE=Ethernet
DNS1=8.8.8.8
IPV6INIT=no
USERCTL=no

mynetwork:

NETWORKING=yes
HOSTNAME=yangni
GATEWAY=192.168.0.1    #添加网关地址
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值