Linux-shell脚本基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-shell脚本基础相关的知识,希望对你有一定的参考价值。

技术分享图片

本章内容

编程基础

脚本基本格式

变量

运算

条件测试

配置用户环境

 

编程基础

程序:指令+数据

程序编程风格:

过程式:以指令为中心,数据服务于指令

对象式:以数据为中心,指令服务于数据

shell程序:提供了编程能力,解释执行

 

程序的执行方式

计算机:运行二进制指令

编程语言:

低级:汇编

高级:

编译:高级语言-->编译器-->目标代码

java,C#

解释:高级语言-->解释器-->机器代码

shell, perl, python

 

编程基本概念

编程逻辑处理方式:

顺序执行

循环执行

选择执行

shell编程:过程式、解释执行

编程语言的基本结构:

各种系统命令的组合

数据存储:变量、数组

表达式: a + b

语句:if

 

shell脚本基础

shell脚本:

包含一些命令或声明,并符合一定格式的文本文件

格式要求:首行shebang机制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

shell脚本的用途有:

自动化常用命令

执行系统管理和故障排除

创建简单的应用程序

处理文本或文件

 

创建shell脚本

第一步:使用文本编辑器来创建文本文件

第一行必须包括shell声明序列:#!

#!/bin/bash

添加注释

注释以#开头

第二步:运行脚本

给予执行权限,在命令行上指定脚本的绝对或相对路径

直接运行解释器,将脚本作为解释器程序的参数运行

 

脚本规范

脚本代码开头约定

1、第一行一般为调用使用的语言

2、程序名,避免更改文件名为无法找到正确的文件

3、版本号

4、更改后的时间

5、作者相关信息

6、该程序的作用,及注意事项

7、最后是各版本的更新简要说明

 

脚本的基本结构

脚本的基本结构

#!SHEBANG

CONFIGURATION_VARIABLES

FUNCTION_DEFINITIONS

MAIN_CODE

 

shell脚本示例

#!/bin/bash

# ------------------------------------------

# Filename: hello.sh

# Revision: 1.1

# Date: 2018/04/06

# Author: qjy

# Email: [email protected]

# Website: www.178linux.com/user/761044264

# Description: This is the first script

# ------------------------------------------

# Copyright: 2018 qjy

# License: GPL

echo “hello world”

 

name="cat /etc/fstab"

echo $name        显示成一行

echo "$name"     显示成原来的格式

 

脚本调试

检测脚本中的语法错误

bash -n /path/to/some_script

调试执行

bash -x /path/to/some_script

 

变量

变量:命名的内存空间

数据存储方式:

字符:

数值:整型,浮点型

变量:变量类型

作用:

1、数据存储格式

2、参与的运算

3、表示的数据范围

类型:

字符

数值:整型、浮点型to/some_script

 

强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误

java,c#

弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用

如:bash 不支持浮点数,php

变量命名法则:

1、不能使程序中的保留字:例如if, for

2、只能使用数字、字母及下划线,且不能以数字开头

3、见名知义

4、统一命名规则:驼峰命名法

 

bash中变量的种类

根据变量的生效范围等标准划分下面变量类型:

局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

环境(全局)变量:生效范围为当前shell进程及其子进程

本地变量:生效范围为当前shell进程中某代码片断,通常指函数

位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

特殊变量:$?, $0, $*, [email protected], $#,$$

 

局部变量

变量赋值:name=‘value’

可以使用引用value:

(1) 可以是直接字串; name=root"

(2) 变量引用:name="$USER"

(3) 命令引用:name=`COMMAND` name=$(COMMAND)

变量引用:${name} $name

"":弱引用,其中的变量引用会被替换为变量值

'':强引用,其中的变量引用不会被替换为变量值,而保持原字符串

显示已定义的所有变量:set

删除变量:unset name

 

name1=mage

name2=wang

name3=$name1

name1=zhangsir 变量1改变了,变量3会改变么?

echo $name3=mage 变量3不会变

 

练习

1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小

echo "The host is `hostname`"

echo "The ip is `ifconfig ens33 | grep netmask | tr -s " " | cut -d" " -f3`"

echo "The system is `cat /etc/redhat-release`"

echo "The kernel version is `uname -r` "

echo "The CPU is `lscpu | grep "Model name:" | tr -s " " | cut -d: -f2`"      

echo "The memory is `cat /proc/meminfo | head -n1 | tr -s " " | cut -d " " -f2,3`"

echo "The disk is `lsblk | grep disk | tr -s " " | cut -d" " -f4`"

2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd

cp -a /etc/ /root/etc`date +%F`/

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

userage="`df | grep /dev/sd | tr -s " " % | cut -d % -f5 | sort -nr | head -n1`"

echo $userage

4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

who | egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c | sort -nr

 

环境变量

变量声明、赋值:

export name=VALUE

declare -x name=VALUE

变量引用:$name, ${name}

显示所有环境变量:

env

printenv

export

declare -x

删除变量:

unset name

 

局部变量的工作范围为当前进程,无法传递给父进程和子进程,除非声明为环境变量,export name,父进程的环境变量可以传给子进程,但子进程的环境变量不能传给父进程

pstree -p       显示进程树

 

declare -x等价于export

 

env 显示所有环境变量

 

unset name  删除某变量

 

bash内建的环境变量:

PATH

SHELL

USER

UID

HOME

PWD

SHLVL

LANG

MAIL

HOSTNAME

HISTSIZE

 

什么时候加$?某命令能识别变量就不用加$,不能识别变量就要加$

 

只读和位置变量

只读变量:只能声明,但不能修改和删除

声明只读变量:

readonly name

declare -r name

查看只读变量:

readonly –p

位置变量:在脚本代码中调用通过命令行传递给脚本的参数

$1, $2, ...:对应第1、第2等参数,shift [n]换位置

$0: 命令本身

$*: 传递给脚本的所有参数,全部参数合为一个字符串

[email protected]: 传递给脚本的所有参数,每个参数为独立字符串

$#: 传递给脚本的参数的个数

[email protected] $* 只在被双引号包起来的时候才会有差异

set -- 清空所有位置变量

 

$0:如果是软链接,比如link.sh -> arg.sh$0将是软链接名,可实现不同的功能

 

shift       移动$1,2,3...这些变量,默认向左移1

 

退出状态

进程使用退出状态来报告成功或失败

?0 代表成功,1255代表失败

?$? 变量保存最近的命令退出状态

例如:

ping -c1 -W1 hostdown &> /dev/null

echo $?

 

退出状态码

bash自定义退出状态码

exit [n]:自定义退出状态码

注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字

注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

 

算术运算

bash中的算术运算:help let

+, -, *, /, %取模(取余), **(乘方)

实现算术运算:

(1) let var=算术表达式

(2) var=$[算术表达式]

(3) var=$((算术表达式))

(4) var=$(expr arg1 arg2 arg3 ...)

(5) declare i var = 数值

(6) echo ‘算术表达式’ | bc

乘法符号有些场景中需要转义,如*

bash有内建的随机数生成器:$RANDOM0-32767

echo $[$RANDOM%50] 0-49之间随机数

 

赋值

增强型赋值:

+=, -=, *=, /=, %=

let varOPERvalue

例如:let count+=3

自加3后自赋值

自增,自减:

let var+=1

let var++

let var-=1

let var--

 

练习

1、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

uid1="`cut -d: -f3 /etc/passwd | head -n10 | tail -n1`"

uid2="`cut -d: -f3 /etc/passwd | head -n20 | tail -n1`"

sumid=$[$uid1+$uid2]                                                         

echo $sumid

2、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

[ $# -ne 2 ] && echo "args should be 2" &&exit                                

space1=`egrep "^[[:space:]]*$" $1 | wc -l`

space2=`egrep "^[[:space:]]*$" $2 | wc -l`

echo $[space1+space2]

3、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

countetc=`ls -a /etc/ | wc -l`

countvar=`ls -a /var | wc -l`

countusr=`ls -a /usr | wc -l`

sum=$[countetc+countvar+countusr-6]       #-6是减去三个文件夹里的...目录

echo $sum

 

逻辑运算

true, false

1, 0

与:

1 1 = 1

1 0 = 0

0 1 = 0

0 0 = 0

:

1 1 = 1

1 0 = 1

0 1 = 1

0 0 = 0

非:!

! 1 = 0

! 0 = 1

短路运算

短路与

第一个为0,结果必定为0

第一个为1,第二个必须要参与运算

短路或

第一个为1,结果必定为1

第一个为0,第二个必须要参与运算

异或:^

异或的两个值,相同为假,不同为真

 

条件测试

判断某需求是否满足,需要由测试机制来实现

专用的测试表达式需要由测试命令辅助完成测试过程

评估布尔声明,以便用在条件性执行中

?若真,则返回0

?若假,则返回1

测试命令:

?test EXPRESSION

?[ EXPRESSION ]

?[[ EXPRESSION ]]

注意:EXPRESSION前后必须有空白字符

 

条件性的执行操作符

根据退出状态而定,命令可以有条件地运行

?&& 代表条件性的AND THEN

?|| 代表条件性的OR ELSE

例如:

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

 

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是否设置

数值测试:

-gt 是否大于

-ge 是否大于等于

-eq 是否等于

-ne 是否不等于

-lt 是否小于

-le 是否小于等于

 

bash的字符串测试

字符串测试:

== 是否等于

> ascii码是否大于ascii

< 是否小于

!= 是否不等于

=~ 左侧字符串是否能够被右侧的PATTERN所匹配

注意: 此表达式一般用于[[ ]]中;扩展的正则表达式(不要加双引号,否则会被认为是字符串而不是正则表达式)

-z "STRING 字符串是否为空,空为真,不空为假

-n "STRING 字符串是否不空,不空为真,空为假

注意:用于字符串比较时的用到的操作数都应该使用引号

[[ $- == *i* ]]       双中括号里,==双等号可以匹配*等符号,类似于通配符,但匹配的是字符串

 

练习

1、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

[ $# -lt 1 ] && echo "At lease 1 arg" && exit                                  

egrep "^[[:space:]]*$" $1 | wc -l

2、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

ping -c1 -W1 $1 &> /dev/null

[ $? -eq 0 ] && echo "host can be reached" || echo "host cannot be reached"

3、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满

userage="`df | grep /dev/sd | tr -s " " % | cut -d % -f5 | sort -nr | head -n1`"

[ "$userage" -ge "80" ] && wall disk will be full

userage="`df -i | grep /dev/sd | tr -s " " % | cut -d % -f5 | sort -nr | head -n1`"

[ "$userage" -ge "80" ] && wall disk will be full

 

 

Bash的文件测试

存在性测试

-a FILE:同-e

-e FILE: 文件存在性测试,存在为真,否则为假

存在性及类别测试

-b FILE:是否存在且为块设备文件

-c FILE:是否存在且为字符设备文件

-d FILE:是否存在且为目录文件

-f FILE:是否存在且为普通文件

-h FILE -L FILE:存在且为符号链接文件

-p FILE:是否存在且为命名管道文件

-S FILE:是否存在且为套接字文件

 

Bash的文件权限测试

文件权限测试:

-r FILE:是否存在且可读

-w FILE: 是否存在且可写

-x FILE: 是否存在且可执行

文件特殊权限测试:

-u FILE:是否存在且拥有suid权限

-g FILE:是否存在且拥有sgid权限

-k FILE:是否存在且拥有sticky权限

 

Bash的文件属性测试

文件大小测试:

-s FILE: 是否存在且非空

文件是否打开:

-t fd: fd 文件描述符是否在某终端已经打开

-N FILE:文件自从上一次被读取之后是否被修改过

-O FILE:当前有效用户是否为文件属主

-G FILE:当前有效用户是否为文件属组

 

双目测试:

FILE1 -ef FILE2: FILE1是否是FILE2的硬链接

FILE1 -nt FILE2: FILE1是否新于FILE2mtime

FILE1 -ot FILE2: FILE1是否旧于FILE2

 

Bash的组合测试条件

第一种方式:

COMMAND1 && COMMAND2 并且

COMMAND1 || COMMAND2 或者

! COMMAND

如:[[ -r FILE ]] && [[ -w FILE ]]

第二种方式:

EXPRESSION1 -a EXPRESSION2 并且

EXPRESSION1 -o EXPRESSION2 或者

! EXPRESSION

必须使用测试命令进行

示例:

[ -z “$HOSTNAME” -o $HOSTNAME "==\

"localhost.localdomain" ] && hostname www.magedu.com

[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

 

练习

1、编写脚本/bin/per.sh,判断当前用户对指定参数文件,是否不可读并且不可写

[ $# -ne 1 ] && echo "1 args" && exit

[ -r $1 ] || [ -w $1 ] || { echo "cannot be read or written";exit; }

echo "can be read or written"

2、编写脚本/root/bin/excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件

[ $# -ne 1 ] && echo "1 arg" && exit

[ -e $1 ] || { echo "file is not existed";exit; }                              

[[ $1 =~ ^.+\.sh$ ]] && chmod +x $1 || echo "not a shell script"

3、编写脚本/root/bin/nologin.shlogin.sh,实现禁止和允许普通用户登录系统

login.sh

[ -e /etc/nologin ] || { echo "allow login success";exit; }                    

rm -rf /etc/nologin

echo "allow login success"

nologin.sh

[ -e /etc/nologin ] && echo "forbid login success" && exit

touch /etc/nologin

echo "forbid login success"

 

使用read命令来接受输入

使用read来把输入值分配给一个或多个shell变量

-p 指定要显示的提示

-s 静默输入,一般用于密码

-n N 指定输入的字符长度N

-d ‘字符’ 输入结束符

-t N TIMEOUTN

read 从标准输入中读取值,给每个单词分配一个变量

所有剩余单词都被分配给最后一个变量

read -p “Enter a filename: “ FILE

 

()小括号用法:

小括号里的命令,改变环境是一次性的,如(umask 666;touch /data/f1)

因为加小括号是开了个子shell

 

可以man bash然后搜索()看一下

 

{}大括号不开启子shell,但跟小括号一样是把命令当成一个整体

{ name=qjy;echo $qjy }

 

[[email protected] data]#x=1;echo "pid=$$";(echo "subpid=$$";echo "subx=$x";x=2;echo "subx2=$x");echo x=$x

pid=33937

subpid=33937

subx=1

subx2=2

x=1

结论:小括号的pid不变,局部变量可继承,执行完后不影响环境

不像单开子SHELLpid不一样,局部变量也不会继承

 

$0:如果是软链接,比如link.sh -> arg.sh$0将是软链接名,可实现不同的功能

 

shift       移动$1,2,3...这些变量,默认向左移1

 

数字运算:

 

help let

 

输出不同颜色的color字符

[[email protected] bin]#COLOR=$[RANDOM%7+31];echo -e "\e[1;${COLOR}mcolor\e[0m"

 

 

短路与 &&

短路或 ||

 

0&&0=0

0&&1=0

1&&0=0

1&&1=1

 

cmd1 && cmd2

如果cmd1为假,cmd2不需要执行,反之cmd1为真,需要cmd2执行

 

0||0=0

0||1=1

1||0=1

1||1=1

 

cmd1 || cmd2

如果cmd1为真,cmd2不需要执行,反之cmd1为假,需要cmd2执行

 

XOR 异或

 

0^1=1

0^0=0

1^0=1

1^1=0

 

同极相斥,异极相吸

 

ab互换

[[email protected] bin]#a=4

[[email protected] bin]#b=6

[[email protected] bin]#a=$[a^b];b=$[a^b];a=$[a^b]

[[email protected] bin]#echo $a $b

6 4

 

declare -i x   声明x为数值

[[email protected] bin]#declare -i x=10

[[email protected] bin]#declare -i y=20

[[email protected] bin]#declare -i z=x+y

[[email protected] bin]#echo $z

30

 

[ "$a" = "$b" ]      变量建议加上双引号,避免因为变量值为空时,等号前没有值,出现语法错误

 

[[email protected] bin]#[ -w /etc/shadow ] && echo true || echo false

true

[[email protected] bin]#[ -x /etc/shadow ] && echo true || echo false

false

 

在脚本中如果要实现false || { echo cmd1 ; exit },要用大括号,否则用小括号的话,exit只退出小括号,不退出脚本

 

鸡兔同笼问题

分别read头数和腿数,输出鸡和兔的的只数

read -p "head number: " head

[[ "$head" =~ [0-9]+$ ]] || { echo head is not a number; exit ;  }

read -p "feet number: " feet

[[ "$feet" =~ [0-9]+$ ]] || { echo feet is not a number; exit ;  }

rabbit=$[(feet-head*2)/2]

chook=$[head-rabbit]

( [ "$chook" -lt 0 ] | [ "$rabbit" -lt 0 ] ) && echo "wrong head or feet numbe

r" && exit                                                                    

echo "chook is $chook"

echo "rabbit is $rabbit"

 

思考

1 手机号

[[ $1 =~ ^1[0-9]{10}$ ]] && echo "right" || echo "wrong"

2 邮箱

[[ $1 =~ ^[email protected][[:alnum:]\.]+\.[[:alnum:]]{,6}$ ]] && echo "right" || echo "wrong"

3 QQ

[[ $1 =~ ^[1-9][0-9]{4,9}$ ]]

bash如何展开命令行

把命令行分成单个命令词

展开别名

展开大括号的声明({}

展开波浪符声明(~

命令替换$() ``

再次把命令行分成命令词

展开文件通配(*?[abc]等等)

准备I/0重导向(<>

运行命令

 

防止扩展

反斜线(\)会使随后的字符按原意解释

$ echo Your cost: \$5.00

Your cost: $5.00

加引号来防止扩展

?单引号(')防止所有扩展

?双引号(”)也防止所有扩展,但是以下情况例外:

$(美元符号) 变量扩展

`(反引号) 命令替换

\(反斜线) 禁止单个字符扩展

!(叹号) 历史命令替换

 

批量赋值

read x y z <<< "1 2 3"

 

bash的配置文件

按生效范围划分,存在两类:

全局配置:

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

个人配置:

~/.bash_profile

~/.bashrc

 

bashrc:可以理解为bash run command

 

shell登录两种方式

交互式登录:

(1)直接通过终端输入账号密码登录

(2)使用“su - UserName 切换的用户

执行顺序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登录:

(1)su UserName

(2)图形界面下打开的终端

(3)执行脚本

(4)任何其它的bash实例

执行顺序: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

 

执行顺序可以看配置文件里的具体内容,发现这几个配置文件是顺序调用的

从执行顺序来看,执行脚本不支持别名alias

 

Profile

按功能划分,存在两类:

profile类和bashrc

profile类:为交互式登录的shell提供配置

全局:/etc/profile, /etc/profile.d/*.sh

个人:~/.bash_profile

功用:

(1) 用于定义环境变量

(2) 运行命令或脚本

 

Bashrc

bashrc类:为非交互式和交互式登录的shell提供配置

全局:/etc/bashrc

个人:~/.bashrc

功用:

(1) 定义命令别名和函数

(2) 定义本地变量

 

编辑配置文件生效

修改profilebashrc文件后需生效

两种方法:

1重新启动shell进程

2 . source

:

. ~/.bashrc

 

Bash 退出任务

保存在~/.bash_logout文件中(用户)

在退出登录shell时运行

用于

?创建自动备份

?清除临时文件

 

$-变量

hhashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +hh选项关闭

iinteractive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的。

mmonitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。

Bbraceexpand,大括号扩展

HhistoryH选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令

 

source.表示在本shell中运行,一般的脚本运行方法是在子进程/shell中运行

 

练习

1、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin

答:vim /etc/profile.d/env.sh

然后新加一行 PATH=/usr/local/apache/bin:$PATH

:wq退出后,source /etc/profile.d/env.sh使配置生效

2、用户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)

答:

(1) vim /root/.bash_profile,添加一行:PS1="\[\e[1;31m\][\[email protected]\h \W]\\$\[\e[0m\]",然后:wq

(2) vim /root/.bashrc,如果是CentOS6,添加这两行

cdnet='cd /etc/sysconfig/network-scripts/'

editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'

如果是CentOS7,添加这两行

cdnet='cd /etc/sysconfig/network-scripts/'

editnet='vim /etc/sysconfig/network-scripts/ ifcfg-ens33'

(3) source /root/.bash_profile /root/.bashrc

3、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!

答:m /etc/motd,输入一行^[[1;31mHi,dangerous!^[[0m,其中^[是在vimCtrl+v+[敲出来的,然后:wq保存退出

4、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等

vim /root/.vimrc输入以下内容

set ignorecase

set cursorline

set autoindent

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:                ###")

        call setline(5,"#QQ:                    ##########")

        call setline(6,"#Date:                  ".strftime("%Y-%m-%d"))

        call setline(7,"#FileName             ".expand("%"))

        call setline(8,"#URL:                   http://###############")

        call setline(9,"#Description          The test script")

        call setline(10,"#Copyright (C):        ".strftime("%Y")." All rights reserved")

        call setline(11,"#********************************************************************")

        call setline(12,"")

        endif

endfunc

autocmd BufNewFile * normal G

5、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等

vim设置见第4题。其他的配置,vim /etc/profile.d/reset.sh新建一个reset.sh文件,输入以下信息:

PS1="\[\e[1;36m\][\[email protected]\h \W]\\$\[\e[0m\]"

HISTTIMEFORMAT="%F %T "

HISTCONTROL=ignoreboth


以上是关于Linux-shell脚本基础的主要内容,如果未能解决你的问题,请参考以下文章

Linux-Shell基础(变量,字符串,数组)

linux-shell编程基础

linux-shell scripts 脚本的初步认识

linux-shell脚本编程(进阶)

Linux-Shell脚本编程进阶

Linux-Shell