shell脚本学习

第一行:“#!/bin/bash” 是一行特殊的脚本说明,表示此行以后的语句通过/bin/bash程序来解释执行;

其他以“#”开头的语句表示注释信息

直接通过文件路径“./first.sh”的方式执行脚本 要求文件本身具有x权限,在某些安全系统中可能无法满足此条件。

使用sh xxx.sh:通过/bin/sh来解释脚本

      .xx.sh通过点号来加载脚本

管道与重定位

管道操作:管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入。

eg:输入:grep "/bin/bash$" /etc/passwd 

结果:root:x:0:0:root:/root:/bin/bash

再次输入: grep "/bin/bash$" /etc/passed |awk -F: '{print $1,$7}'

awk -F: 就是以冒号“:”作为分隔 所以 root是第一区域 x是第二区域 print $1 $7就是输出第1区域和第7区域

重定位操作:

重定位输入:将命令中接收输入的途径由默认的键盘改为指定的文件。重定向输入使用“<”操作符

重定位输出:重定位输出指的是将命令的正常输出结果保存到指定的文件中 使用“>”或“>>”操作符号,分别用于覆盖和追加文件

错误重定位:

错误重定位指的是将执行命令过程中出现的错误信息保存到指定的文件,而不是直接显示在屏幕上。错误重定位使用“2>”,其中“2”是指错误文件的编号(在使用标准输出,输入重定位时,省略了1,0编号)

也可以使用“&>”操作符将两类输出信息保存到同一个文件

变量

自定义变量:

查看和引用变量的值:

通过在变量名称前添加前导符号“$”,可以引用一个变量的值。使用echo命令可以查看变量

变量赋值的特殊操作

在等号“=”后边直接指定变量内容是为变量赋值的最基本方法 除此之外还有以下几种方法

双引号“”

主要起界定字符串的作用,特别是要赋值的内容中包括空格时,必须以双引号括起来;其他情况下双引号通常可以省略。

在双引号范围内,使用“$”符号可以引用其他变量的值,从而能够直接调用现有变量的值来赋给新的变量。

root@localhost ~]# Version=6.0
[root@localhost ~]# QQ="QQ $Version"  
[root@localhost ~]# echo $QQ
QQ 6.0

单引号(')

当要赋值的内容中包括“$” “ " ” “ \ ”等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。但赋值内容中包括单引号,需使用‘\’符号进行转义,以免冲突

[root@localhost ~]# QQ="QQ $Version"  
[root@localhost ~]# echo $QQ
QQ $Version

反撇号(`)

反撇号只要是命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围内必须是能够执行的命令行。

[root@localhost ~]# ls -lh `which pwd`   
-rwxr-xr-x. 1 root root 33K 4月  11 2018 /usr/bin/pwd

上述操作相当于连续执行了两条命令--先通过which useradd命令查找出pwd命令的程序位置,然后根据查找结果列出文件属性。最后会用which pwd命令的输出结果替换整个反撇号范围。

注意:使用反撇号难以在一行命令中实现嵌套命令替换操作,这是可以用$()”来代替反撇号操作,以解决嵌套的问题。

read命令:

除了上述赋值操作以外,还可以使用Bash的内置命令read来给变量赋值。read命令用来提示用户输入信息。可以一次读入一行内容,并以空格为分隔符。将读入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个变量)

[root@localhost ~]# read p p1 p2
1 2 3 4 5 6
[root@localhost ~]# echo $p $p2
1 3 4 5 
p2=3 4 5

read命令可以结合“-p”和“-t” 选项来设置提示信息与输入等待时间,以便告知用户应该输入什么内容和规定时间内未输入自动跳出。

设置变量的作用范围

新定义的变量只在当前的shell环境中有效,因此成为局部变量。可以通过内部命令export将指定的变量导出为“全局变量”。可以同时指定多个变量名称作为参数。

数值变量的运算

shell变量的数值多用于脚本程序的过程控制。在Bash Shell环境中,只能进行简单的整数运算 不支持小数运算 整数值的运算主要通过内部命令expr进行 

注意:运算符与变量之间至少有一个空格。

特殊变量:

环境变量:

可以使用env命令可以查看到当前工作环境下的环境变量

变量USER表示用户名称,HOME表示用户的宿主目录 LANG表示语言和字符集 PWD表示当前所在的工作目录 PATH表示命令搜索路径。

若希望能直接通过文件名称来运行脚本,可以修改PATH变量以添加搜索路径 或者将first.sh脚本复制到现有搜索路径中的某个文件夹下

位置变量

当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量

位置变量也称为位置参数 使用 $1 $2.....$9表示 。命令或脚本本身的名称使用“$0”表示 虽然$0与位置变量的格式相同 但是$0属于预定义变量而不是位置变量

 

预定义变量:

预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。

S#:表示命令行中位置参数的个数

$*:表示所有位置参数的内容

$?:表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示为执行出现异常

$0:表示当前执行的脚本或程序的名称

shell编程之条件语句

条件测试

 test 条件表达式 或者 [ 条件表达式 ] 方括号“[”或者“]” 与条件表达式之间需要至少一个空格进行分隔

文件测试

-d :是否为目录
-e: 目录或文件是否存在
-f:测试是否为文件
-r:当前用户是否有权限读取
-w:当前是否有权限写入
-x:是否设置有可执行权限

通过查看变量“$?”变量的值可以判断前一步的条件测试结果。为了更直观地查看测试结果,可以结合命令分隔符“&&”和echo命令一起使用 。

使用[[]]也可以进行测试。

tset命令中用于判断文件的选项有很多,从文件个数上分类的话,可以分为单个文件的判断和两个文件的判断。其中判断单个文件最常用的选项就是“-f”选项,在比较两个文件时,常用的选项有:

-nt:判断文件A是否比文件B新
-ot:判断文件A是否比文件B旧
-ef:判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode

整数值比较
-eq:第一个数等于第二个数
-ne:第一个数不等于二个数
-gt: 大于
-lt:小于
-le:小于或者等于第二个数
-ge: 大于或等于

3.字符串比较

=:第一个字符串与第二个字符串相同
!=:第一个字符串与第二个字符串不相同
-z:检测字符串是否为空 对于未定义或赋予空值的变量将视为空串

eg:[$ACK = "yes"]

逻辑测试
&& :与     ||:或        !:否

if语句 与条件判断式之间一定要加上空格
单分支的if语句:
if 条件测试操作
then
    命令序列
fi

双分支的if语句
if 条件测试操作
then
命令序列1
else
命令序列2
fi

多分支的if语句
if 条件测试操作1
then
  命令语句1
elif 条件测试操作2
then
命令序列2
else
命令序列3
fi

注意:格式 if 与条件测试操作必须有一个空格  [ 判断语句 ] 在[]之中 判断语句必须要有空格 

 

case语句与循环语句

case语句的结构

case 变量值 in
模式1)
  命令序列1
;;
模式2)
命令序列2
;;
....
*)
默认命令序列
esac
case 行尾必须为单词“in”,每一模式必须以右括号“)”结束
双分号 “;;”表示命令序列的结束
模式字符串中,可以用方括号表示一个连续的范围如“[0~9]”;还可以用竖杠符号“|”表示或
最后的“*)”表示默认模式 其中的*相当于通配符
 

使用for语句的结构
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环

for 变量名 in 取值列表
do
    命令序列
done

 

使用while循环语句

while 条件测试操作
do
   命令语句
done

使用while循环语句时 有两个特殊的条件测试操作:即ture(真)和false(假).使用true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(通过exit语句退出脚本)

shell函数应用
shell函数定义的基本格式:
[function] 函数名()
{

命令序列
[return x]

}

其中[function]是可选的 表示该函数的功能  这个可以省略掉的。[return x]的作用是当命令序列执行完后返回给系统一个值,该项也是可以省略的

Shell脚本调试
sh [-nvx] 脚本名
-n :不会执行该脚本 仅查询脚本语法是否有问题 如果没有语法问题就不会显示任何内容 如果有问题会提示报错
-v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本 如果有错误,也会错误提示
-x:将执行的脚本内容输出到屏幕上 这是个对调试很有用的参数

当脚本文件较长时 可以使用set命令指定调试一段脚本

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值