Linux shell脚本入门学习

举报
zhxping 发表于 2018/03/16 14:39:07 2018/03/16
【摘要】 Linux shell脚本入门学习 Shell是介于使用者和UNIX/Linux操作系统之核心程序间的一个接口。为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操作造成损害,在内核的周围建了一个外壳(Shell)。用户想shell提出请求,shell解释并将请求传给内核。Shell是一种解释型的程序设计语言,使用广泛的有标准的Bourne shell(sh)、Korn Shell(ks...

 Linux shell脚本入门学习 

Shell是介于使用者和UNIX/Linux操作系统之核心程序间的一个接口。为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操作造成损害,在内核的周围建了一个外壳(Shell)。用户想shell提出请求,shell解释并将请求传给内核。

Shell是一种解释型的程序设计语言,使用广泛的有标准的Bourne shell(sh)、Korn Shell(ksh)、C shell(csh)、Bourne Again Shell(bash)等,查看当前环境所用shell:echo $SHELL


1.综述


1.1 开头 

程序必须以下面的行开始(必须房子在文件的第一行):

#!/bin/sh 

#!/bin/bash

符号#!用来通知系统用何解释器执行此脚本。

当编辑好脚本时,如果要执行该脚本,还必须使其可执行,给脚本添加可执行权限: 

chmod +x filename  运行脚本 filename 或者 ./filename

 

1.2 注释  

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。 


1.3  Linux黑洞

/dev/null是一个虚设的设备,俗称“Linux黑洞”,任何对/dev/null的写入都会成功,但数据会消失的无影无踪,没有任何反馈。所以经常把不想在屏幕上显示的信息全部送到/dev/null中。它还可以用来清空文件的内容:cat /dev/null > filename


 2. 命令

◆Shell脚本调试

sh  -x  filename.sh  可以使用户跟踪脚本的执行,此时shell对脚本中的每条命令是先执行替换然后显示,在执行它。Shell显示脚本中的行时,会在行首添加个加号“+”。

sh  -n  filename.sh   对脚本进行语法检查,但不执行脚本。

sh  -v  filename.sh   在执行脚本之前,按输入的原样打印脚本中的各行,打印一行执行一行。

◆在脚本中使用set开启调试选项:

set  -x  显示由shell执行的命令以及参数

set  -v  显示由shell读入的命令行

set  -n  读取命令但不执行他们,用于语法检查

关闭调试选项:set +x/+v/+n


2.2 用户管理

◆新建用户 useradd UserName 新建用户后,会在/home目录下建立一个以UserName命名的文件夹,用户每次登陆时会自动定位到该文件夹下。

◆为用户添加密码 passwd UserName

◆删除用户  userdel UserName   使用 –p选项可以删除用户目录下的文件及与用户相关联的其他文件。

◆用户身份 whoami

查看登录用户 who  -a 显示所有用户的所有信息

                  -H 显示列标题

◆查看用户的操作   w

◆用户间的切换   su UserName


2.3 目录管理

◆创建目录 mkdir DirecName

◆删除目录 rmdir DirecName

◆显示工作目录   pwd

◆显示目录内容   ls  -a 显示当前目录下的所有文件,包括以.开头的文件

                   -l 以长列表的形式显示文件列表

◆改变当前目录   cd  .. 进入上一级目录

               cd  /  进入根目录

               cd  /home 进入系统的home目录

               cd  home  进入当前目录下的home目录

◆目录重命名    mv  SourceDirecName  TargetDirecName

◆目录拷贝  cp  SourceDirec TargetDirecName

          cp  -r 拷贝目录下的文件、子目录以及子目录下的文件


2.4 文件管理

◆新建文件  FileName 或 touch FileName 或 vi FileName

◆删除文件  rm  [选项]  FileName 

选项: -i  系统提示是否真要删除该文件

       -f   删除文件之前不提示任何确认信息

       -r   递归删除目录下所有子目录的内容

◆文件链接  ln –s SourceFile TargetFile 

创建文件链接,用ls –l 查看,会看到TargetFile –> SourceFile

◆显示文件内容

more FileName 一次一屏的显示文件的内容,空格或回车显示下一屏

cat FileName   一次全部显示文件的内容

          cat file1 file2>file3 将file1、file2的内容写到file3,覆盖file3原内容

          cat file1>>file2  将file1的内容追加到file2,file2原内容不变

head  -n  FileName 只显示文件的前n行

tail   -n  FileName  只显示文件的后n行

nl  FileName 以编号的形式一次全部显示文件的内容,忽略空格

◆文件移动/重命名 mv SourceFile TargetFile 将一个或者多个文件移动到另一个目录下,或者将一个文件重命名为另一个文件

◆文件查找

find [路径] [选项]  如:find  /  -name  name

◆文件内容查找

grep  name  FileName

◆文件类型

命令ls –l 以长列表显示文件类型 

前缀    类型

-     普通文件

d        目录

l        链接文件

p        命名管道文件

s        本地套接口

b        块设备文件

◆文件访问权限

r :可读    w:可写   x:可执行

一个文件由1个类型和9个权限位来描述

-rwxrw-r-x   第一个位置表示文件的类型,第2、3、4位置表示文件属主的权限,第5、6、7位置表示文件属组的权限,第8、9、10位置表示其他用户的权限,a表示all以上三种人。

◆改变文件/目录的权限

chmod [u/g/o/a] [+/-/=] [权限] FileName/DirecName

其中:+ 增加制定的权限   -  去掉指定的权限  = 清除所选的权限并设置成指定的权限

chmod 允许使用八进制符号作为模式,改变权限,r的八进制表示为4,w八进制为2,x八进制为1,则-rwxrw-r-x可表示为 4+2+1=7(属主u的权限)4+2=6(属组的权限)4+1=5(其他用户的权限),授权可以表示为chmod 765 FileName/DirecName

改变文件属主  chown Owner FileName/DirecName

改变文件属组  chgrp  Group FileName/DirecName

改变文件属主和属组  chown owner:group FileName/DirecName


3.变量

◆变量可以定制用户本身的工作环境,使用变量可以保存有用信息,是系统获知相关设置,也用于保存暂时信息。变量一般都用大写字母表示,使用echo命令可以显示单个变量的取值,要在变量名面前加$。

◆设置变量时,如果不想再改变其值,可以再变量名前加readonly。

使用set命令可以显示所有本地定义的shell变量。

使用unset 变量名 可以清除对变量的定义。


3.1 变量分类

 ◆本地变量:用户自定义变量。

 ◆环境变量:用于所有用户变量,用于用户进程前,必须用export命令导出。

◆位置参数变量:是一组特殊的内置变量,跟在脚本名后面的用空格隔开的每个字符串,$1表示第一个参数值,$2表示第二个参数值。它的用途是从shell命令/脚本的命令行接受参数,在调用shell函数时为其传递参数。

◆命令行参数相关

   $*    将所有位置变量组成一个字符串(以空格隔开)

   $@   将每个位置变量看成单独的字符串,每个字符串用空格隔开

   $0    命令行里脚本名

   $#    命令行上参数的个数

◆进程状态相关

   $?    上条命令执行后的返回值 0:成功  1-255:不成功

   $$    当前进程的进程号

   $!     显示运行在后台的最后一个作业的PID

   $_     在此之前执行的命令或脚本的最后一个参数

◆exit 用于退出脚本或者当前shell

  exit  n  n为0时表示成功退出,非零表示遇到某种失败,返回值被保存在状态变量$?中。


3.2 变量表达式

◆test表达式,条件测试可以根据某个特定条件是否满足,来选择执行相应的任务。任何一种测试中,都要有退出状态(返回值),退出状态为0表示命令成功或者表达式为真,非0则表示失败或表达式为假,态变量$?中保存命令退出状态的值。

通常用test命令来测试表达式的值,同时也可以用方括号来代替。

◆字符串测试

=  比较两个字符串是否相同,同则为“是”!= 比较两个字符串是否相同,不同则为“是”; 

-n 比较字符串长度是否大于零,如果大于零则为“是” ; 

-z 比较字符串的穿度是否等于零,如果等于则为“是”。

如 [ -z str ] 如果字符串str长度为0,返回真    记住方括号操作符两边都要留空格。

◆整数测试

-eq 相等 -ge 大于等于   -le 小于等于  

-ne 不等于    -gt 大于   -lt 小于

如 [ int1 –eq int2 ]  nt1等于int2   记住方括号操作符两边都要留空格。

整数测试也可以使用let命令或者双圆括,相应操作符为:==、!=、>、>=、<、<=。

如x=1;let “$x == 1”; echo $?

  x=1;(($x+1>+2)); echo $?

let命令或者双圆括号可以使用算术表达式,而方括号不能。

◆逻辑测试

! 反:与一个逻辑值相反的逻辑值  

-a 与(and):两个逻辑值为“是”返回值才为“是”,反之为“否”  

-o 或(or):两个逻辑值有一个为“是”,返回值就为“是”

如 [ expr1 –a expr2 ] 都为真时,结果为真  记住方括号操作符两边都要留空格。

◆文件测试

文件测试表达式通常是为了测试文件的信息,一般由脚本来决定文件是否应该备份、复制或删除。man test 可以查看更多文件测试符。

-d 对象存在且为目录返回值为“是”  

-f 对象存在且为文件返回值为“是”  

-L 对象存在且为符号连接返回值为“是”  

-r 对象存在且可读则返回值为“是”  

-s 对象存在且长度非零则返回值为“是”  

-w 对象存在且可写则返回值为“是”  

-x 对象存在且可执行则返回值为“是”

如 [ -s filename.sh ] 文件长度非零时为真,返回0。

◆检查空值

[ “$name” = “” ]

[ ! “$name” ]

[ “X${name}” != “X” ]


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。