shell编程学习笔记 -变量

变量的定义

在Shell语言中,变量名的大小写是敏感的

  • Shell是一种动态类型语言和弱类型语言,即在Shell中,变量的数据类型无需显示地声明,变量的数据类型会根据不同的操作有所变化。

  • 准确地讲,Shell中的变量是不分数据类型的,统一地按照字符串存储。但是根据变量的上下文环境,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等。

    根据变量类型确定的时间,可以将程序设计语言分为静态类型语言和动态类型语言。

    • 静态类型语言是在程序的编译期间就确定变量类型的语言,例如Java、C++。
    • 动态设计语言是在程序执行过程中才确定变量的数据类型的语言。例如PHP、Python。

    根据是否强制要求类型定义,可以将程序设计语言分为强类型语言和弱类型语言。

    • 强类型语言要求用户在定义变量时必须明确指定其数据类型,例如Java和C++。在强类型语言中,数据类型之间的转换非常重要。
    • 弱类型语言则不要求用户明确指定变量的数据类型,例如VBScript。用户可以将任意类型的数值赋给该变量。并且,变量的数据类型之间的转换也无需明确进行。

为了更好地控制变量的相关属性,bash提供了一个名称为declare的命令来声明变量

declare attribute variable

其中,attribute表示变量的属性,常用的属性有如下所述。

  • -p:显示所有变量的值。
  • -i:将变量定义为整数。在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0。
  • -r:将变量声明为只读变量。只读变量不允许修改,也不允许删除。
  • -a:变量声明为数组变量。但这没有必要。所有变量都不必显式定义就可以用做数组。事实上,在某种意义上,所有变量都是数组,而且赋值给没有下标的变量与赋值给下标为0的数组元素相同。
  • -f:显示所有自定义函数,包括名称和函数体。
  • -x:将变量设置成环境变量,这样在随后的脚本和程序中可以使用。参数variable表示变量名称。

注意: declare命令又写做typeset。

# 定义变量 x ,并且赋值为 123
x=123
# 变量 x 加 1
let "x += 1"
# 输出变量 x 的值
echo "x = $x"
# 替换 x 中的 1 为 abc ,并且将值赋给变量 y
y=${x/1/abc}

# 定义变量 x 为整数
declare -i x
# 取消变量 x 的整数属性
declare +i x
# 输出变量x

在给变量赋值的时候,等号“=”左右两边一定不要有空格;否则,Shell会把空格前面的字符串当做Shell命令

Shell变量中的符号“$”表示取变量的值。只有在取值的时候才使用,定义和赋值时无需使用符号“$”。另外,实际上Shell中变量的原型为${var},而常用的书写形式$var只是一个简写。在某些情况下,简写形式会导致程序执行错误

变量和引号

  • 在Shell编程中,正确理解引号的作用非常重要
  • Shell语言中一共有3种引号,分别为单引号(’ ')、双引号(" ")和反引号(
  • 单引号括起来的字符都作为普通字符出现
  • 双引号括起来的字符,除“$”、“\”、“'”和“"”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待
  • 反引号括起来的字串被Shell解释为命令,在执行时,Shell首先执行该命令,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。反引号括起来的字串被Shell解释为命令,在执行时,Shell首先执行该命令,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。

反引号是键盘左上角的波浪号“~”下面的那个符号。

变量的作用域

  • Shell中的变量分为全局变量和局部变量两种
  • 全局变量是使用范围较大的变量,它不仅限于某个局部使用
  • Shell语言中,全局变量可以在脚本中定义,也可以在某个函数中定义
  • 在脚本中定义的变量都是全局变量,其作用域为从被定义的地方开始,一直到Shell脚本结束或者被显式地删除
  • 脚本中定义全局变量之外,在函数内部定义的变量默认情况下也是全局变量
  • 局部变量的使用范围较小,通常仅限于某个程序段访问
  • 在Shell语言中,可以在函数内部通过local关键字定义局部变量
  • 函数的参数也是局部变量
  • 如果用户在函数外面定义了一个全局变量,同时在某个函数内部又存在相同名称的局部变量,则在调用该函数时,函数内部的局部变量会屏蔽函数外部定义的全局变量。也就是说,在出现同名的情况下,函数内部的局部变量会优先被使用

系统变量

Shell语言的系统变量主要在对参数判断和命令返回值判断时使用,包括脚本和函数的参数,以及脚本和函数的返回值

Shell中常用的系统变量

变量说明
$nn是一个整数,从1开始,表示参数的位置,例如$1表示第1个参数,$2表示第2个参数等
$#命令行参数的个数
$0当前Shell脚本的名称
$?前一个命令或者函数的返回状态码
$*以“参数1参数2……”的形式将所有的参数通过一个字符串返回
$@以“参数1”“参数2”……的形式返回每个参数
$$返回本程序的进程ID(PID)

环境变量

  • Shell的环境变量是所有Shell程序都可以使用的变量。Shell程序在运行时,都会接收一组变量,这组变量就是环境变量。环境变量会影响到所有脚本的执行结果

常用的Shell环境变量

变量说明
PATH命令搜索路径,以冒号为分隔符。注意与Windows下不同的是,当前目录不在系统路径里
HOME用户主目录的路径名,是cd命令的默认参数
COLUMNS定义了命令编辑模式下可使用命令行的长度
HISTFILE命令历史文件
HISTSIZE命令历史文件中最多可包含的命令条数
HISTFILESIZE命令历史文件中包含的最大行数
IFS定义Shell使用的分隔符
LOGNAME当前的登录名
SHELLShell的全路径名
TERM终端类型
TMOUTShell自动退出的时间,单位为秒,若设为0则禁止Shell自动退出
PWD当前工作目录

按照惯例,Shell中的环境变量全部使用大写字母表示

变量赋值和清空

# 变量赋值语法
variable_name=value
# 例如
fruit='Apple'
price=7
# 引用变量
echo $fruit # 输出Apple
echo "the $fruit price is $price" # 输出the Apple price is 7
echo "${fruit}s" # 输出Apples
echo "$fruits" # 输出空字符串,因为没有定义变量fruits

# 清除变量语法
unset variable_name
# 例如
unset fruit
  • 没有初始化的Shell变量被认为是一个空字符串

引用和替换

在Shell中,一共有4种引用符号

引用符号说明
双引号除美元符号、单引号、反引号和反斜线之外,其他所有的字符都将保持字面意义
单引号所有的字符都将保持字面意义
反引号反引号中的字符串将被解释为Shell命令
反斜线转义字符,屏蔽后的字符的特殊意义

全引用 单引号
在Shell语句中,字符串被单引号引用后,其中所有的字符,除单引号本身外,都将被解释为字面意义,即字符本身的涵义

str="world"
echo 'Hello, $str' # 输出Hello, $str

部分引用 双引号
在Shell语句中,字符串被双引号引用后,则其中所包含的字符除美元符号(KaTeX parse error: Undefined control sequence: \) at position 16: )、反引号(`),以及反斜线(\̲)̲之外的所有其他的字符,都将被解…”、“`”和“\”仍然拥有特殊的涵义

str="world"
echo "Hello, $str" # 输出Hello, world

命令替换 单引号
在Shell程序中,将某个Shell命令的执行结果赋给某个变量。命令替换的两种语法如下:

'shell_command'
$(shell_command)
path='pwd'
echo "current working directory is $path"

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

str="world"
echo "Hello, $str" # 输出Hello, world
echo "Hello, \$str" # 输出Hello, \$str
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值