shell笔记



1、实现一个shell脚本,添加一个名为zhangsan的用户;将用户zhangsan的口令设置为123456

addUser.sh:

#!/bin/bash

#2013-11-26 by cahijq

echo”add a user”

useradd zhangsan

echo”add password”

echo 123456|passwd --stdin zhangsan

echo “ add successful’

2、运行一个shell脚本的方法:

方法一:chmod +x uad.sh   添加执行权限

       ./uad.sh  打开一个子shell,读取并且执行uad.sh里面的命令。

方法二:sh  uad.sh 以指定的bashshell来执行脚本。文件不必有执行权限。脚本也是在子shell中执行。

方法三: source  uad.sh等同于. uad.sh 以环境默认的shell来执行脚本。文件不必有执行权限

3、Shell重点知识

(1)管道:“|”:将一个命令的输出结果当作另一个命令的输入参数

(2)find ,ps,grep,uname,env,who ,wc

(3)重定向:改变执行命令的默认输出和默认输入。

类型

操作符

用途

重定向输入

从指定文件输入数据,而不是从键盘。

重定向输出

>,>>

将输出结果覆盖,追加到指定文件,而不是控制台。

标准错误输出

2>,2>>

将错误信息追加,覆盖到指定文件。

混合输出

&>,&>>

将输出和错误信息都重定向到指定文件,覆盖,追加文件。

(4)逻辑分割:

 处理多条命令之间的逻辑关系:

逻辑与:&& 两个命令都要执行成功,才算成功。若第一条命令执行失败,则必定失败,第二条命令就不会执行。

逻辑或:||两个命令有一个执行成功,就算成功。所以若第一条命令执行成功,则就算成功。

顺序执行:;

4.shell变量

变量定义和赋值:变量名=变量值

引用变量:${}或者$。

“”:可以使用引用和转义

‘’:不可以使用引用和转义

` `或者$():以命令输出和代替。

常见的环境变量

系统赋值:USER,LOGNAME,HOME,SHELL……

用户操作:PATH,LANG,CLASSPATH……

由系统或脚本操控,不可直接赋值

$?:前一条命令的状态值,0为正常、非0异常

$0:脚本自身的程序名

$1-$9:第一-第九个参数位置

$*:命令行的所有位置参数的内容

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

5、shell数值运算

(1)整数运算

 使用expr命令,计算表达式

     格式:expr 数值1 操作符 数值2

使用$[]表达式,算式替换

     格式:$[数值1  操作符 数值2]

操作符 *号不能直接用,因为*在shell环境中是通配符所以要转义\*。Shel环境是指shell参数或者shell脚本的内容编写环境。

(2)运算技巧

  递更技巧:let 变量名++;let 变量名—

随机数变量:random;范围 0—327672^15 -1

生成数字序列:seq 首数,尾数 seq 首数,增量,尾数

echo  “scale=4; 10/3”|bc          scale=4是约束小数位数。

6.shell变量类型

6、shell字符串操作

(1)字符串截取

路径分割: dirname:截取路径名;basename:截取文件名

expr命令:expr   substr   $变量名   起始位置    截取长度(起始位置从1开始算)

使用${}: ${变量名:起始位置,截取长度}(起始位置从0开始)

(2)字符串替换

${变量名/i/j}把字符串中的第一个i替换成j

${变量名//i/j}把字符串里面的所有i替换成j

(3)获得随机字符串

head  -1 /dev/urandom |md5sum|cut –b -8

  原理:/dev/urandom里面会有随机字符,但是有可能我们不能识别里面的字符,md5sum可以根据ascii 码生成相应字符的校验和,cut命令截取校验和的一部分。

7、shell条件测试

条件测试格式:

[  条件表达式]  或者test  条件表达式

测试操作的练习方法:

可以在上面两种格式的任一种格式后面加&& echo yes

文件状态的检测:

-e          文件是否存在

-d          是否是目录

-f          是否是文件

-r          是否有读取权限

-w         是否有写入权限

-x          是否有执行权限

整数值比较和字符串的匹配

-eq       是否相等

-ne       是否不相等

-gt        是否大于

-lt         是否小于

-ge       是否大于等于

-le        是否小于等于

=    两个字符串是否相等

!=   两个字符串是否不相等

8.shell if判断结构

(1)程序流的控制

     for

    if 用于条件判断逻辑控制

    case 用于值判断逻辑控制

(2)单分支/双分支的if应用

单分支if应用示例

     检查备份目录/opt/mrepo,若不存在则创建

    chkdir.sh

    #!/bin/bash

    BACKUP_DIR=”/opt/mrepo/”

if [! –d $BACKUP_DIR]

then

mkdir –p $BACKUP_DIR

fi

双分支应用示例

     判断目标主机是否存活,显示检测结果

    chkhost.sh

    #! /bin/bash

ping –c 3 –I 02 –w 3 $1 &> /dev/null

if [$?  -eq 0]

then 

echo  “Host  $1  isup.”

else

    echo  “Host $1  is down.”

fi

(3)多分支的if应用

     if   条件测试1

     then  命令序列1

elif 条件测试2

   then 命令序列2

else 命令序列3

fi

多分支if应用示例

   判断机试分数,区分优秀/合格/不合格

gradediv.sh

#!/bin/bash

read  –p  “请输入您的分数(0-100):”GRADE

if [$GRADE -ge  85]  && [$GRADE –le 100];

then “$GRADE  分!优秀”

elif [$GRADE  -ge  70] && [$GRADE –LE  84];

then  echo   “$GRADE 分、合格”

else  echo “$GRADE 分?不合格”

fi

9.shell for循环

for 变量名in 取值列表

do

命令序列

done

10. shell case 分支

 #!/bin/bash

case “$1” in

start)

sleep  3600 &

stop)

pkill –x ‘sleep’

*)

echo “用法  $0 |start|stop|”

esac

chkconfig 处理

   在脚本开头设置chkconfig参数

添加为系统服务

#! /bin/bash

# chkconfig -90(启动进程的顺序位) 10(结束进程的顺序位)

# description Daemon script for  sleepd Server

必须放在 etc/init.d目录下

执行这个脚本 chkconfig –add sleepd

hitkey.sh

#! /bin/bash

read –p “请输入一个字符,并按Enter”

case “$KEY”in

[a-z]|[A-Z])

echo   “字母”

[0-9])

  echo   “数字”

*)

  echo   “other”

esac

(11)awk文本处理工具和sed文本处理工具

vi命令只能用于人工编辑文本,若在shell中实现自动编辑文本,就不行了。

awk不能直接去修改文本,sed能直接修改文本。

awk命令格式

 awk   ‘模式{操作} ’    file1 file2

常见内建变量

NR   当前处理行的序数

FS    字段分隔,缺省为空格或Tab位

$n    当前行的第n个字段

$0    当前行的所有文本内容

打印输出1-3文本

awk  ‘NR==1,NR==3{print}’   file.txt

打印输出第一行和第三行

awk  ‘(NR==1)||(NR==3){print}’  file.txt

输出奇数行

awk  ‘(NR%2)==1{print}’  file.txt

输出偶数行

awk  ‘(NR%2)==1{print}’  file.txt

使用正则表达式

输出所有包含a的行

awk  ‘/a/{print}’   file.txt

输出以a结尾的行

awk  ‘/a$/’{print}’  file.txt

输出2-3行的第一列和第三列

awk ‘NR==2,NR==3{print $1,$3}’   file.txt

以.为分隔符且第五个字段是chai的行的所有列

awk   –F.    ‘$5==”chai”{print $0}’  file.txt

sed命令格式

显示操作后文件中的全部文本

sed   ‘编辑指令’    file1 file2……..

只显示想要显示的文本

sed  -n ‘编辑指令’    file1 file2……..

替换文件中的文本内容,并且把替换后的文本显示出来。

sed   -i   ‘编辑指令’    file1 file2……..

编辑指令写法:

格式:‘地址1,地址2操作类型’

多条指令之间以分号隔开

最常用的操作类型

p     输出/打印文本行

n     取下一行文本(跳过当前行)

d     删除

s     字符串替换

a     追加新的文本

示例:

输出3-5行

sed -n  ‘3,5p’  /etc/hosts

输出第三行和第五行

sed -n  ‘3p;5p’ /etc/hosts

输出奇数行

sed -n  ‘p;n’ file.txt

输出偶数行

sed -n  ‘n;p’ file.txt

使用正则表达式

输出从第一个包含a的行到最后一行的文本($为最后一行的意思)

sed –n ‘/a/,$p’ file.txt

输出包含单词This的行(linux下一个字符串前后有空格或者标点符号则判定其为单词)

sed –n ‘/\<This\>/p’ file.txt

删除第二行和第三行

sed  ‘2,3d’   file.txt

删除不包含字符a的行

sed  ‘/ne/!d’  file.txt

替换第3-4行内的a为b(g是global的意思,若不加则只替换一行的第一个a)

sed   ‘3,4s/a/b/g’    file.txt

在1-2行的行首插入#

sed  ‘1,2s/^/#/g’  file.txt

删除字符串ab

sed  ‘s/ter//g’  file.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值