Linux脚本shell的编写

前言

shell脚本是普通的文本文件,由流程控制逻辑和命令构成。

shell脚本通常以.sh作为后缀名,但不是必须的。

shell脚本的优势在于处理操作系统底层的业务 (linux系统内部的应用都是shell脚本完成)因为有大量的linux系统命令为它做支撑。2000多个命令都是shell脚本编程的有力支撑,特别是grep、awk、sed等

开头的"#!"字符又称为幻数,在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用那个程序解释这个脚本中的内容。 

#! /bin/sh是shell脚本的一个标志,声明这个script使用的shell。

或#! /bin/bash

开发规范

1) 放在统一的目录

2) 脚本以.sh为扩展名 (不是必需的)

3) 开头指定脚本解释器。(#! /bin/sh)

4) 开头加版本版权等信息,可配置~/.vimrc文件自动添加。

5) 脚本不要用中文注释,尽量用英文注释。 

6) 代码书写优秀习惯

a、成对的内容一次性写出来,防止遗漏,如[ ]、' '、" "等

b、[ ] 两端要有空格,先输入[ ],退格,输入2个空格,再退格写。

c、流程控制语句一次书写完,再添加内容。(if 条件 ; then 内容;fi)

d、通过缩进让代码易读。

f、脚本中的引号都是英文状态下的引号,其他字符也是英文状态。

一、创建第一个shell脚本文件

创建一个专门的目录,进入目录,然后执行 touch test.sh 文件

vim test.sh 进入编辑脚本

在shell编程中,通常情况下,#代表注释,但是第一行的#是一个特例。

#! /bin/sh是shell脚本的一个标志,声明这个script使用的shell。

第一行的#!是一个约定标记, 它告诉脚本这段脚本需要什么解释器来执行.

第二行的echo命令则负责向屏幕上输出一句话。

运行这个脚本文件 sh test.sh 或者是

使用./test.sh需要权限执行 chmod 777 test.sh 赋权

二、Shell变量

环境变量:也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程shell中使用,环境变量又可分为自定义环境变量Bash**内置的环境变量**

普通变量:也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的。

特殊变量:脚本内置的具有特殊用途的变量

使用 env ,export 命令查看系统中的环境变量

env 显示用户的环境变量

export 显示当前导出成用户变量的shell变量,并显示变量的属性(是否只读),

按变量名称排序

输出一个系统中的 环境变量 echo $HOME

=两端不能有空格

1、普通变量

单引号字符串的限制:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

数字:夹单引号、双引号或者是不所以引号结果是一样的都是数字

字符串 :单引号和双引号 是一样的

双引号里可以有变量,可以出现转义字符。

取值: 单引号是原文输出,双引号是进行取值

输出变量

#输出变量

echo $str

echo "单引号变量:"

echo '$str'

echo '双引号变量:'

echo "$str"

转义字符

#定义转义字符

echo '转义字符\'\'

echo "转义字符\"\""
2、变量中引号的使用

只有在变量的值中有空格的时候,会使用引号。

单引号与双引号的区别在于,是否能够解析特殊符号。

变量使用反引号赋值,及使用${}获取参数值

取值的时候不加{}代表取的是某一个变量的值 :$ab 取的是ab变量的值

加{}之后取的是拼接之后的值:${a}b 取的是 ${a}的值拼接上字符串b

3、定义变量名技巧
  1. 变量名只能为字母、数字或下划线,只能以字母或下划线开头。
  2. 变量名的定义要有一定的规范,并且要见名知意。
  3. 一般的变量定义、赋值常用双引号;简单连续的字符串可以不加引号;希望原样输出时使用单引号。
  4. 希望变量的内容是命令的解析结果时,要用反引号``,或者用$()把命令括起来再赋值。
4、特殊变量、

(1)位置变量

$0  获取当前执行的shell脚本的文件名,如果执行脚本带路径那么就包括脚本路径

$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9用大括号括起来{10},参数以空格隔开。

$# 获取当前执行的shell脚本后面接的参数的总个数

$* 获取当前shell的所有传参的参数,不加引号同$@

(将接收到的每一个参数当做每一份数据,每个参数之间用空格来分开)

加上引号表示将传入的多个参数从整体上当做一份数据,以"1 2…n"的形式输出所有参数。

$@  获取当前shell的所有传参的参数,不加引号同$*

加上引号。表示仍然将传入的多个参数当做多份数据,空格区分,彼此之间独立,以"1" "2"…"n" 的形式输出所有参数。

不加引号:“”两个是一样的都是取到参数的值\]       Sh xxx.sh 1 2 3 4 5     “1” “2” “3” “4” “5”

加引号:         “$*” 取到的值是”1 2 3 4 5”         “$@”   取到的值是”1” “2” “3”

当“$*”和“$@”都加双引号时,两者有区别,都不加双引号时,两者无区别。

5. 进程状态变量

$?  获取执行上一个指令的执行状态返回值(0为成功,非零为失败),这个变量最常用

三、定义变量的方式
1、三种定义变量的方式

  1. 直接赋值        a=1
  2. 传参 (传递参数)

3.交互式设置变量,使用read命令 类似于Scanner

2、read命令说明

或者

获取输入内容,在命令行中使用

[root@localhost demo1]# read

123

[root@localhost demo1]# echo $REPLY

123

[root@localhost demo1]# read str

1234

[root@localhost demo1]# echo $str

1234

[root@localhost demo1]# echo $?

0

[root@localhost demo1]#

四、变量子串说明

${parameter}  返回变量$parameter的内容

${#parameter}  返回变内容的长度(按字符),也适用于特殊变量

五、条件表达式
1、&&,||

如果第一个命令执行成功(返回1),与操作符&&才会执行第二个命令

如果第一个命令执行不成功就直接返回0

如果第一个命令执行失败,或操作符||才会执行第二个命令

如果第一个命令执行成功就直接返回1

2、文件判断

常用文件测试操作符

常用文件测试操作符

说明

-d文件,d的全拼为directory

文件存在且为目录则为真,即测试表达式成立

-f文件,f的全拼为file

文件存在且为普通文件则为真,即测试表达式成立

-e文件,e的全拼为exist

文件存在则为真,即测试表达式成立。注意区别于“-f”,-e不辨别是目录还是文件

-r文件,r的全拼为read

文件存在且可读则为真,即测试表达式成立

-s文件,s的全拼为size

文件存在且文件大小不为0则为真,即测试表达式成立

-w文件,w的全拼为write

文件存在且可写则为真,即测试表达式成立

-x文件,x的全拼为executable

文件存在且可执行则为真,即测试表达式成立

-L文件,L的全拼为link

文件存在且为链接文件则为真,即测试表达式成立

fl -nt f2,nt 的全拼为 newer than

文件fl比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算

fl -ot f2,ot 的全拼为 older than

文件fl比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算

3、字符串判断

字符串测试操作符

常用字符串测试操作符

说明

-n "字符串"

若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero

-z "字符串"

若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写

"串 1"== "串 2"

若字符串1等于字符串2,则为真,即测试表达式成立,可使用"=="代替"="

"串 1" != "串 2"

若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!="

1.对于字符串的测试,一定要将字符串加双引号之后再进行比较。

2.空格非空

4、整数判断

整数二元比较操作符参考

[[ == ]]

-eq []

在[]以及test中

使用的比较符号

在(())和[[]]中

使用的比较符号

说明

-eq

==或=

相等,全拼为equal

-ne

!=

不相等,全拼为not equal

-gt

>

大于,全拼为greater than

-ge

>=

大于等于,全拼为greater equal

-lt

<

小于,全拼为less than

-le

<=

小于等于,全拼为less equal

六、if条件语句

[  ] 括号两端一定要有空格

1、单分支语句

  if 条件表达式

        then

        Do something

fi

2、双分支语句

if 条件表达式

then

。。。。。。

else

fi

3、多分支语句

if 条件

then

elif

then

else

fi

七、case条件结构语句
1、case语法结构
case "变量" in
值1)
echo "执行语句"
;;
值2)
;;
*) //以上没有符合条件的
;;
esac

2、case与if的对比
	case书写方式
case $name in
  值1) 
      指令1
      ;;
  值2) 
      指令2
      ;;
   *) 
      指令
esac


	if书写方式
if [ $name == "值1" ]
  then 
    指令1
elif [ $name == "值2" ]
  then 
    指令2
else
    指令    
fi
3、case值的书写方式

apple)

echo -e "$RED_COLOR apple $RES"

;;

也可以这样写,输入2种格式找同一个选项

apple|APPLE)

echo -e "$RED_COLOR apple $RES"

;;

八、for循环
1、列表for循环(常用)
#!/bin/bash
for i in 取值列表 
  do 
    循环主体
 命令done 

思考:卸载openjdk

  1. 查询系统中是否有jdk
l=`rpm -qa|grep jdk`
  1. 循环获jdk的安装包
for name in $l

do

echo $name

done
2、类似C语言的风格
for((exp1;exp2;exp3))
    do
      指令...
   done   

编写类似C语言风格脚本

Shell中的两种样式

九、while语法
1、基本结构:

声明一个变量

i=0;
while 条件 
  do
    命令
  done 

2、until循环

基本结构

until condition
do
    do something...
done

十、跳出循环

shell中也支持break跳出循环, continue跳出本次循环.用法与C, Java中相同

例1:1到10,当对应的和大于20时跳出循环,并打印当前和是多少,及当前数值是多少

例2:从1 循环到 20
当变量是一个偶数的时候跳出本次循环 丁
当变量是一个奇数的时候输出变量的值

十一、退出/返回状态

1) $?:返回上一条语句或脚本执行的状态

a. 0:成功

b. 1-255:不成功

2) exit 命令,用于退出脚本或当前Shell

exit 命令n 是一个从 0 到 255 的整数 ,0 表示成功退出,非零表示遇到某种失败 ,返回值 被保存在状态变量 $? 中 。

exit n

常见的返回状态码

a. 0: 执行正确

b. 1: 通用错误

c. 126: 命令或脚本没有执行权限

d. 127: 命令没找到

十二、 数据流重定向

标准输入:代码0,使用 < 或者 <<

标准输出:代码1,使用 > 或者 >>

错误输出:代码2,使用 > 或者 >>

> 表示 写入; >>表示追加

<表示 读入;<<表示结束读入

EOF是END Of File的缩写,表示自定义终止符.

  • 32
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值