Shell进阶

当把在Windows中写好的脚本传到linux中使用时,在Windows下每一行结尾是\n\r,而Linux下则是\n,所以会多出来\r,在linux中运行脚本时,需执行:

sed -i 's/\r$//' test10.sh(将\r替换成空白)

1.变量

(1)变量的含义

数据可以发生改变就是变量,在一个脚本周期(当前的shell文件)内,其值可以发生改变的量就是变量

(2)变量的定义与使用

定义:变量是由  变量名=变量值  组成(a=”linux”)

使用:用变量时一定要在变量名前面添加一个$符号(echo $a)

(3)变量名的规范

变量名后面的“=”左右不能有空格

命名只能使用英文字母,数字和下划线,首个字符不能是数字

中间不能有空格,不能使用关键字,不能使用标点符号,可以使用下划线

(4)符号规则

双引号能够识别变量,能够实现转义(类似于乘“\*”)

单引号不能识别变量,只会原样输出,是不能转义

反引号(esc键下方的那个键“·”),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”(前后都加)

eg1:使用变量改写入门脚本中的第1个shell脚本

touch test3.sh           #创建文件

vim  test3.sh            #编辑文件

#!/bin/bash              #指定shell解释器

a=”hello world!”       #定义变量

echo $a                  #输出变量

chmod u+x  test3.sh     #修改权限

./test3.sh                 #执行文件

eg2:定义一个变量,输出当前时间,格式为年-月-日,时-分-秒

touch test4.sh           #创建文件

vim  test4.sh            #编辑文件

#!/bin/bash              #指定shell解释器

b=`date “+%F %T”`     #定义变量

echo $b                  #输出变量

chmod u+x  test4.sh     #修改权限

./test4.sh                 #执行文件

(5)只读变量

用法:readonly  变量名      只输出只读的变量

eg:定义变量a并且其值为10,随后设置其为只读变量,再重新赋值输出结果

touch  test5.sh          #创建文件

vim   test5.sh           #编辑文件

#!/bin/bash              #指定shell解释器

a=10                    #定义变量

readonly a               #只读变量

a=20                    #再次赋值

echo $a                  #输出变量

chmod 744 test5.sh      #修改权限

./test5.sh                #运行文件(输出10)

(6)接收用户输入

用法:read  -p  提示信息  变量名

eg:写一个脚本test6.sh,要求执行之后提示用户输入文件的名称(路径)然后自动为用户创建改文件

touch test6.sh           #创建文件

vim  test6.sh            #编辑文件

#!/bin/bash            #指定shell解释器

read -p “请输入需要创建的路径” a     #接收用户输入

touch $a                 #定义变量

echo  $“文件创建成功!” #输出

ls -l  $a                  #查看路径

chmod 711 test6.sh       #修改权限

./test6.sh                 #运行文件

(7)删除变量

用法:unset 变量名

eg:定义变量b=20,再输出b的值,随后删除b,最后再输出下b

touch test7.sh          #创建文件

vim  test7.sh           #编辑文件

#!/bin/bash             #指定shell解释器

b=20                   #定义变量

echo $b                 #输出变量

unset b                 #删除变量

echo $b                 #输出变量

chmod 711 test7.sh      #修改权限

2.条件判断语句

(1)    一个条件的语法

if condition

then

command1

command2

…

fi

(2)    两个条件的语法

if condition

then

command1

command2

…

else

command

fi

(3)    多个条件的语法

if condition1

then

command1

elif condition2

then

command2

else

commandN

fi

单行写法(一般在命令行中执行的时候):if [ condition ]; then command; fi

3.运算符

常见:算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符

(1)    算数运算符

假设变量a=10   变量b=20

运算符

说明

举例

+

加法

`expr $a + $b` 结果为 30。

-

减法

`expr $a - $b` 结果为 -10。

*

乘法

`expr $a \* $b` 结果为  200。

/

除法

`expr $b / $a` 结果为 2。

%

取余(不常用)

`expr $b % $a` 结果为 0。

=

赋值

a=$b 将把变量 b 的值赋给 a。

==

相等。用于比较两个数字,相同则返回 true(真)。

[ $a == $b ] 返回 false(假)。

!=

不相等。用于比较两个数字,不相同则返回 true。

[ $a != $b ] 返回 true。

条件表达式要放在方括号之间,并且要有空格

注意:expr 是一款表达式计算工具,使用它能完成表达式的求值操作

表达式和运算符之间要有空格

完整的表达式要被 ` ` (反引号)包含

单引号的内容属于引用,会被完整输出

eg:输出上表格中的各个表达式的结果

touch   test8.sh

vim    test8.sh

#!/bin/bash

a=10

b=20

echo ‘a=’$a

echo ‘b=’$b

echo  ‘a + b =’ `expr $a + $b`

echo  ‘a - b =’ `expr $a - $b`

echo  ‘a * b =’ `expr $a \* $b`

echo  ‘b / a =’ `expr $b / $a`

echo  ‘b % a =’ `expr $b % $a`

if [$a == $b]

then

echo ‘ture’

else

echo ‘false’

fi

if [$a != $b]

then

echo ‘ture’

else

echo ‘false’

fi

chmod  711 test8.sh

./test8.sh

(2)    关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

假设变量a=10   变量b=20

运算符

说明

举例

-eq

检测两个数是否相等,相等返回 true。

[ $a -eq $b ] 返回 false。

-ne

检测两个数是否相等,不相等返回 true。

[ $a -ne $b ] 返回 true。

-gt

检测左边的数是否大于右边的,如果是,则返回 true。

[ $a -gt $b ] 返回 false。

-lt

检测左边的数是否小于右边的,如果是,则返回 true。

[ $a -lt $b ] 返回 true。

-ge

检测左边的数是否大于等于右边的,如果是,则返回 true。

[ $a -ge $b ] 返回 false。

-le

检测左边的数是否小于等于右边的,如果是,则返回 true。

[ $a -le $b ] 返回 true。

eg:输出上表格中的各个表达式的结果

touch test9.sh

vim  test9.sh

a=10

b=20

echo ‘a=’$a

echo ‘b=’$b

if [ $a -eq $b ]    #其他运算同理

then

echo ‘ture’

else

echo ‘false’

fi

chmod +x test9.sh

./test9.sh

(3)    逻辑运算符——布尔运算符

假设变量a=10   变量b=20

运算符

说明

举例

!

非运算,表达式为 true 则返回 false,否则返回 true。

[ ! false ] 返回 true。

-o

或(或者)运算,有一个表达式为 true 则返回 true。

[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a

与(并且)运算,两个表达式都为 true 才返回 true。

[ $a -lt 20 -a $b -gt 100 ] 返回 false。

或运算:一个为真即为真,全部为假才是假

与运算:一个为假即为假,全部为真才是真

eg:输出上表格中的各个表达式的结果

touch  test12.sh

vim test12.sh

#!/bin/bash

a=10

b=20

echo ‘a=’$a

echo ‘b=’$b

if [ ! false ]

then

echo ‘ture’

else

echo ‘false’

fi

if [ $a -lt 20 -o $b -gt 100 ]

then

echo ‘ture’

else

echo ‘false’

fi

if [ $a -lt 20 -a $b -gt 100 ]

then

echo ‘ture’

else

echo ‘false’

fi

chmod +x test9.sh

./test9.sh

(4)    字符串运算符

假定变量 a 为 "abc",变量 b 为 "efg"

运算符

说明

举例

=

检测两个字符串是否相等,相等返回 true。

[ $a = $b ] 返回 false。

!=

检测两个字符串是否相等,不相等返回 true。

[ $a != $b ] 返回 true。

-z

检测字符串长度是否为0,为0返回 true。

[ -z $a ] 返回 false。

-n

检测字符串长度是否为0,不为0返回 true。

[ -n $a ] 返回 true。

str

检测字符串是否为空,不为空返回 true。

[ $a ] 返回 true。

(5)    文件测试运算符

操作符

说明

举例

-b file

检测文件是否是块设备文件,如果是,则返回 true。

[ -b $file ] 返回 false。

-c file

检测文件是否是字符设备文件,如果是,则返回 true。

[ -c $file ] 返回 false。

-d file

检测文件是否是目录,如果是,则返回 true。

[ -d $file ] 返回 false。

-f file

检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。

[ -f $file ] 返回 true。

-g file

检测文件是否设置了 SGID 位,如果是,则返回 true。

[ -g $file ] 返回 false。

-k file

检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。

[ -k $file ] 返回 false。

-p file

检测文件是否是有名管道,如果是,则返回 true。

[ -p $file ] 返回 false。

-u file

检测文件是否设置了 SUID 位,如果是,则返回 true。

[ -u $file ] 返回 false。

-r file

检测文件是否可读,如果是,则返回 true。

[ -r $file ] 返回 true。

-w file

检测文件是否可写,如果是,则返回 true。

[ -w $file ] 返回 true。

-x file

检测文件是否可执行,如果是,则返回 true。

[ -x $file ] 返回 true。

-s file

检测文件是否为空(文件大小是否大于0),不为空返回 true。

[ -s $file ] 返回 true。

-e file

检测文件(包括目录)是否存在,如果是,则返回 true。

[ -e $file ] 返回 true。

4.shell脚本附带选项

tail -10 test2.sh这种命令就是调用tail指令,系统把后续选项传递给tail,tail先去打开指定的文件,然后取出最后10行

接收用“$”加上选项对应的序号即可

eg1:编写test14.sh,传递a,b,c,输出其值

eg2:创建自定义指令“user”,可以直接执行,要求该指令具备以下语法和功能:

a. #user -add 用户名               【添加用户】

b. #user -del 用户名                【删除用户及其家目录】

c.创建自定义指令“user”——vim ~/.bashrc(su  切换用户生效)

自学linux——12.shell进阶的更多相关文章

  1. 自学linux——11.shell入门

    shell 基础 1.shell介绍(内置脚本) 程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理) 语法简单,代码写起来比较轻松,简单易学 (1)什么是shell shell ...

  2. 自学Linux命令行与Shell脚本之路

    自学Linux命令行与Shell脚本之路[第一回]:初识Linux   1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3  ...

  3. 自学Linux Shell2.1-进入shell命令行

    点击返回 自学Linux命令行与Shell脚本之路 2.1-进入shell命令行 进入文本命令行界面(CLI)两种方法: 控制台终端 图形化终端 1. 通过Linux控制台终端访问CLI 按下Ctrl ...

  4. 自学Linux Shell11.6-退出shell

    点击返回 自学Linux命令行与Shell脚本之路 11.6-退出shell shell运行的每一个命令都是使用 退出状态码 告诉shell它已经运行完毕.退出状态码是一个0~255的整数值,在命令结 ...

  5. Linux和Shell回炉复习系列文章总目录

    本页内容都是本人回炉Linux时整理出来的.这些文章中,绝大多数命令类内容都是翻译.整理man或info文档总结出来的,所以相对都比较完整. 本人的写作方式.风格也可能会让朋友一看就恶心到直接右上角叉 ...

  6. Linux和Shell教程

    文档资料参考: 参考:http://www.runoob.com/linux/linux-tutorial.html 软件下载参考: centos 下载地址:https://www.centos.or ...

  7. 自学Linux Shell1.2-Linux目录结构

    点击返回 自学Linux命令行与Shell脚本之路 1.2-Linux目录结构 /:  根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置 ...

  8. 自学Linux Shell4.1-监测程序ps top kill

    点击返回 自学Linux命令行与Shell脚本之路 4.1-监测程序ps top kill 1. PS命令 linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的 ...

  9. 自学Linux Shell7.1-linux用户账户和组

    点击返回 自学Linux命令行与Shell脚本之路 7.1-linux用户账户和组 linux安全系统的核心是用户账户.每个能进入linux系统的用户都会被分配唯一的用户账户,用户对系统中各对象的访问 ...

随机推荐

  1. SQL SERVER迁移--更换磁盘文件夹

    默认情况下SQL SERVER的安装路径与数据库的默认存放路径是在C盘的--这就很尴尬. 平时又不注意,有天发现C盘的剩余空间比较吃紧了,于是着手想办法迁移文件夹. 一.环境准备 数据库版本--SQL ...

  2. Java数据结构-00导论

    一个程序是怎样组成的呢?数据结构+算法=程序 一.什么是数据结构: 简单定义就是研究数据的存储方式:选择适当的数据结构可以提高计算机程序的运行效率(时间复杂度O)和存储效率(空间复杂度S). 二.数据 ...

  3. equals()方法和hashCode()方法详解

    equals()方法和hashCode()方法详解 1. Object类中equals()方法源代码如下所示: /** * Object类中的equals()方法 */ public boolean ...

  4. 设计模式 | 职责链模式(Chain of responsibility)

    定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 结构:(书中图,侵删) 一个抽象的处理者 若干 ...

  5. Serilog 源码解析——总览

    背景 大家好,考虑到在最近这些天,闲来无事,找了个类库好好研究下别人写的高质量代码,颇有收获,打算和大家分享下.考虑到最近在自学 ASP.NET Core 的相关开发,对 Serilog 这个日志记录 ...

  6. 【新阁教育】基于ModbusTCP实现西门子1200PLC定位控制案例

    1. 引言 今天新阁教育给大家分享一个<基于ModbusTCP实现西门子1200PLC定位控制案例>,从PLC输入输出及步进电机接线开始,到PLC运动控制程序编写,再到后续的ModbusT ...

  7. 微服务通信之ribbon实现原理

    前言 上一篇我们知道了feign调用实现负载均衡是通过集成ribbon实现的.也较为详细的了解到了集成的过程.现在我们看一下ribbo是如何实现负载均衡的.写到这里我尚未去阅读源代码,我在这里盲猜一下 ...

  8. LWJGL3的内存管理,第二篇,栈上分配

    LWJGL3的内存管理,第二篇,栈上分配 简介 为了讨论LWJGL在内存分配方面的设计,本文将作为该系列随笔中的第二篇,用来讨论在栈上进行内存分配的策略,该策略在 LWJGL3 中体现为以 Memor ...

  9. [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)

    题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...

  10. SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)

    SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂) 1.SpringBoot整合Druid Druid是阿里巴巴的一个开源项目,是一个数据库连接池的实现,结合了C3P0. ...