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  切换用户生效)

最新文章

  1. 一些值得练习的github项目
  2. oracle数据库相关知识点
  3. 学会使用简单的 MySQL 常用操作
  4. Oracle 10G select工作原理
  5. C#委托使用:多播 ,向委托注册多个方法
  6. Tab指示符——Indicator
  7. Base Enum Properties [AX 2012]
  8. 避免写出IE Bug
  9. 从 mian 函数开始一步一步分析 nginx 执行流程(四)
  10. 登陆用户怎样获取验证码和保存用户到cookie中
  11. iOS 删除相册中照片--来自简书
  12. mysql校对规则引起的不区分大小写
  13. (4)事件处理——(3)代码执行的顺序(Timing of code execution)
  14. jbpm4.3表结构和表字段说明
  15. 一文搞定MySQL的事务和隔离级别
  16. [物理学与PDEs]第3章第5节 一维磁流体力学方程组 5.1 一维磁流体力学方程组
  17. 010 Editor Mac安装教程
  18. Remainders Game (中国剩余定理)
  19. 原生js上传图片时的预览
  20. 【转载】 996,谁的ICU?

热门文章

  1. Hadoop框架:HDFS高可用环境配置
  2. Tensorflow学习笔记No.9
  3. CodeForces 1327F AND Segments
  4. Spring创建Bean的过程Debug
  5. Oracle初始——第一天
  6. HTML5+CSS3 QQ会员页面导航
  7. 论文解读 - Composition Based Multi Relational Graph Convolutional Networks
  8. js给多级复杂动态变量赋值
  9. CSS3:overflow属性详解
  10. fork 子进程,父进程对于变量的共享