通常说到变量,可能就是指的用户自定义的变量,但是Shell中变量的概念除了用户自定义变量,还包括环境变量、系统预定义变量、位置参数变量、数值变量等。

 

用户自定义变量
注意用户自定义变量只在当前的shell终端中生效。
自定义变量:变量名称可以使用字母、数字和下划线组成,但是不能以数字开头。
变量类型:Bash中,变量的默认类型都是字符串类型,如果要进行数值运算,则必须指定变量类型为数值类型,见后面的“数值运算”内容。
变量赋值:变量和值之间使用等号=连接,而且等号两边不能有空格。
命令输出赋值给变量:使用“变量名=$(命令)”的格式。
引用变量:“$变量名”,如“$name”。
变量叠加:如“aa=123”,有两种方式,一种是使用双引号和$符,“aa="$aa"456”,另一种是$符和花括号,“aa=${aa}456”。
set:可以查看系统中的所有变量。
unset 变量名:删除某个变量。

 

环境变量
环境变量分为两部分,一部分是系统环境变量,另一部分就是用户自定义环境变量(建议使用全大写的命名方式)。
环境变量在当前shell环境以及其子shell环境中都有效,并且环境变量可以写入配置文件,这样就可以在所有shell环境中生效。
export 变量名[=值]:声明或设置一个环境变量。
env:查看所有环境变量(set是查看所有的变量,包括局部变量)。
unset 变量名:删除某个变量。
常用系统环境变量:

  • PATH:系统查找命令的路径。

 

系统预定义变量
预定义其实就是系统给你定义好了,你直接用就行了,所以系统预定义变量就是一些固定的变量,需要的时候直接使用即可。
$?:表示最后一次执行的命令的返回状态。如果这个变量的值为0,表示上一个命令是正确执行的;如果这个变量的值为非0(具体返回的数字由命令自己定义),表示上一个命令是没有正确执行的。
$$:当前进程的进程号(PID)。
$!:后台运行的最后一个进程的进程号(PID)。

 

位置参数变量
位置参数变量表示的是运行脚本时给脚本传递的参数,位置参数变量其实是系统预定义变量中的一部分,但是因为它们都是跟“位置”相关,所以单独拿了出来。
$[n]:$0代表命令本身或脚本文件本身,$1-$9代表第一到第九个参数,10及以上的参数需要使用大括号,如${10}。
$*:代表命令行中的所有参数,并且它是一个整体,即for循环时只会循环一次,一次性将所有参数输出。
$@:代表命令行中的所有参数,但它相当于一个序列,即for循环每次循环都会输出一个参数。
$#:代表命令行中参数的个数。

 

接收键盘输入
read [选项] [变量名]:接收键盘输入,并将输入值赋予指定的变量。
选项:

  • -p "提示信息":等待read输入时,输出提示信息。
  • -t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间。
  • -n 字符数:read命令只接受指定的字符数,字符数够了就会自动执行命令。
  • -s:隐藏输入的数据,适用于机密信息的输入(此时不用按回车,只要字符数够了就会自动执行)。

 

数值运算
Linux中的变量默认都是字符串,想要进行数值运算,需要给变量声明变量类型。
declare [+/-][选项] 变量名:声明变量。
选项:

  • -:给变量设定类型属性。
  • +:取消变量的类型属性。
  • -i:将变量声明为整数型(integer)。
  • -x:将变量声明为环境变量(export也可以将变量声明为变量,而且export更常用)。
  • -p:显示指定变量被声明的类型。

示例:

aa=11bb=22#方式一:声明变量cc为整数型
declare -i cc=$aa+$bbecho $cc#方式二:使用expr命令,注意加号两边的空格不能省略dd=$(expr $aa + $bb)echo $dd#方式三:$((运算式))或$[运算式],前者更常用,并且推荐使用方法三,运算式中可以像数学中那样使用括号来调整优先级
ee=$(($aa+$bb))echo $ee