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. IDEA操作git的一些常用技巧

    转自:https://blog.csdn.net/ck4438707/article/details/53455962 Git原理以后会分章节介绍,本次主要说一下intellij怎样操作git.int ...

  2. Kitty基于Spring Boot、Spring Cloud、Vue.js、Element实现前后端分离的权限管理系统

    源码地址:https://gitee.com/liuge1988/kitty 软件架构 后端架构 开发环境 IDE : eclipse 4.x JDK : JDK1.8.x Maven : Maven ...

  3. 数据结构(C++)——顺序表

    顺序表和链表的比较 1.存取方式 顺序表可以随机访问,而链表只能从表头顺序查找.(因此经常查找顺序表某一个元素时,顺序表更适合) 2.逻辑结构与物理结构 顺序表中,逻辑上相邻的元素,其物理存储位置也相 ...

  4. Python ( 高级 第二部)

    目录 模块和包 面向对象 部分一: 面向对象程序开发 面向对象封装: 对象的相关操作 面向对象封装: 类的相关操作 实例化的对象/ 定义的类删除公有成员属性和公有成员方法 部分二: 单继承 多继承 菱 ...

  5. Java学习的第十九天

    1.今天学了接口只能有抽象的常量和方法,接口为interface    承接接口是implements 接口的使用 接口中的方法必须是抽象的,没有构造方法 2.今天没有问题 3.明天学习第六章综合实例 ...

  6. ASP.NET Core Authentication系列(四)基于Cookie实现多应用间单点登录(SSO)

    前言 本系列前三篇文章分别从ASP.NET Core认证的三个重要概念,到如何实现最简单的登录.注销和认证,再到如何配置Cookie 选项,来介绍如何使用ASP.NET Core认证.感兴趣的可以了解 ...

  7. Java-GUI基础(一)

    简介 首先,Java的学习就是不断学习一个个包与类的过程,对于GUI部分有两个核心包:java.awt与javax.swing, 这两个包可以说是涵盖了java的GUI部分所有的类(和他们的方法). ...

  8. 解决SBT下载慢,dump project structure from sbt?

    一. 安装SBT,参考https://blog.csdn.net/zcf1002797280/article/details/49677881 二. 在~/.sbt下新建repositories添加如 ...

  9. 读书笔记:《数据结构与算法分析Java语言描述》

    目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...

  10. 小白自己对while循环的理解