Shell编程基础)

Posted 连智波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程基础)相关的知识,希望对你有一定的参考价值。

1.什么是变量

  从本质上讲,变量就是在程序中保存用户数据的一块内存空间,变量名就是这块内存空间的地址。在程序执行过程当中,保存数据的内存空间内容可能会不断发生变化,但是代表内存地址的变量名却保持不变,由于变量的值时在计算机的内存中,所以当计算机重启后,变量的值会丢失。

2.变量的命名

命名规范:

变量名由字母,数字,下划线组成,并且只能以字母或者下划线开头,用户应该选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名


2.1 可读性好的变量名

HISTCONTROL=ignoredups:ignorespace

HISTSIZE=1000

2.2 可读性差的变量名

abc=123

str1="hello,world"

2.3 变量名的大小写敏感

java=1.8

JAVA=1.9

两个变量的结果是不一样的

3. 变量的类型

  shell是一种动态类型语言和弱类型语言,即在shell中,变量的类型无需显示的声明,变量的数据类型会根据不同的操作有所变化,准确的讲,shell中的变量是不分数据类型的,统一地按照字符串存储。

3.1 案例

#!/bin/bash

#定义变量x,并且赋值为123

x=123

#变量x加1

let "x += 1"

#输出变量x的值

echo "x = $x"

#把变量x中的1替换为abc

y=$x/1/abc

#输出变量y的值

echo "y = $y"

#声明变量y

declare -i y

#输出变量y的值

echo "y = $y"

#变量y的值加1

let "y += 1"

#输出变量y的值

echo "y = $y"


#将字符串赋值给变量z

z=abc22

#输出变量z的值

echo "z = $z"

#把变量x中的1替换为abc

m=$z/abc/11

#输出变量m的值

echo "m = $m"

#变量m的值加1

4.变量的定义

  通常情况下,用户可以直接使用变量,无需先进行定义,在用户第一次使用使用某个变量名时,实际上就同时定义了这个变量。

4.1 案例

#!/bin/bash

#定义变量a

a=1

#定义变量b

b="hello"

#定义变量c,如果变量的值包括空格,一定要用引号引起来

c="hello world"

4.2 declare 声明变量

格式: declare  属性  变量名

属性分类:

-p 显示所有变量的值

-i 将变量定义为整数

-r 将变量声明为只读变量

-a 将变量声明为数组

-f 显示所有自定义函数

-x 将变量设置为环境变量

案例

#!/bin/bash

#定义变量x,并将一个算术式赋值给x

x=6/3

echo "$x"

#定义变量x为整数

declare -i x

echo "$x"

#将算术式赋值给变量x

x=6/3

echo "$x"

#将字符串赋值给变量x

x=hello

echo "$x"

#将浮点数赋值给变量x

x=3.14

echo "$x"


#取消变量x的整数属性

declare +i x

#重新将算术式赋值给变量x

x=6/3

echo "$x"


#声明只读变量

declare -r x

echo "$x"

#尝试为只读变量赋值

x=5

echo "$x"

结果:

Shell

5.变量和引号

shell语言中一共有三种引号,单引号,双引号,反引号,这三种引号的作用不同

5.1 单引号()

单引号引起来的都是普通字符,例如:

str=hello

5.2 双引号("")

双引号括起来的字符除了 "$" , "\\" , "" , """ 这几个字符仍是特殊字符保留起特殊功能外,其余字符仍作为普通字符对待,例如:

root@k8s-master:~# b=123

root@k8s-master:~# str="$b"

root@k8s-master:~# echo $str

$符号在这里有特殊意义,$b代表变量b的值

5.3 反引号(``)

反引号括起来的字符串被shell解释为命令,例如:


#!/bin/bash

#输出当前目录

echo "current directory is `pwd`"​​​

`pwd`列出当前目录

6.变量的作用域

shell中的变量分为全局变量和局部变量两种

6.1 全局变量

  在shell脚本中,全局变量可以在脚本中定义,也可以在某个函数中定义,在脚本中定义的变量都是全局变量,其作用域为从定义的地方开始,到脚本结束或者被显示的删除

案例:

#!/bin/bash

#定义函数

func()

 #输出变量v1的值

 echo "$v1"

 #修改变量x的值

 v1=200


#在脚本中定义变量x

v1=100

#调用函数

func

#输出变量x的值

echo "$v1"

结果:

Shell

分析:

在脚本中定义了一个全局变量v1=100, 然后调用函数,函数中打印v1的值为100,在函数中修改v1=200,最后在脚本中打印修改后的v1为200

案例:

在函数内部定义的变量也是全局变量


#!/bin/bash

#定义函数

func()

 #在函数内部定义变量

 v2=200


#调用函数

func

#输出变量的值

echo "$v2"



结果:

Shell

6.2 局部变量

在shell中,可以在函数内部通过local关键字来定义局部变量,函数的参数也是局部变量

local关键字定义局部变量

#!/bin/bash

#定义函数

func()

 #使用local关键字定义局部变量

 local v2=200

#调用函数

func

#输出变量的值

echo "$v2"

结果:

Shell

分析:

在函数内部定义了局部变量,无法在函数外面获取,所以结果为空

6.3 全局变量和局部变量名称相同时

  函数内部的局部变量会屏蔽函数外部定义的全局变量,在出现同名的情况下,函数内部的局部变量会优先被使用

案例:

#!/bin/bash

#定义函数

func()

 #输出全局变量v1的值

 echo "global variable v1 is $v1"

 #定义局部变量v1

 local v1=2

 #输出局部变量v1的值

 echo "local variable v1 is $v1"


#定义全局变量v1

v1=1

#调用函数

func

#输出全局变量v1的值

echo "global variable v1 is $v1"

结果:

Shell


7. 系统变量

shell中常用的系统变量:

变量

说明

$n

n是一个整数,从0开始,表示参数的位置,$1表示第一个参数,$2表示第二个参数

$#

命令行参数的个数

$0

当前shell脚本的名称

$?

前一个命令或者函数的返回状态码

$*

以"参数1 参数2..."的形式将所有参数通过一个字符串返回

$@

以"参数1" “参数2”的形式返回每个参数

$$

返回本程序的进程ID(PID)

#!/bin/bash

#输出脚本的参数个数

echo "the number of parameters is $#"

#输出上一个命令的退出状态码

echo "the return code of last command is $?"

#输出当前脚本的名称

echo "the script name is $0"

#输出所有的参数

echo "the parameters are $*"

#输出其中的几个参数

echo "\\$1=$1;\\$2=$2;\\$11=$11"

执行结果:

​[root@k8s-master tmp]# bash test.sh a b c d e f g h i j k l m n

Shell

8.环境变量

Shell 的环境变量是所有Shell程序都可以使用的变量,Shell中的环境变量全部用大写字母表示

常用的Shell环境变量:

PATH:  命令搜索路径,以冒号为分隔符

HOME: 用户主目录的路径名

COLUMNS: 命令编辑模式下可使用命令行的长度

HISTFILE: 命令历史文件

HISTSIZE: 命令历史文件中最多可包含的命令条数

HISTFILESIZE: 命令历史文件中包含的最大行数

IFS: 定义shell使用的分隔符

LOGNAME: 当前的登录名

SHELL: Shell的全路径名

TERM:终端类型

TMOUT: Shell自动退出的时间,单位为秒,若设置为0,则禁止Shell自动退出

PWD: 当前工作目录

SET可以列出当前系统所有的环境变量:

Shell

案例:

#!/bin/bash

#输出命令搜索路径

echo "commands path is $PATH"

#输出当前的登录名

echo "current login name is $LOGNAME"

#输出当前用户的主目录

echo "current users home is $HOME"

#输出当前的shell

echo "current shell is $SHELL"

#输出当前的工作目录

echo "current path is $PWD"

结果:

Shell

9.变量赋值和清空

9.1 变量赋值

在shell中,变量并不需要专门的定义和初始化语言,一个没有初始化的shell变量被认为是一个空字符串。

语法:

​variable_name=value

variable_name表示变量名,value表示要赋给变量的值

案例:

​v1=Linux

v2=Centos7 Linux

v3="current users home is $HOME"

v4=123

9.2 变量的引用

在shell中,可以通过在变量名前面加上 “$” 来获取变量的值。

案例:

#!/bin/bash

v1=Linux

v2=Centos7 Linux

v3="current users home is $HOME"

v4=123



#输出变量v1的值

echo $v1

#输出变量v2的值

echo $v2

#输出变量v3的值

echo $v3

#输出变量v1的值

echo $v4

结果:

Shell

特别注意:

​echo "$v4abc"  会报错,因为v4abc会作为一个变量名,然后我们并没有定义这个变量,所以会报错

需要更改为 echo “$v4abc”

​​9.3 清除变量

当某个变量不再使用时,可以将其清除

语法:

​unset variable_name

案例:

#!/bin/bash

#定义变量v1

v1="Hello world"

#输出v1的值

echo "$v1"

#清除变量

unset v1

echo "the value of v1 has been reset"

#再次输出v1的值

echo "$v1"

结果:

​unset v1之后,输出变量为空

Shell

​​​10. 变量引用

所谓引用,是将字符串用引用符号包括起来,以防止其中的特殊字符被shell解释为其他涵义

shell中一共有4种引用符号:

双引号:  除美元符号,单引号,反引号,反斜线之外,其他所有字符都保持字面意义

单引号: 所有的字符都保持字面意义

反引号: 反引号中的字符串将被解释为shell命令

反斜线:转义字符,屏蔽后的字符的特殊意义

10.1 全引用

在shell中,当一个字符串被单引号引用起来之后,其中所有的字符,除单引号本身之外,都将被解释为字面意义,即字符本身的涵义。

案例:

#!/bin/bash

#定义变量v1

v1="test"

#输出含有变量名的字符串

echo hello,$v1

结果:

Shell

10.2 部分引用

用双引号引起来的字符串,其中所包含的字符除了美元符号($),反引号(`),反斜线(\\)之外的所有其他字符,都将被解释为字面意义,这成为部分引用

案例:

#!/bin/bash

#定义变量v1

v1="test"

#输出含有变量名的字符串

echo "hello,$v1"

结果:

Shell

11. 命令替换

所谓命令替换,是指在shell中,将某个shell命令执行的结果赋给某个变量。

语法:

`shell_command`

$(shell_command)

案例:

#!/bin/bash

#变量替换

v1=`pwd`

#输出变量的值

echo "current working directory is $v1"


或者


#!/bin/bash

#变量替换

v1=$(pwd)

#输出变量的值

echo "current working directory is $v1"

12. 转义

转义的作用是转换某些特殊字符的意义,转义用反斜线表示,当反斜线后面的一个字符具有特殊的意义时,反斜线将屏蔽字符的特殊意义,使得shell按照该字符的字面意义来解释

案例:

Shell

链接: ​​https://ke.qq.com/course/4300856?tuin=d8aedf68​

Shell




以上是关于Shell编程基础)的主要内容,如果未能解决你的问题,请参考以下文章

shell编程之grep

shell编程基础

Shell脚本编程基础

shell编程基础

第17篇 shell编程基础

Shell 编程基础 --语法快速入门