LV010-变量
一、 shell 变量
1. 怎么定义?
shell 允许用户建立变量存储数据,但 不支持数据类型(整型、字符、浮点型),将 任何赋给变量的值都解释为一串字符。变量定义格式如下(支持三种形式):
Variable=value # 第一种
Variable='value' # 第二种
Variable="value" # 第三种【注意】
(1)等号两边不允许有空格。
(2)命名只能使用 英文字母,数字 和 下划线,首个字符不能以数字开头,且中间不能有空格。
(3)不能使用标点符号,而且不能使用 bash 里的关键字(可用 help 命令查看保留关键字)。
(4)第二种与第三种的区别:
以单引号 ' ' 包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们 原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的情况。
以双引号 " " 包围变量的值时,输出时会先 解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
2. 怎么赋值?
在 Bash shell 中,每一个变量的值都是字符串,无论给变量赋值时有没有使用引号,值都会以字符串的形式存储。这就意味着, Bash shell 在默认情况下不会区分变量类型,即使将整数和小数赋值给变量,它们也会被视为字符串。
- 直接赋值
Variable=value- 用语句赋值
# 赋值方式 1
Variable= command
# 赋值方式 2
Variable=$(command)
Variable=`command`【注意】用语句进行赋值时,语句一定要写在反引号符号里边,该符号为英文状态下 Esc 按键下边的哪个按键。或者也可以用 $() 的方式,这种方式看起来要更直观一些。
3. 怎么使用?
使用一个定义过的变量,只要在变量名前面加美元符号( $ )即可。
${Variable}
$Variable【注意】
(1)变量名外面的 花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。推荐给所有变量加上花括号。
(2)定义变量和给变量赋值的时候都不需要加 $ ,使用的时候才需要加上。
二、变量类型
局部变量:在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell 启动的程序不能访问局部变量。
环境变量:所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候 shell 脚本也可以定义环境变量。
shell 变量:shell 变量是由 shell 程序设置的特殊变量。 shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了 shell 的正常运行。
1. Bourne Shell 中的常用的四种变量
1.1 用户自定义变量
就是用户自己定义的变量,在 shell 编程中,通常使用全大写,例如
COUNT=11.2 位置变量
在 Linux 的命令行中,当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置参数变量来表示这些参数。
| $n | n 为数字,$0 代表命令本身,$ 1-$9 代表第 1-9 个参数,10 以上的参数需要用大括号{}包含, 例如${10},${15} |
| $* | 代表命令行中所有的参数,把所有的参数看成一个整体 |
| $@ | 代表命令行中所有的参数,不过 $@ 把每个参数区别对待 |
| $# | 代表命令行中所有参数的个数 |
【使用实例】
hk@ubuntu-22-04:~/1sharedfiles/6temp/myubuntu$ ./1.sh 1 2 3
$*=1 2 3
$#=3
$@=1 2 3
$0=./1.sh
$1=1
$2=2【注意】
(1) $n 中, n 大于等于 10 时,一定要加上 {} 。
(2) $* 与 $@ :
当 $* 和 $@ 不被双引号 " " 包含时,它们之间* 没有任何区别 ,都是将接收到的每个参数看做一份数据,彼此之间 以空格来分隔*,两者都以 "$1" "$2" … "\$n" 的形式输出所有参数。
当 $* 和 $@ 被双引号 " " 包含时, "$*" 会将* 所有的参数从整体上看做一份数据 ,而不是把每个参数都看做一份数据,以 "$1 $2 … $n" 的形式输出所有参数; "$@" 仍然将 每个参数都看作一份数据*,彼此之间是独立的,以 "$1" "$2" … "$n" 的形式输出所有参数。
| 变量 | 输出形式 | |
| 被 " " 包含 | 不被 " " 包含 | |
| $* | " $1 $ 2 … $n " | "$1" "$ 2" … "$n " |
| $@ | "$1" "$ 2" … "$n " | "$1" "$ 2" … "$n " |
例如:某命令传递了 5 个参数,那么对于 "$*" 来说,这 5 个参数会合并到一起形成 1 个数据,这一个数据包含了 5 个参数,它们之间是 无法分割 的;而对于 "$@" 来说,这 5 个参数是相互独立的,它们是 5 个数据。
1.3 预定义变量
预定义变量是在 Shell 一开始时就定义的变量,这一点和默认环境变量有些类似。不同的是,预定义变量不能重新定义,用户只能根据 Shell 的定义来使用这些变量。严格来说,位置参数变量也是预定义变量的一种,只是位置参数变量的作用比较统一,所以一般把位置参数变量单独划分为一类变量。
| $? | 最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这个变量的值为非 0 (具体是哪个数由命令自己来决定),则证明上一条命令执行错误。 |
| $$ | 代表当前进程的进程号(PID)。 |
| $! | 代表后台运行的最后一个进程的进程号(PID)。 |
1.4 环境变量
环境变量也称为全局变量,可以在创建它们的 Shell 及其派生出来的任意子进程 Shell 中使用,环境变量又可以分为自定义环境变量和 bash 内置的环境变量。
环境变量可以在命令行中设置和创建,用户退出命令行时这些变量值就会丢失,那如何永久保存环境变量呢?可以在用户家目录下的 .bash_profile(或者是.profile) 或 .bashrc(非用户登录模式特有,如:SSH) 文件中,这两个文件设置后是针对特定用户的,也可以在 /etc/profile 文件中定义环境变量,该文件设置后将会影响所有的用户,就是说在这三个文件中进行定义的环境变量在用户登录后就会进行初始化。
- 常见环境变量
| HOME | /etc/passwd 文件中列出的用户主目录 |
| PATH | 系统默认的可执行文件搜索路径 |
| HISTSIZE | 保留历史命令的数目上限 |
| OSTYPE | 系统类型 |
| PWD | 当前工作目录 |
| TERM | 终端类型,常用的有 vt100, ansi, vt200, xterm 等 |
| PS1, PS2 | 默认提示符($)及换行提示符(>) |
| IFS | Internal Field Separator, 默认为空格,tab 及换行符 |