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 代表成功,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 }

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

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

$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

同极相斥,异极相吸

a、b互换

[[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) 定义本地变量

编辑配置文件生效

修改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\][\[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,其中^[是在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\][\[email protected]\h \W]\\$\[\e[0m\]"

HISTTIMEFORMAT="%F %T "

HISTCONTROL=ignoreboth

原文地址:http://blog.51cto.com/13695854/2103721

时间: 2024-10-04 20:35:09

Linux-shell脚本基础的相关文章

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

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

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

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

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

Shell 脚本基础 1.变量 什么是变量 #a=1 # echo $a 1 变量:可以变化的量 1.2变量名称注意事项 变量名不能以数字开头 不能与系统中已有的环境变量重名,尽量不要全部使用大写,尽量不要使用"_"下划线开头 最好做到见名知意 不能使用程序中的保留字,列如if,for等 1.3变量类型 字符型 数值型 整型浮点型 布尔型 条件是和否 #$echo $a 引用 abc 撤销 unset +(变量名)a 1.4变量操作 * 设置变量 * 引用变量 * 撤销变量 单引号和双

Linux shell脚本-基础学习笔记

Linux脚本能力不是太强,最近再补习下,毕竟linux shell在日常工作中还是很普遍的, 用起来更方便.省时省力. 以下是学习笔记,偏理论,后面有几个例子,供参考. shell脚本组成元素系统命令.文本处理工具(grep\sed等).变量.条件判断.循环结构和函数 -------------------------------------------- 三剑客:grep,sed,awk,还有wc,sort,head等 ------------------------------------

《Linux Shell脚本攻略》 笔记 第一章:Shell起步基础

<Linux Shell脚本攻略> 笔记 第一章:Shell起步基础 1.变量:在bash中,每一个变量的值都是字符串.无论你给变量赋值时,有没有使用引号,值都会以字符串的形式存储. 2.var=value; //赋值操作 var = value: //相等操作 3.获取字符串的长度 [[email protected] ~]$ var=yang [[email protected] ~]$ length=${#var} [[email protected] ~]$ echo $length

Linux运维之道之ENGINEER1.4(shell脚本基础)

ENGINEER1.4 SHELL脚本基础 认识shell环境 bash shell的使用方式 交互式: --人工干预,智能化程度高 --逐条解释执行,效率低 非交互式: --需要提前设计,智能化难度大: --批量执行,效率高: --方便在后台及悄悄地执行: 什么是shell脚本:提前设计可执行语句,用来完成特定任务的文件 --解释型程序 --顺序,批量执行 规范shell脚本的一般组成: #!环境声明 #注释文本 可执行代码 ----------------------------------

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

老李分享:《Linux Shell脚本攻略》 要点(一)

老李分享:<Linux Shell脚本攻略> 要点(一) 第一章:Shell起步基础 1.变量:在bash中,每一个变量的值都是字符串.无论你给变量赋值时,有没有使用引号,值都会以字符串的形式存储. 2.var=value; //赋值操作 var = value: //相等操作 3.获取字符串的长度 [[email protected] ~]$ var=yang [[email protected] ~]$ length=${#var} [[email protected] ~]$ echo

Linux Shell脚本例子

Shell脚本是我们运维人员管理的最基础知识,下面就是我在学习过程中的一些小例子(比起大牛来说).写这篇博客的目的,是为了记录自己学习脚本的历程,也是为了能和读者一起探讨学习. # Example1: 自动创建脚本的模板 脚本名:creat_scripts.sh  # 功能描述:creat_scripts.sh SCRIPTS_NAME 如果创建的脚本名文件不存在,则创建成脚本文件; # 如果对应的文件存在,且为脚本文件,则打开文件到最后一行: # 如果对应的文件存在,但不是脚本文件,则提示退出

Linux shell入门基础(六)

六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行的角色是不一样的: #shell scripts(UNIX Like系统的原则有一条:程序越短越好) #bash csh tcsh ksh #which startx(查看文件的路径) /usr/X11R6/bin/startx #vi `which startx` #!/bin/sh …… #vi