Shell编程之变量
Bash常见的内部变量
可使用 set
、declare
、typeset
命令查看内部变量
可使用 env
查看环境变量
Bash内部变量 | 说明 |
---|---|
$BASH | 用于引用Bash实例的全路径名 |
$HOME | 当前用户的home目录 |
$IFS | IFS是内部字段分隔符的缩写。此变量决定当Bash解析字符串时将怎样识别字段,或单词分界线。变量$IFS的默认值是空格(空格、制表符和换行) |
$SECONDS | 脚本已经运行的秒数 |
$OSTYPE | 操作系统的类型 |
$TMOUT | 如果$TMOUT变量被指定了一个非零的值,此值就会被Bash的内部命令read作为默认的超时秒数。在一个交互式的Shell中,$TMOUT的值被作为命令行提示符等待输入的秒数,如果在指定的秒数内没有输入,Bash将自动被终结。 |
$UID | 当前用户的账号标识码(ID号),与/etc/passwd中记录的相同 |
Bash中的特殊参数
特殊参数 | 说明 |
---|---|
$* | 将扩展为从1开始的所有位置参数。如果扩展发生在双引号内,即“$*”,则扩展为包含每个参数值的单词,每个参数值用特殊变量IFS的第一个字符分隔; |
$@ | 将扩展为从1开始的所有位置参数。但当它的扩展发生在双引号内时,每个参数都扩展为分隔的单词。也就是,“$@”等价于“$1”、“$2”…。参数@与*之间的区别将在for循环的调用中显现出来; |
$# | 将扩展为位置参数的个数,用十进制表示; |
$? | 将扩展为最近一个在前台执行的命令的退出状态; |
$- | 将扩展为当前的选项标志。这些选项是在调用时,或由内部命令set指定,或由Shell自身指定; |
$$ | 将扩展为当前Shell的进程号。在一个子Shell中,它扩展为调用Shell的进程号,而不是子Shell的进程号; |
$! | 将扩展为最近一次执行的后台命令的进程号; |
$0 | 将扩展为Shell或Shell脚本的名称; |
$_ | 在Shell启动时,它被设为开始运行的Shell或Shell脚本的路径。随后,扩展为前一个命令的最后一个参数; |
$*
与$@
在 for 循环中的区别1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 !/bin/env bash
file: for-demo.sh
usage: ./for-demo.sh [parameters]
desc: ---
author: gavin
created: 2017/12/14
echo 'test: $*'
declare -i index=0
for i in $*; do
let index++
echo "${index} : ${i}"
done
echo 'test: "$*"'
index=0
for i in "$*"; do
let index++
echo "${index} : ${i}"
done
echo 'test: $@'
index=0
for i in $@; do
let index++
echo "${index} : ${i}"
done
echo 'test: "$@"'
index=0
for i in "$@"; do
let index++
echo "${index} : ${i}"
done
执行脚本:
[gavin@localhost tmp]$ ./for-demo.sh a b c
test: $*
1 : a
2 : b
3 : c
test: "$*"
1 : a b c
test: $@
1 : a
2 : b
3 : c
test: "$@"
1 : a
2 : b
3 : c
declare / typeset 定义变量
declare 与 typeset 功能一致,都是定义变量的类型;
在默认的情况下面, bash 对于变量有几个基本的定义:
- 变量类型默认为“字串”,所以若不指定变量类型,则 1+2 为一个“字串”而不是“计算式”。
- bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;
语法1
2
3
4
5
6
7
8
9
10declare [-aAfFgilrtux] [-p] [name[=value] ...]
typeset [-aAfFgilrtux] [-p] [name[=value] ...]
常用选项与参数:
-a :定义为普通数组(普通数组只能使用整数作为数组下标,起始下标为 0)
-A :定义为关联数组(关联数组可以使用字符串作为数组索引,Bash从4.0版本开始支持关联数组)
-i :定义成为整数数字
-x :用法与 export 一样,就是将后面的 variable 变成环境变量;
-r :将变量设置成为 readonly 类型,该变量不可被更改内容,也不能 unset
-p :打印变量内容
示例1
2
3
4
5
6
7
8
9 定义变量
[gavin@localhost test]$ declare -i num=10
打印变量内容
[gavin@localhost test]$ declare -p num
declare -i num="10"
[gavin@localhost test]$ declare -p BASH
declare -- BASH="/bin/bash"
参考
Linux Shell命令行及脚本编程实例详解 (第5章)
鸟哥的Linux私房菜 基础学习篇 (第10章)