Shell概述、变量及运算符

1.Shell概述

1.1 Shell简介

  • Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,用户每输入一条命令,Shell就解释执行一条。这种从键盘一输入命令,就可以立即得到回应的对话方式,称为交互的方式。
  • Shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,然后输出到屏幕返回给用户。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。
  • Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用shell脚本编程去运行。

1.2 Shell脚本

​ 当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行,按照顺序执行。该程序就被称为Shell脚本。Shell脚本类似于DOS系统下的批处理程序。

1.3 Shell分类

[root@Centos7 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

echo $BASH可以查看到当前登录的shell

在这里插入图片描述

1.4 Shell脚本开发的基本规范

1.Shell脚本的第一行是指定脚本解释器。

​ 其中,开头的“#!”字符又称为幻术,在执行shell脚本的时候,内核会根据“#!”后的解释器来确定该用那个程序解释这个脚本的内容。一个规范的Shel脚本在第一行会指出由那个程序(解释器)来执行脚本中的内容。如#!/bin/bash。

2.Shell脚本的开头会加版本、版权等信息

#Date  22:55 2020-3-12
#Author Create by ww
Blog:http://***.com
#Description:This scripts functions is....
#Verson:1.1

1.5 Shell注释

在shell中以#开始表示,整个行就被当作一个注释,不会被程序执行。

1.6 SHELL脚本的执行

先准备一个测试文件,往里面写入内容。

[root@CentOS7 ~]# echo "echo 'hello'" > test.sh

1.6.1 bash script-name或sh script name

​ 这是当脚本文件本身没有可执行权限或者脚本文件开头没有指定解释器时需要使用的方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AGwjYJLg-1583990627107)(file:///C:/Users/YCY/AppData/Local/Temp/msohtmlclip1/02/clip_image001.png)]

1.6.2 path/script-name或./script-name

​ 指在当前路径下执行脚本(脚本需要有执行权限),具体方法为chmod +x script-name。然后通过绝对路径或相对路径就可以直接执行脚本。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gOak8uwS-1583990627108)(file:///C:/Users/YCY/AppData/Local/Temp/msohtmlclip1/02/clip_image001.png)]

1.6.3 source script-name或. script-name

​ 使用source或“.”读入或加载指定的shell脚本文件,然后依次执行指定的shell脚本文件种的所有语句。这些语句将在当前父shell脚本进程种运行。使用source或.执行脚本时,不会创建子进程,而是在父进程中直接执行。
在这里插入图片描述

1.6.4 sh<script-name或cat script-name | sh

2.shell变量

​ Shell给一个变量赋值,实际就是定义了变量。变量的赋值方式为:先写变量名称,然后是“=”这个字符,最后是值,中间无任何空格,变量的内容一般要加双引号,防止出错,特别是当值内容之间有空格时。要使用变量的值是,在变量名前面加上$符号。

2.1 强引用和弱引用

​ 被一对双引号括起来的变量替换是不会被阻止的,双引号被称为弱引用或部分引用;被一对单引号括起来的变量就会被禁止,变量名只会被解释成字面的意思,不会发生变量替换,单引号被称为强引用全引用;反引号和$()一样,引号或括号里得命令会优先执行,如果存在嵌套,反引号不能用。

2.2 变量的设置规则

  • 变量名只能使用英文字母,数字或下划线,且首字母不能以数字开头。
  • 等号=用于为变量分配值,在使用过程中等号两边不能有空格。
  • 变量名区分大小写。
  • 要对变量进行引用,可以在变量名前加$美元符。
  • 变量中间不能有空格,可以使用下划线(_)。

2.3 变量类型

2.3.1 本地变量

​ 当前用户自定义的变量,当前进程中有效,其他进程及当前进程的子进程无效。

[root@Centos7 ~]# a=123
[root@Centos7 ~]# echo $a
123
[root@Centos7 ~]# su - ycy
Last login: Tue Sep 24 22:42:37 CST 2019 on pts/0
[ycy@Centos7 ~]$ echo $a

2.3.2 环境变量

​ 当前进程有效,并且能够被子进程调用。su -切换用户之后不生效。变量名通常要大写。

env:查看当前用户的环境变量

export:用于设置环境变量。修改后维持不变,直到当前shell消亡。

set:查询当前用户的所有变量(临时变量与环境变量)

declare:输出所有的变量、函数、整数和已经到处的变量。

设置PATH环境变量

​ shell要执行一个程序,它要在系统中去搜索这个程序的路径,PATH变量是用来定义bash查找命令的目录。当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个PATH路径内,就可以在全局调用这个第三方程序。

​ 定义一个环境变量:export name=value或者name=value; export name或者declare -x name=value

[root@CentOS7 ~]# echo "export PATH=/opt/:$PATH" >> /etc/profile
[root@CentOS7 ~]# source /etc/profile

2.3.3 全局变量

​ 全局所有的用户和程序都能够调用且继承,新建的用户也能默认调用。

文件名 说明 备注
$HOME/.bashrc 当前用户的bash信息,用户登录时读取 定义别名、umask、函数等
$HOME/.bash_profile 当前用户的环境变量,用户登录时读取
$HOME/.bash_logout 当前用户退出当前shell时最后读取 定义用户退出时执行的程序等
/etc/bashrc 全局的bash信息,所有用户都生效
/etc/profile 全局环境变量信息 系统和所有用户都生效
$HOME/.bash_history 当前用户的历史记录

用户登录系统读取相关文件的顺序

​ 当一个用户登录的时候,首先去读取全局的环境变量文件/etc/profile,再去读当前用户的环境变量文件HOME/.bashprofilebashHOME/.bash_profile,之后去读取局部的bash信息HOME/.bashrc,然后读取全局的bash信息/etc/bashrc,退出的时候读取$HOME/.bash_logout。

2.3.4 系统变量(内置bash中变量)

​ shell本身已经固定好了它的名字和作用。如下表。

内置变量 说明
$0 获取当前执行shell脚本的文件名。如果执行脚本包含了路径,那么就包括脚本路径。
$n 获取当前执行的Shell脚本的第n个参数值,n=1…9。当n为0时表示脚本的文件名;当n大于9,则用花括号括起来,如${10},接的参数以空格隔开
$? 获取执行上一个指令的执行状态返回值(0为成功,非0为失败)。可根据返回值来判断软件的安装步骤是否成功;也可更具返回值来确定网站备份是否正确。 判断命令、脚本或函数等程序是否执行成功。 若在脚本中调用执行“exit数字”,则会返回这个数字给“?return?”变量。 若在函数里,则通过“return数字”把这个数字以函数返回值的形式传给“?”。
$# 获取当前执行的shell脚本后面接的参数的总个数(不包括程序本身)
$* 获取当前shell脚本所有传参的参数。不加引号和@@相同,若给加上双引号如“$”,则表示将所有的参数视为单个字符串,相当于“$1 $2 $3”.
$@ 获取当前shell脚本所有传参的参数。不加引号和*相同,若给@加上双引号如"$@",则表示将所有的参数视为不同的独立字符串,相当于“$1”“$2”“3"".3”"…".这是将参数传递给其他程序的最佳方式,因为它会保留所有的内嵌在每个参数里的任何空白。当“@”和“$*”都加双引号时,二者有区别;都不加双引号,二者无区别。
$$ 获取当前执行的Shell脚本的进程号(PID)
$! 获取上一个在后台工作的进程的进程号(PID)
!$ 调用最后一条命令历史中的参数
$_ 获取在此之前执行的命令或脚本的最后一个参数
[root@CentOS7 ~]# cat test.sh
echo $0                                              #打印脚本的文件名
echo "========================="
echo $1                                                 #打印脚本传递的第一个参数值
[root@CentOS7 ~]# sh test.sh hello   #把传入的hello参数赋值给脚本中的$1并输出
test.sh 
=========================
hello

2.4 变量的定义方式

2.4.1 基本方式name=value

[root@Centos7 ~]# a=123
[root@Centos7 ~]# echo $a
123

2.4.2 命令执行结果赋值给变量

[root@Centos7 ~]# time=`date +"%F %T"`
[root@Centos7 ~]# echo $time
2019-09-24 22:48:57

2.5 交互式变量read

从标准输入读取字符串等信息,传给shell程序内部定义的变量。

用法:read [OPTION] name

OPTION 说明
-p 定义提示用户的信息
-n 定义字符数(限制变量值的长度)
-s 不显示(不显示用户输入的内容)
-t 定义超时时间,默认为s(限制用户输入变量值的超时时间)
# 用户自定义变量值
[root@Centos7 ~]# read name
python
[root@Centos7 ~]# echo $name
python
[root@Centos7 ~]# read -p "Input your name:" nam
Input your name:shell
[root@Centos7 ~]# echo $name
shell
# 变量值来自文件
[root@Centos7 ~]# echo 192.168.146.101 > ip.txt
[root@Centos7 ~]# read -p "Input you IP:" IP < ip.txt
[root@Centos7 ~]# echo $IP
192.168.146.101

2.6 定义有类型的变量declare

给变量做一些限制,固定变量的类型,比如:整型、只读。

用法:declare [OPTION] name=value

OPTION 说明
-i 将变量看成整数
-r 定义只读变量
-a 定义普通数组,查看普通数组
-A 定义关联数组;查看关联数据
-x 将变量通过过环境导出。declare -x a=123等于export a=123
[root@Centos7 ~]# declare -i a=123
[root@Centos7 ~]# echo $a
123
[root@Centos7 ~]# a=python
[root@Centos7 ~]# echo $a
0

2.7 只读变量

​ 使用readonly 变量名可以将变量定义为只读变量,只读变量的值不能被改变。

[root@CentOS7 ~]# readonly a=5
[root@CentOS7 ~]# a=10
-bash: a: readonly variable

2.8 变量的删除

​ 使用unset 变量名的形式删除变量。变量被删除后不能再次使用。unset命令不能删除只读变量。

3.运算符

3.1 算术运算符号

运算符 说明
+、-、*、/、%、 加法(或正号)、减法(或负号)、乘法、除法、取余(取模)
** 幂运算
++、– 增加及减少,可前置也可放在变量结尾
!、&&、|| 逻辑与、逻辑或、逻辑非
<、<=、>、>= 比较符号(小于、小于等于、大于、大于等于)
==、!=、= 比较符号(相等、不相等、对于字符串“=”也可以相当于)
<<、>> 向左移位、向右移位
~、|、&、^ 按位取反、按位异或、按位与、按位或
=、+=、-=、*=、/=、%= 赋值运算符

3.2 算术运算命令

运算操作符与运算命令 意义
$( ( ) ) 用于整数运算的常用操作符,效率很高
$[] 用于整数运算
let 用于整数运算,类似于“( ( ) )”,两个数值之间需用空格隔开
expr 可用于整数运算(乘号*需用反斜杠那个转义)
bc Linux下的一个计算器程序(适合整数及小数运算)
awk 即可用于整数运算,也可用于小数运算
declare 定义变量值和属性,-i参数可以用于定义整型变量,做运算
[root@Centos7 ~]# echo $(( 1+1 ))
2
[root@Centos7 ~]# echo $[ 1+5 ]
6

[root@Centos7 ~]# a=1;let a=a+1;echo $a
2

[root@Centos7 ~]# expr 1+1   # +号左右需有空格
1+1
[root@Centos7 ~]# expr 1 + 1
2
[root@Centos7 ~]# expr 5 \* 2    *需使用\转义
10


[root@Centos7 ~]# echo 1.1+1.1 | bc
2.2
[root@Centos7 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
0.2+0.3
.5
2*0.4
.8
quit


[root@Centos7 ~]# bc -q
scale=2
1.2 / 2
.60
quit


[root@Centos7 ~]# i=1;let i++;echo $i
2
[root@Centos7 ~]# j=1;let ++j;echo $j
2
[root@Centos7 ~]# let a=i++       #先赋值,再运算
[root@Centos7 ~]# let b=++j       #先运算,再赋值
[root@Centos7 ~]# echo $i
3
[root@Centos7 ~]# echo $j
3
[root@Centos7 ~]# echo $a
2
[root@Centos7 ~]# echo $b
3

3.3 expr命令

	对数字的基本运算。作比较时,输出结果假为0;1为真;特殊符号用转义符。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xBal384s-1583991924754)(C:\Users\YCY\AppData\Roaming\Typora\typora-user-images\image-20200312133747535.png)]

3.4 双小括号(())

​ 进行数值运算与数值比较,效率很高,用法灵活。

运算操作符与运算命令 意义
( ( i=i+1 ) ) 先运算后赋值,可用echo$( ( i=i+1 ) )输出其值
i=$( ( i+1 ) ) 可以再“(())”前加$符,表示将表达式运算后赋值给I
( ( 8>7&&5==5 ) ) 可以进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断
echo $( ( 2+1 ) ) 需要直接输出运算表达式的运算结果是,可以在“( ( ) )”前加$符

3.5 test命令

test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个文件方面的测试。
格式为:test 测试条件
如果结果为真,用$?=0表示,反之为假,用非0表示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUZVgbNV-1583991924758)(C:\Users\YCY\AppData\Roaming\Typora\typora-user-images\image-20200312134435174.png)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章