Shell编程基础)

一万年来谁著史,三千里外欲封侯。这篇文章主要讲述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"
结果:

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"
结果:

分析:
在脚本中定义了一个全局变量v1=100, 然后调用函数,函数中打印v1的值为100,在函数中修改v1=200,最后在脚本中打印修改后的v1为200
案例:
在函数内部定义的变量也是全局变量


#!/bin/bash
#定义函数
func()

  #在函数内部定义变量
  v2=200



#调用函数
func
#输出变量的值
echo "$v2"




结果:

6.2 局部变量
在shell中,可以在函数内部通过local关键字来定义局部变量,函数的参数也是局部变量
?local关键字定义局部变量?
#!/bin/bash
#定义函数
func()

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

#调用函数
func
#输出变量的值
echo "$v2"
?结果:?

?分析:?
在函数内部定义了局部变量,无法在函数外面获取,所以结果为空
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"
?结果:?



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

8.环境变量
Shell 的环境变量是所有Shell程序都可以使用的变量,Shell中的环境变量全部用大写字母表示
?常用的Shell环境变量:
PATH:  命令搜索路径,以冒号为分隔符
HOME: 用户主目录的路径名
COLUMNS: 命令编辑模式下可使用命令行的长度
HISTFILE: 命令历史文件
HISTSIZE: 命令历史文件中最多可包含的命令条数
HISTFILESIZE: 命令历史文件中包含的最大行数
IFS: 定义shell使用的分隔符
LOGNAME: 当前的登录名
SHELL: Shell的全路径名
TERM:终端类型
TMOUT: Shell自动退出的时间,单位为秒,若设置为0,则禁止Shell自动退出
PWD: 当前工作目录
?SET可以列出当前系统所有的环境变量:

?案例:
#!/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"
?结果:?

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
?结果:

?特别注意:?
?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之后,输出变量为空??

???10. 变量引用
所谓引用,是将字符串用引用符号包括起来,以防止其中的特殊字符被shell解释为其他涵义
?shell中一共有4种引用符号:?
双引号:  除美元符号,单引号,反引号,反斜线之外,其他所有字符都保持字面意义
单引号: 所有的字符都保持字面意义
反引号: 反引号中的字符串将被解释为shell命令
反斜线:转义字符,屏蔽后的字符的特殊意义
10.1 全引用
在shell中,当一个字符串被单引号引用起来之后,其中所有的字符,除单引号本身之外,都将被解释为字面意义,即字符本身的涵义。
?案例:?
#!/bin/bash

#定义变量v1

v1="test"

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

echo hello,$v1
?结果:?

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

#定义变量v1

v1="test"

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

echo "hello,$v1"
?结果:

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??








    推荐阅读