本章内容

编程基础

脚本基本格式

变量

运算

条件测试

配置用户环境

编程基础

程序:指令+数据

程序编程风格:

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

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

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

linux 修改sh文件生效,Linux-shell脚本基础相关推荐

  1. linux启动sh文件命令,Linux 运行 .sh 文件的两种方法

    Linux 运行 .sh 文件的两种方法 文章作者:网友投稿 发布时间:2010-06-15 13:31:16 来源:网络 一个中等水平的Linux用户一定少不了经常执行.sh文件,当然了,你可以在图 ...

  2. linux启动sh文件命令,Linux下如何写 .sh 脚本启动 项目

    Linux下如何写 .sh 脚本启动 项目 创建文件   mealcoupon.sh 内容如下: #!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=xhqy_ ...

  3. linux修改dns不生效,Linux 临时修改和永久修改DNS的方法

    Linux 临时修改和永久修改DNS的方法 sunpma • 2019 年 09 月 15 日 修改DNS配置 查看当前DNS配置:cat /etc/resolv.conf 方法一(临时修改,重启失效 ...

  4. linux修改key文件夹,linux 中如何根据xml文件的key来修改value呢?

    源自:4-4 Linux中 grep命令 linux 中如何根据xml文件的key来修改value呢? 有个xml文件(server.xml)比如: .... 请问该如何获取加粗的   style=& ...

  5. linux修改jdk文件保存,Linux下更换jdk和配置环境变量详解

    不需要删除旧的jdk,安装新版本的jdk,再更新环境变量即可. Linux下安装jdk,步骤如下 1:下载jdk包:本章使用的为后缀为tar.gz的文件(不需要安装),如jdk-8u111-linux ...

  6. linux修改程序文件内容,linux 批量修改文件内容

    如果有批量修改文件内容的需求,可参考下面这些方法 1.批量查找某个目下文件的包含的内容,例如: #   grep -rn或l "要找查找的文本"  路径或文件 rn表示匹配查找字符 ...

  7. linux用if语句编程序,Shell 脚本基础 - 使用 if 语句进行条件检测

    Bourne Shell 的 if 语句和大部分编程语言一样 - 检测条件是否真实,如果条件为真,shell 会执行这个 if 语句指定的代码块,如果条件为假,shell 就会跳过 if 代码块,继续 ...

  8. Linux shell脚本基础学习

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

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

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

最新文章

  1. 与aspect长得像的单词_长相差不多的单词,你能一眼识别吗?
  2. 巧妙设置yum软件库轻松解决软件包安装问题
  3. Kotlin 系列(二) 基本语法(1)
  4. why process type for MyOpportunity creation is empty
  5. Redis(六):Set集合数据类型详解
  6. java insert_java获取新insert数据自增id的实现方法
  7. Spring Security Oauth2 (四) 密码码模式 代码
  8. 从短信类到短信平台之设计篇
  9. svm 文本分类 matlab,livsvm文本分类总结详解
  10. mybatis中的动态Sql略解,基础理解,为什么要使用动态sql,动态sql相比于传统sql的区别;仅作笔记,如有错误请及时指出
  11. cad命令栏还原默认_CAD命令行不见了怎么重新恢复?
  12. ps读写ddr3里面的数据 zynq_DDR3读写数据调试
  13. 项目中遇到的问题(一)弹出UIAlertController 时出现 Warning: Attempt to present * on * which is already presenting
  14. Flask 视图的高级技术
  15. EPLAN的USB加密狗驱动程序将于2023年5月23日停止维护更新?
  16. Linux环境下metis与mt-metis的安装和使用
  17. ssl证书怎么购买?买多少钱的ssl证书合适?
  18. consul注册报错 connectex: No connection could be made because the target machine actively refused it.
  19. 三大运营商体验好又省钱方案
  20. WebService客户端三种调用方式整理

热门文章

  1. 通过 WMI 从 Linux 获取 Windows 信息/尝试运行程序
  2. UI组件之AdapterView及其子类(一)三种Adapter适配器填充ListView
  3. 华为服务器装红帽7系统教程,安装红帽linux7的步骤
  4. RISC-V 中开发 Java 是一种什么体验? 让 Dragonwell JDK 来回答
  5. 决策支持系主要包含内容
  6. 大学计算机打算及目的,计算机专业大学生毕业实习目的
  7. 脉诊在现代医学中的应用与局限性
  8. 基于python-实训基地管理系统-django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署
  9. xamarin android gps,如何使用Xamarin在Android中同步获取GPS位置更新?
  10. 盛大:一个游戏公司的剧烈转型