第十一章、Shell 变量
1. Shell 变量
Shell 变量在 Shell 中用一个英文名字来绑定一个数据(通常是字符串),供后续使用。
创建和修改变量的语法
变量名=值
语法说明:
- 等号(
=)两边不能有空格。 - 变量名必须以英文字母或下划线开头,后跟英文字母、下划线或数字(同C语言、Python变量的命名规则)。
- 变量区分大小写,即:
A和a是两个不同的变量。 - Shell 的保留字(又称作关键字),含有特殊的含义,不能作为变量名。
- Shell 变量绑定的值的默认类型是字符串。
Shell 中的保留字(关键字)
! do esac in
{ done fi then
} elif for until
case else if while
如:
name="张三"
age=18
name 和 age 绑定的都是字符串
变量取值
变量取值是根据变量名来获取变量绑定的值。
取值语法
$变量名
# 或
${变量名}
如:
weimingze@mzstudio:~$ name="张三"
weimingze@mzstudio:~$ age=18
weimingze@mzstudio:~$ echo $name
张三
weimingze@mzstudio:~$ echo ${name}
张三
weimingze@mzstudio:~$ echo $age
18
weimingze@mzstudio:~$ echo ${age}
18
weimingze@mzstudio:~$ echo "姓名:${name}, 年龄:$age"
姓名:张三, 年龄:18
weimingze@mzstudio:~$ echo $age+1
18+1
weimingze@mzstudio:~$
双引号字符串和单引号字符串
- 双引号:解析变量和特殊字符(如
$等)并保护空白字符。 - 无引号:解析变量和特殊字符(如
$等),不保护空白字符。 - 单引号:原样输出,不解析变量。
如:
weimingze@mzstudio:~$ name="张三"
weimingze@mzstudio:~$ age=18
weimingze@mzstudio:~$ echo "姓名:${name}, 年龄:$age"
姓名:张三, 年龄:18
weimingze@mzstudio:~$ echo 姓名:${name}, 年龄:$age
姓名:张三, 年龄:18
weimingze@mzstudio:~$ echo '姓名:${name}, 年龄:$age'
姓名:${name}, 年龄:$age
双引号字符串保护空白字符
如:
weimingze@mzstudio:~$ ABCD="a b c d"
weimingze@mzstudio:~$ echo "$ABCD"
a b c d
weimingze@mzstudio:~$ echo "${ABCD}"
a b c d
weimingze@mzstudio:~$ echo ${ABCD}
a b c d
weimingze@mzstudio:~$ echo '${ABCD}'
${ABCD}
weimingze@mzstudio:~$
删除变量
用 unset 命令移除变量(不能删除只读变量):
weimingze@mzstudio:~$ name="张三"
weimingze@mzstudio:~$ age=18
weimingze@mzstudio:~$ echo "姓名:${name}, 年龄:$age"
姓名:张三, 年龄:18
weimingze@mzstudio:~$ unset name
weimingze@mzstudio:~$ echo "姓名:${name}, 年龄:$age"
姓名:, 年龄:18
${name} 显示为空。
只读变量
使用 readonly 命令设置的变量为只读变量,只读变量不能修改,不能删除。
创建只读变量命令
readonly 变量名=值
如:
weimingze@mzstudio:~$ readonly pi=3.1415
weimingze@mzstudio:~$ echo $pi
3.1415
weimingze@mzstudio:~$ pi=3.14
-bash: pi: readonly variable
weimingze@mzstudio:~$ unset pi
-bash: unset: pi: cannot unset: readonly variable
weimingze@mzstudio:~$ echo $pi
3.1415
使用 readonly -p 可以列出所有的只读变量
weimingze@mzstudio:~$ readonly -p
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:globskipdots:histappend:interactive_comments:login_shell:patsub_replacement:progcomp:promptvars:sourcepath"
declare -ar BASH_VERSINFO=([0]="5" [1]="2" [2]="21" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
declare -ir EUID="1000"
declare -ir PPID="9022"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="1000"
declare -r pi="3.1415"
默认值处理
在变量取值时,如果没有此变量,取值可以使用默认值。
语法
${变量:-默认值}
如:
weimingze@mzstudio:~$ echo ${myundef_var}
weimingze@mzstudio:~$ echo ${myundef_var:-"mydefault_value"}
mydefault_value
weimingze@mzstudio:~$
练习:
- 写一个创建工程文件和文件夹的 Shell 程序
mk_project.sh。能够创建如下的文件夹和文件。
myproject/
├── include
│ └── robot.h
└── src
├── main.c
└── robot.c
- 改写 mk_project.sh ,将 myproject 文件夹用变量
PRO_NAME代替。当修改变量PRO_NAME的值为pro2时,生成的文件夹如下:
pro2/
├── include
│ └── robot.h
└── src
├── main.c
└── robot.c