Shell支持自定义变量。



定义变量



定义变量时,变量名不加美元符号($)


同时,变量名的命名须遵循如下规则:

首个字符必须为字母(a-z,A-Z)。

中间不能有空格,可以使用下划线(_)。

不能使用标点符号。

不能使用bash里的关键字(可用help命令查看保留关键字)。



注意:​变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。

eg:


myname="liguodong"


使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:


my_name="liguodong"
echo $my_name
echo ${my_name}

执行:

bash test03.sh 或者 sh test03.sh


变量名外面的​花括号是可选的​,加不加都行,加花括号是为了帮助解释器识别变量的边界。

比如下面这种情况:

Linux Shell 学习笔记(三)--Shell变量_bash


如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。


Linux Shell 学习笔记(三)--Shell变量_编程语言_02

推荐​给所有变量加上花括号,这是个好的编程习惯。


重新定义变量

已定义的变量,可以被重新定义,如:


myUrl="Mark"

echo ${myUrl}

myUrl="Jason"

echo ${myUrl}


这样写是合法的,但注意,第二次​赋值​的时候不能写 $myUrl="http://see.xidian.edu.cn/cpp/shell/",​使用​变量的时候才加美元符($)。



只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。


下面的例子尝试更改只读变量,结果报错:


#!/bin/bash

myUrl="Jason"

readonly myUrl

myUrl="Ivy"

Linux Shell 学习笔记(三)--Shell变量_shell_03

运行脚本,结果如下:


test03.sh: 行 22: myname: 只读变量




删除变量

使用 unset 命令可以删除变量。语法:


unset my_name


变量被删除后不能再次使用, unset 命令不能删除只读变量。

Linux Shell 学习笔记(三)--Shell变量_shell_04

上面的脚本没有任何输出。


变量类型

运行shell时,会同时存在三种变量:

1) 局部变量

局部变量在脚本或命令中定义​,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。


2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,​有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。


3) shell变量

shell变量是​由shell程序设置的特殊变量。​shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。



特殊变量

前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

例如,$ 表示当前Shell进程的ID,即pid 。

Linux Shell 学习笔记(三)--Shell变量_bash_05

命令行参数

运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

脚本:

Linux Shell 学习笔记(三)--Shell变量_bash_06

运行结果:

Linux Shell 学习笔记(三)--Shell变量_编程语言_07



$* 和 $@ 的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。


但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。


下面的例子可以清楚的看到 $* 和 $@ 的区别:

Linux Shell 学习笔记(三)--Shell变量_bash_08



执行 ./test.sh "a" "b" "c" "d",看到下面的结果:


Linux Shell 学习笔记(三)--Shell变量_bash_09






退出状态

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。


退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

不过,也有一些命令返回其他值,表示不同类型的错误。

下面例子中,命令成功执行:


Linux Shell 学习笔记(三)--Shell变量_脚本_10

运行结果:

Linux Shell 学习笔记(三)--Shell变量_bash_11

$? 也可以表示函数的返回值。