讲师_@王晓春
本章内容
- ▼编程基础
- ▼shell脚本基础
- ▷创建shell脚本
- ▷脚本的基本结构
- ▷变量
- 1. Shell中变量命名法则:
- 2. bash中变量的种类
- 局部变量
- 环境变量
- 位置变量
- 退出状态
- 3. 算术运算
- 赋值
- 逻辑运算
- 短路运算
- 条件测试
- 4. test命令
- bash的数值测试
- bash的文件测试
- 组合测试条件
- 5. 使用read命令来接受输入
- 6. 条件选择 if 语句
- 7. 条件判断:case语句
- 8. bash如何展开命令行
- ▼bash的配置文件
- ▷编辑配置文件生效
- 1. Bash 退出任务
- 2. $- 变量
- set 命令
- 练习
- 练习答案
摘要:
- 编程基础
- 脚本基本格式
- 变量
- 运算
- 条件测试
- 条件判断if
- 条件判断case
- 配置用户环境
▼编程基础
- 程序
- 程序编程风格:
-
shell程序:提供了编程能力,解释执行
-
程序的执行方式
-
编程基本概念
- 编程逻辑处理方式:
- shell编程:过程式、解释执行
编程语言的基本结构:
各种系统命令的组合
数据存储:变量、数组
表达式:a + b
语句:if
▼shell脚本基础
- shell脚本通常以shebang起始
#!/bin/bash
只有第一行可以使用shebang
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
- shell脚本的用途有:
- 自动化常用命令
- 执行系统管理和故障排除
- 创建简单的应用程序
- 处理文本或文件
▷创建shell脚本
1. 使用文本编辑器来创建文本文件
- 第一行必须包括shell声明序列:#!
示例:#!/bin/bash - 添加注释:注释以#开头
2. 运行脚本
- 给予执行权限,在命令行上指定脚本的绝对或相对路径
- 直接运行解释器,将脚本作为解释器程序的参数运行
脚本规范
- 第一行一般为调用使用的语言
- 程序名,避免更改文件名为无法找到正确的文件
- 版本号
- 更改后的时间
- 作者相关信息
- 该程序的作用,及注意事项
- 最后是各版本的更新简要说明
▷脚本的基本结构
#!SHEBANG
CONFIGURATION_VARIABLES
FUNCTION_DEFINITIONS
MAIN_CODE
shell脚本示例
#!/bin/bash
# ------------------------------------------
# Filename: hello.sh
# Revision: 1.1
# Date: 2017/06/01
# Author: wang
# Email: wang@gmail
# Website: www.magedu
# Description: This is the first script
# Copyright: 2017 wang
# License: GPL
# ------------------------------------------
echo “hello world”
- 脚本调试
检测脚本中的语法错误
bash -n /path/to/some_script
调试执行
bash -x /path/to/some_script
▷变量
- 静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如:java,c
- 动态编译语言:不用事先声明,可随时改变类型,如bash,Python
- 强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,如java , c# ,python
- 弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
1. Shell中变量命名法则:
1、不能使程序中的保留字:例如if, for
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法
- Shell中命名建议规则:
1、变量名大写
2、局部变量小写
3、函数名小写
4、用英文名字,并体现出实际作用
2. bash中变量的种类
根据变量的生效范围等标准划分下面变量类型
- 局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
- 环境变量:生效范围为当前shell进程及其子进程
- 本地变量:生效范围为当前shell进程中某代码片断,通常指函数
- 位置变量:$1, $2, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
- 特殊变量:
$?, $0, $*, $@, $#,$$
$BASHPID:当前进程的PID
$PPID:父进程的PID
只读变量:declare -r VAR
或 readonly VAR
局部变量
- 变量引用:${name} 或者 $name
" "
弱引用,其中的变量引用会被替换为变量值
' '
强引用,其中的变量引用不会被替换为变量值,而保持原字符串 - 显示已定义的所有变量:set
- 删除变量:unset name
环境变量
bash内建的环境变量 | ||
---|---|---|
$PATH | $_ 上一条命令的最后一条参数 | $HISTSIZE |
$SHELL | $HOSTNAME | $MAIL |
$USER | $LANG | $SHLVL bash嵌套深度 |
$UID | $PWD | $HOME |
位置变量
set --
清空所有位置变量
退出状态
-
进程使用退出状态来报告成功或失败
0
代表成功,1-255
代表失败
$?
变量保存最近的命令退出状态 -
退出状态码
-
bash自定义退出状态码
-
exit [n]
:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
3. 算术运算
赋值
逻辑运算
- 与:11得1,有0得0
- 或:00得0,有1得1
短路运算
条件测试
- 真与假或
- 命令为真时:直接找
&&
后的命令 - 命令为假时:直接找
||
后的命令 - 例如:
grep -q no_such_user /etc/passwd \
|| echo 'No such user'
No such user
ping -c1 -W2 station1 &> /dev/null \
> && echo "station1 is up" \
> || (echo 'station1 is unreachable'; exit 1)
station1 is up
4. test命令
- 长格式的例子:
test "$A" = "$B" && echo "Strings are equal"
test “$A” -eq “$B” && echo "Integers are equal"
- 简写格式的例子:
[ "$A" = "$B" ] && echo "Strings are equal"
[ "$A" -eq "$B" ] && echo "Integers are equal"
bash的数值测试
-v VAR
变量VAR是否设置
例:[ -v x ] && echo 1 || echo 0
数值测试 | 字符串测试 | ||
---|---|---|---|
-gt | 是否大于 | = | 是否等于 |
-ge | 是否大于等于 | > | ascii码是否大于ascii码 |
-eq | 是否等于 | < | 是否小于 |
-ne | 是否不等于 | != | 是否不等于 |
-lt | 是否小于 | =~ | 左侧字符串是否能够被右侧的PATTERN所匹配 |
-le | 是否小于等于 | ↑ 注意: 此表达式一般用于[[ ]] 中;扩展的正则表达式 | |
-z "STRING“ | 字符串是否为空,空为真,不空为假 | ||
-n "STRING“ | 字符串是否不空,不空为真,空为假 |
注意:用于字符串比较时的用到的操作数都应该使用引号
bash的文件测试
存在性 | 文件权限 | 文件大小测试 | |||
---|---|---|---|---|---|
-a FILE | 同-e | -r FILE | 是否可读 | -t fd | fd 文件描述符是否在某终端已经打开 |
-e FILE | 文件是否存在 | -w FILE | 是否可写 | -N FILE | 文件自从上一次被读取之后是否被修改过 |
-x FILE | 是否可执行 | -O FILE | 当前有效用户是否为文件属主 | ||
类别 | 文件特殊权限 | -G FILE | 当前有效用户是否为文件属组 | ||
-d FILE | 是否目录 | -u FILE | 是否有SUID权限 | FILE1 -ef FILE2 | FILE1是否是FILE2的硬链接 |
-f FILE | 是否普通文件 | -g FILE | 是否有SGID权限 | FILE1 -nt FILE2 | FILE1是否新于FILE2(mtime) |
-h FILE 或 -L FILE | 是否符号链接文件 | -k FILE | 是否有STICKY权限 | FILE1 -ot FILE2 | FILE1是否旧于FILE2 |
-b FILE | 是否块设备文件 | ||||
-c FILE | 是否字符文件 | -s FILE | 是否存在且非空 | ||
-p FILE | 是否管道文件 | ||||
-S FILE | 是否套接字文件 |
组合测试条件
- 第一种方式:
COMMAND1 && COMMAND2
并且
COMMAND1 || COMMAND2
或者
! COMMAND
非
如:
[ -f “KaTeX parse error: Expected 'EOF', got '&' at position 9: FILE” ] &̲& [[ “FILE”=~ .*.sh$ ]]
- 第二种方式:
EXPRESSION1 -a EXPRESSION2
并且
EXPRESSION1 -o EXPRESSION2
或者
! EXPRESSION
必须使用测试命令进行,[[ ]] 不支持
示例:
[ -z “$HOSTNAME” -o $HOSTNAME "==“localhost.localdomain” ]
&& hostname www.magedu
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
5. 使用read命令来接受输入
- 使用read来把输入值分配给一个或多个shell变量
-p
指定要显示的提示
-s
静默输入,一般用于密码
-n N
指定输入的字符长度N
-d
‘字符’ 输入结束符
-t N
TIMEOUT为N秒
- read 从标准输入中读取值,给每个单词分配一个变量
- 所有剩余单词都被分配给最后一个变量
read -p “Enter a filename: “ FILE
6. 条件选择 if 语句
#单分支
if 判断条件
then
条件为真的分支代码
else
条件为假的分支代码
fi
#多分支
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3
then
条件3为真的分支代码
else
以上条件都为假的分支代码
fi
- 逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
If示例
根据命令的退出状态来执行命令
if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP' elif grep "station1" ~/maintenance.txt &> /dev/null; then
echo 'Station1 is undergoing maintenance‘
else
echo 'Station1 is unexpectedly DOWN!'
exit 1
fi
7. 条件判断:case语句
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
- case支持glob风格的通配符:
*
: 任意长度任意字符
?
: 任意单个字符
[ ]
:指定范围内的任意单个字符
a|b
: a或b
8. bash如何展开命令行
- 把命令行分成单个命令词
- 展开别名
- 展开大括号的声明({})
- 展开波浪符声明(~)
- 命令替换$() 和 ``)
- 再次把命令行分成命令词
- 展开文件通配(*、?、[abc]等等)
- 准备I/0重导向(<、>)
- 运行命令
- 防止扩展
反斜线(\)会使随后的字符按原意解释
$ echo Your cost: \$5.00
Your cost: $5.00
- 加引号来防止扩展
•单引号(’
)防止所有扩展
•双引号(”
)也防止所有扩展,但是以下情况例外:
$(美元符号) - 变量扩展
` (反引号) - 命令替换
\(反斜线) - 禁止单个字符扩展
!(叹号) - 历史命令替换
▼bash的配置文件
按生效范围划分,存在两类:
- 全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
- 个人配置:
~/.bash_profile
~/.bashrc
- shell登录两种方式
交互式登录:
(1)直接通过终端输入账号密码登录
(2)使用“su - UserName” 切换的用户
执行顺序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录:
(1)su UserName
(2)图形界面下打开的终端
(3)执行脚本
(4)任何其它的bash实例
执行顺序: /etc/profile.d/*.sh --> /etc/bashrc -->~/.bashrc
- Profile类
- 按功能划分,存在两类:
profile
类和bashrc
类
-
profile类:为交互式登录的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
功用:
(1) 用于定义环境变量
(2) 运行命令或脚本 -
Bashrc类
bashrc类:为非交互式和交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量
▷编辑配置文件生效
- 修改profile和bashrc文件后需生效
两种方法:
1重新启动shell进程
2.
或source
例:
. ~/.bashrc
1. Bash 退出任务
- 保存在~/.bash_logout文件中(用户)
- 在退出登录shell时运行
- 用于
•创建自动备份
•清除临时文件
2. $- 变量
h:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭
i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的。
m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。
B:braceexpand,大括号扩展
H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令
set 命令
- $- 变量
h
:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭
i
:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的。
m
:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。
B
:braceexpand,大括号扩展
H
:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令
重要
set -u
在扩展一个没有设置的变量时,显示错误信息(等同set –o nounset)set -e
如果一个命令返回一个非0退出状态值(失败)就退出(等同set –o errexit)
练习
1、编写脚本per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
2、编写脚本excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
3、编写脚本nologin.sh和login.sh,实现禁止和允许普通用户登录系统
4、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
5、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
6、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
Bash的文件测试
7、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
8、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
9、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
10、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
11、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
12、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
13、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
14、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
15、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
16、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
17、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
18、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
19、用户root登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm –i’
cdnet=‘cd /etc/sysconfig/network-scripts/’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系统是CentOS7)
20、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
21、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
22、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等
练习答案
1、编写脚本per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
#!/bin/bash
if [ -e $1 ]
then
[ ! -r $1 -a ! -w $1 ] && echo "The file is not write and not red" || echo "The file can read or write"
else
echo "The file isn't exist"
fi
2、编写脚本excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
#!/bin/bash
[ -f $1 -a $(echo $1 | grep ".*\.sh") ] && chmod 755 $1;echo "yesyes" || echo " isn't a script"
3、编写脚本nologin.sh和login.sh,实现禁止和允许普通用户登录系统
#!/bin/bash
loginyes=none
nologin=none
[ -f /etc/nologin ] && read -n 1 -p "Do you want to allow user login[Y/N]:" nologin || read -n 1 -p "Do you want to forbid user login[Y/N]: " loginyes
loginyes=$(echo $loginyes | tr 'A-Z' 'a-z')
nologin=$(echo $nologin | tr 'A-Z' 'a-z')
#echo -e "your choose is $loginyes \n please wait! \n ... \n Done,all of users was forbid to login."
#echo "your choose is $nologin \n please wait! \n ... \n Done,all of users was allowed to login."
if [ $loginyes = 'y' ]
then
echo -e "\nyou choose yeyesyess"
touch /etc/nologin
elif [ $loginyes = 'n' ]
then
echo -e "\nyou choose NO"
fi
if [ $nologin = 'y' ]
then
echo -e "\n you choose yes"
rm -f /etc/nologin
elif [ $nologin = 'n' ]
then
echo -e "\nyou choose No"
fi
4、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
#!/bin/bash
[ $# -lt 1 ] && echo "you must give me unless one agrument"&&exit 1 || echo `cat $1| grep ^$|wc -l`
5、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
#!/bin/bash
#ping ip
ping -c 1 $1 > /dev/nul
[ $? -eq 0 ] && echo "ip can ping" || echo " ip can't ping"
6、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
Bash的文件测试
#!/bin/bash
#test6 disk user%
USES=$(df | egrep -o "[0-9]{1,3}%" | tr -d %| sort -nr|head -1)
USEI=$(df -i | egrep -o "[0-9]{1,3}%" | tr -d %| sort -nr|head -1)
[ $USES -ge 80 ] && wall "WARNING! the disk for almost"
[ $USEI -ge 80 ] && wall "WARNING! the inode for almost"
7、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
#!/bin/bash
USER10=$(cat /etc/passwd | head -10 | tail -1|cut -d: -f3)
USER20=$(cat /etc/passwd | head -20 | tail -1|cut -d: -f3)
SUMUSER=$[ $USER10 + $USER20 ]
echo "ID sum is $SUMUSER"
8、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
#!/bin/bash
[ $# -lt 1 ] && echo "please input unless one argument" && exit
#SUM1=$(cat $1 | grep ^$|wc -l)
#SUM2=$(cat $2 | grep ^$|wc -l)
#SUM=$[ $SUM1 + $SUM2 ]
sum=$( cat $@ | grep "^$" | wc -l )
echo "the space sum is $sum"
9、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
#!/bin/bash
ETC=$( ls -dl /etc/* /var/* /usr/*| wc -l)
echo "/etc and /var and /usr have $ETC directories or file"
10、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
#!/bin/bash
#10.createuser
[ $# -lt 1 ] && echo "plead input unless one argument" && exit 1
useradd $1 &> /dev/nul
USER_EXIT=$?
[ $USER_EXIT -eq 9 ] && echo "createuser.sh: user $1 already exists" && exit 9
[ ! $USER_EXIT -eq 0 ] && echo "createuser.sh: ERROR"
id $1
11、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
#!/bin/bash
read -p "Please input [Yes/No]:" YESORNO
case $YESORNO in
[Yy][Ee][Ss]|[Yy])
echo "you choose yesyes"
;;
[Nn][Oo]|[Nn])
echo "you choose no"
;;
*)
echo "you choose other"
esac
12、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
#!/bin/bash
[ $# -lt 1 ] && echo "Please input unless one argument!" && exit
for count in `seq 1 $#`
do
CHAR=$(eval ls -dl \$$count | cut -c 1)
CO="\e[1;32m"
LOR="\e[0m"
case $CHAR in
-)
echo -e "The file type is \e[1;32mnormal file\e[0m"
;;
l)
echo -e "The file type is $CO link file $LOR"
;;
d)
echo -e "The file type is $CO directory $LOR"
;;
*)
echo "sorry,I still don't know the file type "
esac
done
13、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
#!/bin/bash
[ $# -lt 1 ] && echo "Please intput unless one argument" && exit
[ $# -gt 1 ] && echo "I just can understand one argument" && exit
[[ $1 =~ ^[0-9]*$ ]] && echo "your argument is a positive integer" || echo "your argument isn't a INT"
14、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
#!/bin/bash
CO="\e[1;31m"
LOR="\e[0m"
echo -e "The hostname is $CO `hostname` $LOR"
echo -e "The IP address is $CO `ifconfig ens33| egrep -o "(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>"` $LOR"
echo -e "The kernel release $CO `uname -r` $LOR"
echo -e "The System version is $CO `cat /proc/version | grep -o ".*64"` $LOR"
echo -e "The CPU model is $CO `lscpu | grep "Model name"|cut -d: -f2 |tr -d " " ` $LOR"
echo -e "The memory is $CO `lsmem | grep "Total online memory"|cut -d: -f2|tr -d " "` $LOR"
echo -e "The disk is $CO `lsblk | grep "\<sda\>"|tr -s ' '| cut -d ' ' -f4` $LOR"
15、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
#!/bin/bash
cp -a /etc/ /root/etc`date %F`
16、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
#!/bin/bash
echo -e "The disk use ratio is `df | grep -o "...%"|tr -d %|sort -nr|head -1`%"
17、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
#!/bin/bash
#links.sh
echo "you host links stat is :"
who | egrep -o "(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>"|uniq -c|sort -nr
18、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
vim /etc/profile.d/env.sh
export PATH=/usr/local/apache/bin:$PATH
source /etc/profile.d/env.sh
19、用户root登录时,将命令指示符变成红色,并自动启用如下别名:
vim /root/.bashrc
...
PS1='\[\e[1;31m\][\u@\h \w]\$\[\e[0m\]'
rm=‘rm –i’
cdnet=‘cd /etc/sysconfig/network-scripts/’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-ens33’
...
20、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
#任意用户登录系统时,会按如下读取配置,在如下哪个文件写都可以
#/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
vim /etc/profile.d/env.sh
echo -e '\033[31m hi,dangerous! \033[0m'
21、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
示例
vim ~/.vimrc
set nu "show line
set ts=4 "TAB 4 chars
syntax on "grammar light
set cursorline
"set mouse=a
set ai
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#***********************************************************")
call setline(4,"#Author: Jibill Chen")
call setline(5,"#QQ: *********")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: http://thson.blog.csdn")
call setline(9,"#Description: The test script")
call setline(10,"#**********************************************************")
call setline(11,"")
endif
endfunc
autocmd BufNewFile * normal G
22、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等
vim reset.sh
...
cat >> ~/.bash_profile << EOF
PS1='\[\e[1;8;$[RANDOM%6+41]m\][\u@\h \w]\$\[\e[0m\]'
export REGEX_IP='(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'
EOF
#config bashrc
cat >> ~/.bashrc << EOF
alias cdnet='cd /etc/sysconfig/network-scripts/'
EOF
#config vimrc
cat >> ~/.vimrc << EOF
set nu "show line
set ts=4 "TAB 4 chars
syntax on "grammar light
set cursorline
"set mouse=a
set ai
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#***********************************************************")
call setline(4,"#Author: Jibill Chen")
call setline(5,"#QQ: **********")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: http://thson.blog.csdn")
call setline(9,"#Description: The test script")
call setline(10,"#**********************************************************")
call setline(11,"")
endif
endfunc
autocmd BufNewFile * normal G
EOF
...
更多推荐
Linux基础_SHELL脚本编程基础
发布评论