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. APP UI自动化测试思路总结

    python+appium自动化测试系列就要告一段落了,本篇博客咱们做个小结. 首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师.高级测试工程师岗位招聘信息上要求的,所 ...

  2. 1.1:JAVA基础

    JAVA基础面试部分(多线程.算法.网络编程提出去了,详细分类见<面经>) 一.Java底层基础题 JDK和JRE区别? 1.JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆 ...

  3. 蓝桥杯2020.10.17B组c++

    1.门牌制作 暴力即可 #include <iostream> #include<math.h> #include<string.h> #include<st ...

  4. C语言积累一点点

        778. 水位上升的泳池中游泳https://leetcode-cn.com/problems/swim-in-rising-water/ 839. 相似字符串组 https://leetco ...

  5. selenium中的三种等待方式

    1.强制等待,采用的time.sleep,然后后面加上要等待的时间: 2.隐性等待implicitly_wait,隐性等待设定后,会对之后的所有代码生效,会在设定的时间之内,不停的去查找元素,如果找到 ...

  6. Luogu P6815 [PA2009]Cakes

    题意 给定一个 \(n\) 个点 \(m\) 条边的图,点 \(i\) 有权值 \(a_i\),一个三元环 \((i,j,k)\) 的贡献为 \(\max(a_i,a_j,a_k)\),求所有三元环的 ...

  7. 获取url中查询字符串参数

    // 获取url中查询字符串参数 例如http://www.test.com?a=1&b=2 function RequestParamete() { var url = window.loc ...

  8. 4G工业路由器的性能介绍和应用需求

    4G工业路由器可以实现数据的远程传输和设备控制功能,主要应用的场景包括智能电网.智能交通.智能家居.才智金融.工业自动化.公共安全.环境保护.数字化医疗等领域,特别是大数据或是视频传输等.那么4G工业 ...

  9. Java学习的第六天

    1.今天学习了各种运算符, 还有选择结构,循环结构 2.今天学习没有遇到困难. 3.明天学习数组和第三章的开头一部分.

  10. .NET CORE QuartzJob定时任务+Windows/Linux部署

    前言 以前总结过一篇基于Quartz+Topshelf+.netcore实现定时任务Windows服务 https://www.cnblogs.com/gt1987/p/11806053.html.回 ...