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"
结果:
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按照该字符的字面意义来解释
案例:
链接: https://ke.qq.com/course/4300856?tuin=d8aedf68
以上是关于Shell编程基础)的主要内容,如果未能解决你的问题,请参考以下文章