有很多方面并未涉及到shell各个方面,示例的文本

shell脚本(一)基础知识,shell脚本基础知识

shell

一、简介

1.作用:与内核进行交互

2.语言类型:解释性语言,给内核解释用

3.脚本中第一行内容:

#!/bin/bash                       这是shell脚本的第一行内容,表示用bash这个解释器去解释下面的内容

#!/bin/sh                            这也可以是shell脚本的第一行内容,表示用sh这个解释器去解释下面的内容

#!/usr/bin/env bash        env表示使用相对路径,自动找bash解释器所在位置。可以解决不同版本的系统bash不一定在/usr/bin/bash这个路径下的问题

4.为了使脚本方便其他人阅读,一般会在开头加上作者、创建时间、邮箱、版本、描述等内容,可以使用以下设置快捷键的方法在脚本中增加这些信息

vim /etc/vimrc

map <F4> ms:call WESTOS()<cr>'s
function WESTOS()
        call append(0,"######################################")
        call append(1,"# Author     :vaon                   #")
        call append(2,"# Create Date:".strftime("%Y-%m-%d")."             #")
        call append(3,"# Email      :[email protected]         #")
        call append(4,"# Version    :1.0                    #")
        call append(5,"# Description:                       #")
        call append(6,"######################################")
        call append(7,"                          ")
        call append(8,"#!/usr/bin/env bash")
endfunction

#map表示影射-->按F4时调用(呼叫)WESTOS函数

#0代表第一行,1第二行...

#黄色部分strftime是一个系统自带的函数,表示显示当前时间   .是分隔符,表示这个函数与其他两段内容互不影响

#下面是设定函数的方法:

    Fucton 函数名()

    内容

    Endfunction

然后创建一个脚本使用F4键就会在脚本最前面自动加上以下内容:

二、基础知识

1.变量的声明${a}b

设定a=1

echo $a 会出现1,

但echo $ab就不会出现1b,因为系统把ab当成一个变量了。

可以echo ${a}b,会出现1b,把作为一个已定义的1

2.转义、弱引用、强引用

1)表示转义

echo ###不会出现结果,但是加上 echo ###就会出现###

2)“”表示弱引用,也可以输出###

3)‘’表示强引用,可以输出###

4)强引用和弱引用的区别

例如 $  !    ``  这些强引用会把他们当作普通内容打印到屏幕上

而弱引用会把他们当成系统变量,执行变量里的内容

还例如在弱引用中`hostname`表示执行hostname命令

而在强引用中表示输出`hostname`这个内容

3.diff、patch

1)diff

【1】.

[[email protected] mnt]# cat file1
abcd
1234
[[email protected] mnt]# cat file2
abcd
[[email protected] mnt]# diff file1 file2
2d1
< 1234
#表示file1删除1234就和file2一样了

【2】.比较目录

diff -r 目录一 目录二

2)打补丁

建立hello文件:

vim hello

westos

建立hello.new文件:

vim hello.new

westos

456

安装自动更新工具包:

yum install patch -y

将hello.new与hello文件比较,多出的内容做成hello.path补丁包:

diff -u hello hello.new > hello.path

用path补丁包去更新hello文件:

patch hello hello.path

查看hello文件,已经被更新成和hello.new一样了:

cat hello

westos

456

注:如果patch后面加上-b参数表示在更新的同时备份原文件为hello.orig

4.grep

首先建立一个文件:

[[email protected] mnt]# vim /mnt/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
test:ROOT:test
test:test:root
test:root:test
test:roottest:test

1)查找包含root子段的行

[[email protected] mnt]# grep root /mnt/passwd
root:x:0:0:root:/root:/bin/bash
test:test:root
test:root:test
test:roottest:test

2)查找包含root子段的行,不区分大小写

[[email protected] mnt]# grep -i root /mnt/passwd
root:x:0:0:root:/root:/bin/bash
test:ROOT:test
test:test:root
test:root:test
test:roottest:test

3)只要root开头的

[[email protected] mnt]# grep -i ^root /mnt/passwd
root:x:0:0:root:/root:/bin/bash

4)只要root结尾的

[[email protected] mnt]# grep -i root$ /mnt/passwd
test:test:root

5)以root开头和结尾的行都不要。-E表示后面两个条件同时筛选,-v表示不要筛选出的行

[[email protected] mnt]# grep -i root /mnt/passwd|grep -i -E "^root|root$" -v
test:ROOT:test
test:root:test
test:roottest:test

6)表示只要包含只有root子段的行,root前后只要有字母都不要,如roottest这行就不要

[[email protected] mnt]# grep -i "<root>" /mnt/passwd|grep -i -E "^root|root$" -v
test:ROOT:test
test:root:test
问题:

查看所有能登陆系统的用户

解答:

[[email protected] mnt]# grep "<bash>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
可见只有root能登陆
7)grep -n 表示显示搜索出的字符串所在行号

[[email protected] mnt]# grep -n hello /mnt/passwd
4:hello

8)gep -n2 表示显示搜索出的行以及它的上面2行和下面2行,并且显示各自在文件中的行号

注:如果-n和2之间有空格则表示除了上面显示的内容还会在每行开头显示出文件名

[[email protected] mnt]# grep -n2 hello /mnt/passwd
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:hello
5-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
6-games:x:12:100:games:/usr/games:/sbin/nologin

9)grep -B2 表示显示搜索出的行以及这行的上两行内容
[[email protected] mnt]# grep -B2 hello /mnt/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
10)grep -A2 表示下两行

[[email protected] mnt]# grep -A2 hello /mnt/passwd
hello
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
11)表示搜索/mnt目录下包含root字符的文件
[[email protected] mnt]# grep -r hello /mnt/
/mnt/passwd:hello

5.cut

用法:cut -d 分隔符 -f 第几列 文件

-c指定字符

-d指定分隔符

-f指定第几列

cut -d : -f 2 /mnt/psswd     #以:为分隔符,显示passwd文件第二列

cut -d : -f 2,7 /mnt/psswd   #,表示第二和第七列,如果是-表示2到第7列

cut -c 3 /mnt/passwd      #显示第三列的字符,不使用分隔符

cut -c 1,3 /mnt/passwd     #显示一和三列的字符,不使用分隔符

题目:

显示eth0网卡的ip

解答:

[[email protected] mnt]# ifconfig eth0|grep "<inet>"|cut -d " " -f 10
172.25.254.1

6.awk

-v表示给变量赋予内容:

[[email protected] mnt]# name=hello
[[email protected] mnt]# awk -F : -v name=$name 'BEGIN {print name} {print $1}END {print "end"}' /mnt/passwd
hello
root
bin
daemon
hello
mail
games
test
test
test
test
end
7.sed

-i      #这个参数表示写入文件

sed ‘s/old/new/g’ passwd       #将passwd文件中的所有old字符替换为new

sed ‘s/old/new/g’ passwd       #将passwd文件中的所有old字符替换为new,并写入passwd文件

sed ‘2,5s/old/new/g’ passwd      #替换2到5行

sed ‘/adm/,/gdm/s/old/new/g’ passwd   #从adm字符一直到gdm字符的内容中将old替换为new

sed -e ‘s/old/new/g’ -e ‘s/old1/new1/g’ passwd   #将old替换为new同时将old1替换为new1

sed 5d passwd    #删除第5行

sed 5p passwd    #复制第5行

sed -n 5p passwd    #只显示第5行

-p    #表示直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作

vim file

s/sbin/westos/g
s/nologin/linux/g

sed -f file passwd

题目:

将httpd服务端口改为8080

解答:

############################
# Author     :vaon                           #
# Create Date:2017-12-16             #
# Email      :[email protected]       #
############################

#!/bin/bash
PORT=`grep ^Listen /etc/httpd/conf/httpd.conf`
sed "s/$PORT/Listen $1/g" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

8.设置变量

1)临时设置(环境级)

在当前环境生效,当前环境关闭,变量失效

先看一个例子:

[[email protected] mnt]# a=1
[[email protected] mnt]# echo $a
1
[[email protected] mnt]# vim test.sh
#!/bin/bash
echo $a
[[email protected] mnt]# sh test.sh 

[[email protected] mnt]#

#由于a=1是在当前使用的shell里面赋的值,当进入脚本执行时,脚本使用的是子shell,这个子shell中并没有设定a=1,所以结果为空

[[email protected] mnt]# export a=1
[[email protected] mnt]# sh test.sh
1

#可以临时设定a=1给所有shell,一旦登出就会失去这个临时设定

2)永久设置

【1】.系统级

对所有用户生效

[[email protected] mnt]# vim /etc/profile

export a=1

[[email protected] mnt]# source /etc/profile

[[email protected] mnt]# logout
Connection to 172.25.254.1 closed.
[[email protected] Desktop]# ssh [email protected]
[email protected]'s password:
Last login: Sat Dec 16 09:12:16 2017 from 172.25.254.10
[[email protected] ~]# cd /mnt/
[[email protected] mnt]# sh test.sh
1

#这样所有shell都可以使用a=1这个变量,登出系统再登陆依然存在a=1

【2】.用户级

只针对配置过的用户生效,其他用户无法使用

vim /root/.bash_profile

export a=1

source /root/.bash_profile

现在a=1只对root用户生效

9.将脚本加到系统命令中去
[[email protected] mnt]# vim /etc/profile

export PATH=$PATH:/mnt

注:这里同样存在系统级或用户级的设置,在这里使用的是系统级设置。如果只允许root可以设置/root/.bash_profile文件

[[email protected] mnt]# source /etc/profile

[[email protected] mnt]# chmod +x test.sh 

然后退出/mnt目录,直接把test.sh脚本当成系统命令去执行,发现也可以:

[[email protected] mnt]# cd
[[email protected] ~]# test.sh
1
10.命令别名

1)使用别名

[[email protected] ~]# vim /etc/bashrc
alias kan='cat'             #表示执行'kan'的时候相当于执行'cat'命令

[[email protected] ~]# source /etc/bashrc

查看别名列表:

[[email protected] ~]# alias

         ...

alias kan='cat'

         ...

执行kan这个单词就相当于执行cat命令

[[email protected] ~]# kan /mnt/test.sh
######################################
# Author     :vaon                   #
# Create Date:2017-12-16             #
# Email      :[email protected]         #
######################################
                          
#!/bin/bash
echo $a
2)删除别名
删除/etc/bashrc中的alias kan='cat'

然后在删除kan信息:

unalias kan

现在查看alias列表,里面已经没有kan的信息了

11.*和@区别

vim test.sh

#!/bin/bash
echo '$1 Is' $1
echo '$2 Is' $2
echo '$3 Is' $3
echo '$* Is' $*
echo '$# Is' $#
echo '[email protected] Is' [email protected]
[[email protected] mnt]# sh test.sh 1 2 3
$1 Is 1                                                   #显示第1个字符
$2 Is 2                                                   #显示第1个字符
$3 Is 3                                                   #显示第1个字符
$* Is 1 2 3                                             #显示所有字符
$# Is 3                                                   #显示最后一个字符
[email protected] Is 1 2 3                                           #显示所有字符
*和@都表示所有内容,但实际上一个是所有内容方到“”里面。而@是每个数据都加引号

$*   “1 2 3”

&@  “1” “2” “3”

12.shell脚本中函数的定义

READ()

{

        echo hello word

}

13.变量对比

1)test

2)[ ]

[[email protected] mnt]# a=1
[[email protected] mnt]# b=1
[[email protected] mnt]# test "$a" == "$b" && echo yes || echo no
yes
[[email protected] mnt]# [ "$a" == "$b" ] && echo yes || echo no
yes
3)[ 条件1 -a 条件2 ] 表示条件1和2都满足
4)[ 条件1 -o 条件2 ] 表示条件1和2任一个满足

5)[ 条件1 -eq 条件2 ]  等于

6)[ 条件1 -ne 条件2 ]  不等于

7)[ 条件1 -gt 条件2 ]  大于

8)[ 条件1 -ge 条件2 ]  大于等于

9)[ 条件1 -lt 条件2 ]  小于

10)[ 条件1 -le 条件2 ]  小于等于

[[email protected] mnt]# [ "$a" -eq "$b" ] && echo yes || echo no
yes

11)[ -n ]   变量内容不为空

12)[ -z ]    变量内容为空

[[email protected] mnt]# a=8
[[email protected] mnt]# [ -n "$a" ] && echo yes || echo no
yes
[[email protected] mnt]# [ -z "$a" ] && echo yes || echo no
no

13)[ -b ]  是否为块设备文件

14)[ -c ]  是否为字符设备文件

[[email protected] mnt]# [ -b /dev/sda ] && echo yes || echo no
yes
[[email protected] mnt]# [ -c /dev/vfio/vfio ] && echo yes || echo no
yes

15)[ -f ]  是否为常规文件

16)[ -S ]  是否为套接字文件

17)[ -L  ]  是否为链接文件

18)[ -d ]  是否为目录

19)[ -e ] 文件是否存在

20)[ -r ]  是否可读

21)[ -w ]  是否可写

22)[ -x ]  是否可执行

18)[ filename1 -nt filename2 ]  如果 filename1 比 filename2 新,则为真

19)[ filename1 -ot filename2 ]  如果 filename1 比 filename2 旧,则为真

[[email protected] mnt]# touch file
[[email protected] mnt]# [ /mnt/check_ip -ot file ] && echo yes || echo no
yes

题目:

显示输入的文件类型

解答:

#!/bin/bash
[ -e $1 ] && (
        [ -f $1 ] && echo "$1 Is File"
        [ -d $1 ] && echo "$1 Is Directory"
        [ -b $1 ] && echo "$1 Is Block File"
        [ -L $1 ] && echo "$1 Is Link"
        [ -S $1 ] && echo "$1 Is Socket"
)
14.四则运算

15.语句

case语句:
并发的去匹配所有条件,所有条件同一时间去配置,效率比if语句高

if语句是逐行去匹配,第一行不匹配再去匹配下一行,效率较低

exit 退出脚本。后面加数字1|0则表示退出后$?的值为1|0

break 退出循环

input:a

Linux正则表达式sed 详述

sed、awk工具可以实现文本替换并且把替换的文本输出到屏幕上
sed和awk都是流式编辑器,是针对文档的行来操作的。sed通常用来替换操作。

示例的文本内容,以下操作根据此文本。
[[email protected] ~]# cat test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

1、打印某一行
sed -n 'n'p filename 单引号内的n是一个数字,表示第几行;p也可以写到引号内;

示例,打印passwd第3-5行;

[[email protected] ~]# sed -n '3,5'p /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

打印所有行

[[email protected] ~]# sed -n '1,$'p /etc/passwd

打印某一行,并且要显示行号,需要和grep一起使用;

[[email protected] ~]# grep -n '.*' test.txt | sed -n '1'p
1:rrt

2、打印包含某个字符串的行

字符串需要用/ /括起来;grep中的特殊符号^ $ . * 同样适用于sed中。
[[email protected] ~]# sed -n '/root/'p /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

打印包含/sbin/nologin的行,/需要进行脱意;
[[email protected] ~]# sed -n '//sbin/nologin/'p passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

打印以d开头的行;打印以in结尾的;打印r与o字母中间有2个任意字符的;打印包含2个o及多个o的行;
[[email protected] ~]# sed -n '/^d/'p test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]# sed -n '/in$/'p test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]# sed -n '/r..o/'p test.txt
rooooot:x:0:0/roooooot:/bin/bash
[[email protected] ~]# sed -n '/ooo*/'p test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash

3、-e可以实现多个行为
[[email protected] ~]# sed -e '1'p -e '/111/'p -n test.txt 
rot:x:0:0:rot:/rot:/bin/bash
11111111111111111111111111111111

可以用-e写多个;-e相当于传送带,先匹配最前面的打印,再匹配后面的打印,所以第一行会打印2次;

[[email protected] ~]# sed -e '/root/p' -e '/bash/p' -n 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash

-e后面也可以用;分号;-n不能写到-e的后面,可以写在-e的前面或最后面;
[[email protected] ~]# sed -e '/root/p;/bash/p' -n 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash

4、删除某行或者多行

‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。

示例,删除第一行;删除1-3行;删除包含root关键词的行;删除第3行到最后一行所有行;
[[email protected] ~]# sed '1'd test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] ~]# sed '1,3'd test.txt 
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] ~]# sed '/root/'d test.txt
rot:x:0:0:rot:/rot:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] ~]# sed '3,$'d test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash

5、替换字符或替换字符串

示例,替换第一行字母r为R;替换1-2行中ot为to;替换所有行中ot为to;
[[email protected] ~]# sed '1s/r/R/g' test.txt 
RRt
[[email protected]ia ~]# sed '1,2s/ot/to/g' test.txt 
rto:x:0:0:rto:/rto:/bin/bash
roto:x:0:0:roto:/roto:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] ~]# sed 's#ot#to#g' test.txt 
rto:x:0:0:rto:/rto:/bin/bash
roto:x:0:0:roto:/roto:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooto:x:0:0/roooooto:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

与vim编辑器里面替换一样的命令格式,s代表替换,g代表全局,不加g的话只替换行的第一个;可以使用# @作为分隔符。

1s代表只替换第一行;1,3s代表第一行到第三行;不加行数的话默认为全部行。

示例,删除文档中所有的数字's/[0-9]//g'  如删除文档中所有的字母's/[a-zA-Z]//g'删除所有的数字和字母's/[0-9a-zA-Z]//g'
[[email protected] ~]# sed 's/[0-9]//g' test.txt 
rot:x:::rot:/rot:/bin/bash
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/sbin:/sbin/nologin
rooooot:x::/roooooot:/bin/bash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

示例,删除文档中所有的字母
[[email protected] ~]# sed 's/[a-z]//g' 1.txt 
::0:0:/://
::11:0::/://
::11:0::/://
::0:0:/://
1111111111111111111111111111111

示例,删除文档中不是英文字母的(数字和特殊符号)
[[email protected] ~]# sed 's/[^a-z]//g' 1.txt 
rotxrotbinbash
operatorxoperatorrootsbinnologin
operatorxoperatorroootsbinnologin
rooootxroooootbinbash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

示例,删除文档中不是数字的(英文字母和特殊符号)

[[email protected] ~]# sed 's/[^0-9]//g' 1.txt 
00
110
110
00
1111111111111111111111111111111

示例,把文档中的小写字母全部替换为大写字母 's/[a-z]/u&/g'
[[email protected] ~]# sed 's/[a-z]/u&/g' 1.txt 
ROT:X:0:0:/ROT:/BIN/BASH
OPERATOR:X:11:0:OPERATOR:/ROOT:/SBIN/NOLOGIN
OPERATOR:X:11:0:OPERATOR:/ROOOT:/SBIN/NOLOGIN
ROOOOT:X:0:0:/ROOOOOT:/BIN/BASH
1111111111111111111111111111111
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

示例,把文档中的大写字母全部替换为小写字母 's/[A-Z]/l&/g'

[[email protected] ~]# sed 's/[A-Z]/l&/g' 1.txt 
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

替换的同时加-n p 打印特定的行;

[[email protected] ~]# sed -n '1s/[a-z]/u&/g'p 1.txt 
ROT:X:0:0:/ROT:/BIN/BASH

6、调换二个字符串的位置
sed -r 's/([^:]+)(:.*:)([^:]+$)/321/'
[^:]非冒号,不是冒号的所有字符
-r, --regexp-extended  在脚本中使用扩展正则表达式; 加r选项的意思为后面不用再加脱意 
( )括号括起来是分段的意思,
321    是代表3调换1,后面的内容调换到前面

示例,aa与ff调换;加-r选项不用加脱意符号;不加-r ( )括号左右都需要加脱意;调换多行用最后一个;
[[email protected] ~]# cat 1.txt 
aa:bb:cc:dd:ee:ff
[[email protected] ~]# sed -r 's/(aa)(.*)(ff)/321/' 1.txt
ff:bb:cc:dd:ee:aa
[[email protected] ~]# sed 's/(aa)(.*)(ff)/321/' 1.txt 
ff:bb:cc:dd:ee:aa
[[email protected] ~]# sed -r 's/([^:]+)(:.*:)([^:]+$)/321/' 1.txt 
ff:bb:cc:dd:ee:aa

示例,rot与/bin/bash进行调换
[[email protected] ~]# grep 'rot' test.txt
rot:x:0:0:rot:/rot:/bin/bash
[[email protected] ~]# grep 'rot' test.txt |sed 's/(rot)(.*)(/bin/bash)/321/'
/bin/bash:x:0:0:rot:/rot:rot
[[email protected] ~]# grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/321/'
sed:-e 表达式 #1,字符 18:“s”的未知选项
[[email protected] ~]# grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/321/'
/bin/bash:x:0:0:rot:/rot:rot

加-r  后()内的/bin/bash 也还需要脱意才可以;

-i 选项    直接替换字符,并且保存原文件里面。使用i选项前,记得备份原文件。

[[email protected] ~]# sed -r -i 's/([^:]+)(:.*:)([^:]+$)/321/' 1.txt 
[[email protected] ~]# cat 1.txt 
ff:bb:cc:dd:ee:aa

在sed命令中引入shell变量

Linux下Shell编程——sed命令基本用法

Unix文本处理工具之sed 

sed 高级用法

sed命令详解与示例

本文永久更新链接地址:

详述 sed、awk工具可以实现文本替换并且把替换的文本输出到屏幕上 sed和awk都是流式编辑器,是针对文档的行来操作的。...

--------------------------------------分割线

本文永久更新链接地址:

awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行。awk比sed更加强大,它能做到sed能做...

鸟哥私房菜shellscript的脚本学习

鸟哥私房菜shell script的脚本学习,为了方便联系,去掉了所有的注释

[[email protected] prac]# cat sh01.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! a n"
exit 0

========================================================

[[email protected] prac]# cat sh02.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

read -p "Please input your firstname : " firstname
read -p "Please input your lastname :" lastname
echo -e "n Your Full name is $firstname $lastname"

========================================================

[[email protected] prac]# cat sh03.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo -e "I will use touch command to create 3 files."
read -p "Please input your filename: " fileuser

filename=${fileuser:-"filename"}

date1=$(date --date='2 days ago' +%Y%m%d)
date2=$(date --date='1 days ago' +%Y%m%d)
date3=$(date +%Y%m%d)

file1=${filename}${date1}
file2=${filename}${date2}
file3=${filename}${date3}

touch "$file1"
touch "$file2"
touch "$file3"

========================================================

[[email protected] prac]# cat sh04.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo -e "Your Should input 2 number, i will cross them ! n"
read -p "first number: " firstnu
read -p "second number: " secnu
total=$(($firstnu*$secnu))

echo -e "n The result of $firstnu X $secnu is ==> $total"

========================================================

[[email protected] prac]# cat sh05.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/~/bin
export PATH

echo -e "Please input a filename,I will check the filename's type and permissions.nn"
read -p "Input a filename :" filename
test -z $filename && echo "You Must input a filename ." && exit 0
test ! -e $filename && echo "The filename '$filename' Do not exist "&& exit 0

test -f $filename && filetype="regular file"
tset -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="perm writable"
test -x $filename && perm="perm executable"

echo "The filename :" $filename is a $filetype
echo "And the permissions are :" $perm

========================================================

[[email protected] prac]# cat sh06.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/~/bin
export PATH

read -p "Please input (y/n):" yn

[ "$yn" == "y" -o "$yn" == "Y" ] && echo "OK,continue" && exit 0

[ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh,interrupt" && exit 0

echo "I don't know what your choice is ." && exit 0

========================================================

[[email protected] prac]# cat sh06-2.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/~/bin
export PATH

read -p "Please input (y/n):" yn

if [ "$yn" == "y" ] || [ "$yn" == "Y" ] ; then
echo "OK,continue"
exit 0
fi

if [ "$yn" == "N"] || [ "$yn" == "n" ] ;then
echo "Oh,interrupt"
exit 0
fi

echo "I don't know what your choice is ." && exit 0

========================================================

[[email protected] prac]# cat sh06-3.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/~/bin
export PATH

read -p "Please input (y/n):" yn

if [ "$yn" == "y" ] || [ "$yn" == "Y" ] ; then
echo "OK,continue"
elif [ "$yn" == "N"] || [ "$yn" == "n" ] ;then
echo "Oh,interrupt"
else
echo "I don't know what your choice is ." && exit 0
fi

========================================================

[[email protected] prac]# cat sh07.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo "The Script name is ==> $0"
echo "Total parameter number is ==> $#"
[ "$#" -lt 2 ] && echo "The number of parameter is less than 2 .stop here."
&& exit 0
echo "Your parameter is ==> '[email protected]'"
echo "The 1st para is ==> $1 "
echo "The 2rd para is ==> $2 "

========================================================

[[email protected] prac]# cat sh08.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '[email protected]'"

shift

echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '[email protected]'"

shift 3

echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '[email protected]'"

========================================================

[[email protected] prac]# cat sh09.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/~/bin
export PATH

if [ "$1" == "hello" ]; then
echo "Hello,how are you? "
elif [ "$1" == "" ]; then
echo "You must input parameters,ex> {$0 someword}"
else
echo "The Only parameter is 'hello',ex>{$0 hello}"
fi

========================================================

[[email protected] prac]# cat sh09-2.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/~/bin
export PATH

case $1 in
"hello")
echo "Hello ,how are you ?"
;;
"")
echo "You must input parameters,ex> {$0 someword}"
;;
*)
echo "Usage $0 {hello}"
;;
esac

========================================================

[[email protected] prac]# cat sh10.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo "Now, I will detect your linux server's service"
echo -e " the WWW,FTP,SSH,and MAIL will be detect "

testing=$(netstat -tuln | grep ":80" )
if [ "$testing" != "" ]; then
echo "WWW is running in your system."
fi

testing=$(netstat -tuln | grep ":22" )
if [ "$testing" != "" ]; then
echo "SSH is running in your system."
fi

testing=$(netstat -tuln | grep ":21" )
if [ "$testing" != "" ]; then
echo "FTP is running in your system."
fi

testing=$(netstat -tuln | grep ":25" )
if [ "$testing" != "" ]; then
echo "MAIl is running in your system."
fi

========================================================

[[email protected] prac]# cat sh11.sh
#!/bin/bash
# Program:
# Tring to calculate your demobilization date at how many days
# later...
# History:
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# 1. 告知使用者这支程序的用途,并且告知应该如何输入日期格式?
echo "This program will try to calculate :"
echo "How many days about your demobilization date..."
read -p "Please input your demobilization date (YYYYMMDD ex>20050401): " date2

# 2. 测试一下,这个输入的内容是否正确?利用正规表示法啰~
date_d=`echo $date2 |grep '[0-9]{8}'`
if [ "$date_d" == "" ]; then
echo "You input the wrong format of date...."
exit 1
fi

# 3. 开始计算日期啰~
declare -i date_dem=`date --date="$date2" +%s`
declare -i date_now=`date +%s`
declare -i date_total_s=$(($date_dem-$date_now))
declare -i date_d=$(($date_total_s/60/60/24))
if [ "$date_total_s" -lt "0" ]; then
echo "You had been demobilization before: " $((-1*$date_d)) " ago"
else
declare -i date_h=$(($(($date_total_s-$date_d*60*60*24))/60/60))
echo "You will be demobilized after $date_d days and $date_h hours."
fi

========================================================

[[email protected] prac]# cat sh12.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo "This program will print your selection !"
read -p "Input your choice: " choice
case $choice in
"one")
echo "Your choice is one"
;;
"two")
echo "your choice is two"
;;
"three")
echo "your choice is three"
;;
*)
echo "usage $0 {one|two |three}"
;;
esac

========================================================

[[email protected] prac]# cat sh12-2.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

function printit(){
echo -n "Your choice is "
}

echo "This program will print your selection !"
case $1 in
"one")
printit; echo $1 | tr 'a-z' 'A-Z'
;;
"two")
printit; echo $1 | tr 'a-z' 'A-Z'
;;
"three")
printit; echo $1 | tr 'a-z' 'A-Z'
;;
*)
echo "usage $0 {one|two |three}"
;;
esac

========================================================

[[email protected] prac]# cat sh12-3.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

function printit(){
echo "Your choice is $1"
}

echo "This program will print your selection !"
case $1 in
"one")
printit 1
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "usage $0 {one|two |three}"
;;
esac

========================================================

[[email protected] prac]# cat sh13.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

while [ "$yn" != "yes" -a "$yn" != "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done

echo "Ok! you input the correct answer."

========================================================

[[email protected] prac]# cat sh13-2.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

until [ "$yn" == "yes" -o "$yn" == "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done

echo "Ok! you input the correct answer."

========================================================

[[email protected] prac]# cat sh14.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

s=0
i=0
while [ $i != 100 ]
do
i=$(($i+1 ))
s=$(($s+$i))
done

echo "The result of 1+2+3......+100="$s

========================================================

[[email protected] prac]# cat sh15.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

for animal in dog cat elephant
do
echo "there are ${animal}s..."
done

========================================================

[[email protected] prac]# cat sh16.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

users=$( cut -d ':' -f1 /etc/passwd)
for username in $users
do
id $username
finger $username
done

========================================================

[[email protected] prac]# cat sh17.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

network="10.6.7"
for sitenum in $(seq 1 100)
do
ping -c 1 -w 1 ${network}.${sitenum} &> /dev/null && result=0 || result=1
if [ "$result" == 0 ]; then
echo "Server ${network}.${sitenum} is up."
else
echo "Server ${network}.${sitenum} is down."
fi
done

========================================================

[[email protected] prac]# cat sh18.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

read -p "Please input a directory:" dir
if [ "$dir" == "" -o ! -d "$dir" ]; then
echo "The $dir is NOT exist in your system."
exit 1
fi

filelist=$(ls $dir)
for filename in $filelist
do
perm=""
test -r "$dir/$filename" && perm="$perm readable"
test -w "$dir/$filename" && perm="$perm writable"
test -x "$dir/$filename" && perm="$perm executable"
echo "The file $dir/$filename's permission is $perm"
done

========================================================

[[email protected] prac]# cat sh19.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

read -p "Please input a number , I will count for 1+2+...your input:" nu

s=0
for (( i=1; i<$nu; i=i+1 ))
do
s=$(($s+$i))
done

echo "The result of 1+2+3+...+$nu="$s

========================================================

鸟哥私房菜shell script的脚本学习,为了方便联系,去掉了所有的注释 [[email protected] prac]# cat sh01.sh #!/bin/bash PATH=/...

1

Linux正则表达式awk讲解

awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行。awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的。awk常用来分段;

awk不用加任何参数就可以实现 + ? * .  | 这些特殊符号;

1、截取文档中的某个段
[[email protected] ~]# head -n2 passwd |awk -F: '{print $1}'
root
bin
[[email protected] ~]# head -n2 passwd |awk -F: '{print $0}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[[email protected] ~]# head -n2 passwd |awk -F: '{print $1,$3,$7}'
root 0 /bin/bash
bin 1 /sbin/nologin

-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。 Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行。

{ }内可以打印多个字段$1,$3,$7 打印第1、3、7段,中间用逗号隔开;

打印分段默认分隔符为空格,可以自定义分隔符,分隔符需要用冒号括起来;也可以OFS定义输出分隔符;
[[email protected] ~]# awk -F: '{print $3,$4}' 1.txt |head -5
0 0
1 1
2 2
3 4
4 7
[[email protected] ~]# awk -F: '{print $3":"$4}' 1.txt |head -5
0:0
1:1
2:2
3:4
4:7
[[email protected] ~]# awk -F: 'OFS="#"{print $3,$4}' 1.txt |head -5
0#0
1#1
2#2
3#4
4#7

[[email protected] ~]# head -n2 passwd |awk -F: '{print $1"#""@"$3"#"$7}'
root#@0#/bin/bash
bin#@1#/sbin/nologin

注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用 { } 括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用“”双引号括起来。

2、匹配字符或字符串
[[email protected] ~]# awk -F: '$1~/me/' passwd 
games:x:12:100:games:/usr/games:/sbin/nologin
[[email protected] ~]# awk -F: '$1~/user/' passwd 
user1:x:600:501::/home/user1:/bin/bash

可以让某个段去匹配,~ 表示匹配的意思,以冒号分隔第一字段然后匹配//里的关键字;

[[email protected] ~]# awk -F: '/root/ {print $1,$3} /user/ {print $1,$3}' passwd 
root 0
operator 11
ftp 14
saslauth 499
user1 600

awk还可以多次匹配,如上例全文匹配包含root关键词的行,再匹配包含user的行,打印所匹配的第1、3段。

3、条件操作符
判断第3个字段为0的
[[email protected] ~]# awk -F: '$3=="0"' passwd 
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]# awk -F: '$3==10' passwd 
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

判断第3个字段为10的并且打印该行的第7字段;

[[email protected] ~]# awk -F: '$3==10 {print $7}' passwd 
/sbin/nologin
[[email protected] ~]# awk -F: '$3=="600"' passwd 
user1:x:600:501::/home/user1:/bin/bash

 

awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,不加双引号则认为是数字。

 

示例,双引号括起来认为是字符;加单引号和不加则认为是数字;
[[email protected] ~]# awk -F: '$3>"500"' passwd | sort -t: -k 3 -n 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
sshd:x:74:74:privilege-separated ssh:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:system message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:nobody:/:/sbin/nologin
user1:x:600:501::/home/user1:/bin/bash

[[email protected] ~]# awk -F: '$3>500' passwd | sort -t: -k 3 -n 
user1:x:600:501::/home/user1:/bin/bash
[[email protected] ~]# awk -F: '$3>'500'' passwd | sort -t: -k 3 -n 
user1:x:600:501::/home/user1:/bin/bash

 

!= 为不匹配,第7字段不等于/sbin/nologin的行,需要用双引号括起来。
[[email protected] ~]# awk -F: '$7!="/sbin/nologin"' passwd 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
user1:x:600:501::/home/user1:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

 

除了针对某一个段的字符进行逻辑比较外,还可以两个段之间进行逻辑比较。

[[email protected] ~]# awk -F: '$3>"5" && $3<"7"' passwd 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
user1:x:600:501::/home/user1:/bin/bash

另外还可以使用 && “并且”和  || “或者” 的意思。
示例,打印第3段大于第4段,并且第7段为/bin/bash的行;
[[email protected] ~]# awk -F: '$3>$4 && $7=="/bin/bash"' passwd 
user1:x:600:501::/home/user1:/bin/bash

示例,打印第3段小于第4段,或者第7段为/bin/bash的行;
[[email protected] ~]# awk -F: '$3<$4 || $7=="/bin/bash"' passwd 
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:ftp user:/var/ftp:/sbin/nologin
user1:x:600:501::/home/user1:/bin/bash
mysql:x:27:27:mysql server:/var/lib/mysql:/bin/bash

4、awk的内置变量

awk常用的变量有:
NF :用分隔符分隔后一共有多少段
NR :行数
{print NR":"NF}    列出行号,以冒号分隔,列出共有多少段;

[[email protected] ~]# head -5 passwd |awk -F: '{print NR":"NF}'
1:7
2:7
3:7
4:7
5:7
[[email protected] ~]# head -5 passwd |awk -F: '{print NF}'
7
7
7
7
7
[[email protected] ~]# head -5 passwd |awk -F: '{print NR}'

[[email protected] ~]# head -5 passwd |awk -F: '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin

NF 表示是多少段,而$NF是最后一段的值, 而NR则是行号。5、awk中的数学运算awk还可以对各个段的值进行数学运算:12 [[email protected] ~]# awk -F: '{(tot=tot+$3)};END {print tot};' passwd 
1720

这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都是可以的。

示例,if判断,如第一段的值为root,打印整行;
[[email protected] ~]# awk -F: '{if ($1=="root") print $0}' passwd 
root:x:0:0:root:/root:/bin/bash

示例,for循环,定义sum变量,i值为第3段的值;求第3段的和;

[[email protected] ~]# sum=0;for i in `awk -F: '{print $3}' passwd`;do sum=$[($sum+$i)];done;echo $sum
1720

应用案例:

--------------------------------------分割线

AWK简介及使用实例

AWK 简介和例子

Shell脚本之AWK文本编辑器语法

正则表达式中AWK的学习和使用

文本数据处理之AWK 图解

如何在Linux中使用awk命令

文本分析工具-awk 

do                                        done

[[email protected] ~]# ./a.sh @

[[email protected] ~]# expr $a * $a              //* 在操作系统中视为特殊字符,屏蔽字符的特殊意义

[[email protected] Packages]# echo $?

[[email protected] /]# echo $?

##read -p "input your name: "  name

hello.sh  ipadd.sh  logmess_clean.sh 

去编辑一个脚本:

root

#!/bin/bash

1000

#!/bin/bash

字符串比较

[[email protected] ~]# echo $str

[[email protected] ~]# expr $a * $a

-L:测试是否为符号链接文件【link】

      [ 字符串1 != 字符串2 ]

    (前面假则执行后面)

 echo "Warning,DISK is full!"

用于跳出当前的循环体,执行循环体后的语句。

[[email protected] Packages]#

[[email protected] shellscripts]# cat a.sh

if

Result=`expr $Result + $1`

      测试文件的状态

55

 

./ script          //必须具有可执行权限

----------. 1 root root 1086 2月  26 22:38 /etc/shadow

 else 命令序列2                    else 启动mysqld服务

[[email protected] ~]# echo $a

 

 fi

文章版权:

esac

                       

-d :测试是否为目录【directory】

echo `expr $1 + $2`             //$1和$2代表了2个位置变量

.........

The sum is: 30

55

[[email protected] ~]# ./a.sh

 then 命令序列1         ==》      then mysqld 服务已运行

  -lt:小于(Lesser Than)

文章版权:

[[email protected] ~]# cat a.sh

      echo "The sum is: $Result"

注:.bash_profile文件支队系统当前用户生效

   -a 或&&:逻辑与,“而且”的意思

[[email protected] /]# [ -e /etc/passwd ]

   格式:[操作符   文件或目录]

1

[[email protected] ~]# export $PATH  //也可以使用export查看环境变量路径

start)

laod)

[[email protected] shellscripts]# cat a.sh

start....

 if [$RATE -gt 80]

 

`` 将命令执行的结果输出给变量

      ;;

[[email protected] /]# ll /etc/shadow

[[email protected] /]# echo $?

 

  如果/boot分区的空间使用超过80%,输出报警信息

YES

      echo "start...."

 !=:字符串内容不相同,!号表示相反的意思

判断vsftp是否在运行。若已运行则输出提示信息,否则重新启动vsftp服务

for循环语句                            for  收件人  in 邮件地址列表

位置变量:

[[email protected] ~]# str=1000   //局部变量

 

adder 22 33

$#  : 命令行中位置参数的个数

awk的额外扩展

echo "hello,world!"            //后面的才是脚本的内容

&& 条件符合要求才会执行后面的动作

环境变量路径:

#env   可以查看到所有全局变量

#c.sh

本文由必威发布于必威-运维,转载请注明出处:有很多方面并未涉及到shell各个方面,示例的文本

相关阅读