本章内容

编程基础

脚本基本格式

变量

运算

条件测试

配置用户环境

编程基础

程序:指令+数据

程序编程风格:

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

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

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: cs364281871@126.com

# 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, $*, $@, $#,$$

局部变量

变量赋值: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: 命令本身

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

$@: 传递给脚本的所有参数,每个参数为独立字符串

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

$@ $* 只在被双引号包起来的时候才会有差异

set -- 清空所有位置变量

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

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

退出状态

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

•0 代表成功,1-255代表失败

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

例如:

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有内建的随机数生成器:$RANDOM(0-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是否新于FILE2(mtime)

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.sh和login.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 TIMEOUT为N秒

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

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

read -p “Enter a filename: “ FILE

()小括号用法:

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

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

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

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

{ name=qjy;echo $qjy }

[root@centos7 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不变,局部变量可继承,执行完后不影响环境

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

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

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

数字运算:

help let

输出不同颜色的color字符

[root@centos7 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

同极相斥,异极相吸

a、b互换

[root@centos7 bin]#a=4

[root@centos7 bin]#b=6

[root@centos7 bin]#a=$[a^b];b=$[a^b];a=$[a^b]

[root@centos7 bin]#echo $a $b

6 4

declare -i x   声明x为数值

[root@centos7 bin]#declare -i x=10

[root@centos7 bin]#declare -i y=20

[root@centos7 bin]#declare -i z=x+y

[root@centos7 bin]#echo $z

30

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

[root@centos7 bin]#[ -w /etc/shadow ] && echo true || echo false

true

[root@centos7 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 =~ ^.+@[[: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) 定义本地变量

编辑配置文件生效

修改profile和bashrc文件后需生效

两种方法:

1重新启动shell进程

2 . 或source

例:

. ~/.bashrc

Bash 退出任务

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

在退出登录shell时运行

用于

•创建自动备份

•清除临时文件

$-变量

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 个历史命令

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\][\u@\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,其中^[是在vim中Ctrl+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\][\u@\h \W]\\$\[\e[0m\]"

HISTTIMEFORMAT="%F %T "

HISTCONTROL=ignoreboth

转载于:https://blog.51cto.com/13695854/2103721

Linux-shell脚本基础相关推荐

  1. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  2. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  3. Linux shell脚本基础学习详细介绍(完整版)2

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  4. Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  5. 详细介绍Linux shell脚本基础学习(一)

    2019独角兽企业重金招聘Python工程师标准>>> Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础 ...

  6. linux脚本变量运算符,linux——Shell 脚本基础篇(变量类型,变量操作,定义,运算与逻辑关系)...

    Shell 脚本基础 1.变量 什么是变量 #a=1 # echo $a 1 变量:可以变化的量 1.2变量名称注意事项 变量名不能以数字开头 不能与系统中已有的环境变量重名,尽量不要全部使用大写,尽 ...

  7. Linux Shell 脚本基础

    1 export 命令 export 不接参数,则把当前系统的环境变量给显示出来 export 接参数,则把此变量作为环境变量,使得父进程的变量,子进程可以沿用,而无需重复设置. 2 read变量键盘 ...

  8. Shell 脚本基础学习 (四)

    现在我们来讨论编写一个脚本的一般步骤.任何优秀的脚本都应该具有帮助和输入参数.并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意.这时候,在写一 ...

  9. 详细介绍Linux shell脚本系列基础学习(列表)

    本系列适合Linux初学者,属于Linux入门级教程,主要介绍了Shell的分类.语法格式以及脚本的使用和编写格式等. 不断更新中,是Shell学习的必读经典教程.现主要包含以下文章: Linux S ...

  10. Linux Shell脚本编程基础

    2 Linux Shell脚本编程基础 发表于: Linux, Shell, UNIX, 资源分享 | 作者: 谋万世全局者 标签: Linux,Shell,编程基础,脚本 本文作者:Leal 授权许 ...

最新文章

  1. C语言编码小球斜抛运动,利用C4droid绘制小球斜抛运动轨迹(考虑空气阻力)
  2. openocd for windows
  3. 螺旋方阵 | 蛇形填数
  4. 我要偷偷学习C#,然后学习GIS二次开发之试题汇总(附答案)
  5. CSS每日学习笔记(1)
  6. pop python3_python3 -- 堆(heapq)
  7. 图标代码_通过两行代码即可调整苹果电脑 Launchpad 图标大小!
  8. 杀破狼java_终于把《杀破狼》看完了
  9. 毕设题目:Matlab瑕疵检测
  10. QQ音乐API分析之-加密参数分析(sign计算)
  11. PDF转换成word转换器绿色版
  12. mysql执行后缀.sql_MySQL命令执行sql文件的两种方法
  13. LC - P03 机器人大冒险
  14. 在计算机中移动硬盘一般用作什么,移动硬盘是什么
  15. 剑指Offe面试题:用两个栈实现队列
  16. 企业抖音蓝V怎么认证?申请流程是怎样的?需要具备哪些条件?
  17. 【20220207】【信号处理】三次样条插值原理详解
  18. 算法之BTree(Java版)
  19. Vue + Spring Boot 项目实战(二十一):缓存的应用
  20. 基于改进YOLOv7&OpenCV的行人过马路速度与交通灯实时监测系统(源码&教程)

热门文章

  1. Java集合框架详解
  2. SAP S4HANA1610/Fiori安装过程全记录
  3. 数的三次方根(二分)
  4. python中图片绘制和输出相关库的原理详解
  5. EC智能电池信息读取
  6. 什么是Python中的套接字编程?
  7. 使用开源激光SLAM方案LIO-SAM运行KITTI数据集,如有用,请评论雷锋
  8. 《惢客创业日记》2019.09.02(周一) 把习惯变成闹钟
  9. Wordpress 4.6 任意命令执行漏洞
  10. Fluent保存的h5文件无法用Tecplot打开的问题