第十一章、Shell 变量

1. Shell 变量

Shell 变量在 Shell 中用一个英文名字来绑定一个数据(通常是字符串),供后续使用。

创建和修改变量的语法

变量名=

语法说明:

  1. 等号(=)两边不能有空格。
  2. 变量名必须以英文字母或下划线开头,后跟英文字母、下划线或数字(同C语言、Python变量的命名规则)。
  3. 变量区分大小写,即:Aa 是两个不同的变量。
  4. Shell 的保留字(又称作关键字),含有特殊的含义,不能作为变量名。
  5. 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:~$

练习:

  1. 写一个创建工程文件和文件夹的 Shell 程序 mk_project.sh。能够创建如下的文件夹和文件。
myproject/
├── include   └── robot.h
└── src
    ├── main.c
    └── robot.c
  1. 改写 mk_project.sh ,将 myproject 文件夹用变量 PRO_NAME 代替。当修改变量 PRO_NAME 的值为 pro2时,生成的文件夹如下:
pro2/
├── include   └── robot.h
└── src
    ├── main.c
    └── robot.c