一、Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
Shell支持自定义变量。
1)定义变量
定义变量时,变量名不加美元符号($),如:
-
variableName="value"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
推荐给所有变量加上花括号,这是个好的编程习惯。shell里变量的默认类型是字符串
2)重新定义变量
已定义的变量,可以被重新定义,如:
-
myUrl="http://see.xidian.edu.cn/cpp/linux/"
-
echo ${myUrl}
-
myUrl="http://see.xidian.edu.cn/cpp/shell/"
-
echo ${myUrl}
这样写是合法的,但注意,第二次赋值的时候不能写$myUrl="http://see.xidian.edu.cn/cpp/shell/",使用变量的时候才加美元符($)。
3)只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变和unset。
下面的例子尝试更改只读变量,结果报错:
-
#!/bin/bash
-
myUrl="http://see.xidian.edu.cn/cpp/shell/"
-
readonly myUrl
-
myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
运行脚本,结果如下:
/bin/sh: NAME: This variable is read only.
4)删除变量
使用 unset 命令可以删除变量。语法:
-
unset variable_name
变量被删除后不能再次使用;
unset命令不能删除只读变量。
举个例子:
-
#!/bin/sh
-
myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"
-
unset myUrl
-
echo $myUrl
上面的脚本没有任何输出。
5)变量类型
运行shell时,会同时存在三种变量:
1.局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2.环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3.shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
二、Shell特殊变量:Shell$0, $#, $*, $@, $?, $$和命令行参数
前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。
例如,$表示当前Shell进程的ID,即pid,看下面的代码:
-
$echo $$
运行结果
29949
特殊变量列表
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号("")包含时,与$*稍有不同,下面将会讲到。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于Shell脚本,就是这些脚本所在的进程ID。 |
1)命令行参数
运行脚本时传递给脚本的参数称为命令行参数。命令行参数用$n表示,例如,$1表示第一个参数,$2表示第二个参数,依次类推。
请看下面的脚本:
-
#!/bin/bash
-
echo "File Name: $0"
-
echo "First Parameter : $1"
-
echo "First Parameter : $2"
-
echo "Quoted Values: $@"
-
echo "Quoted Values: $*"
-
echo "Total Number of Parameters : $#"
运行结果:
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
2)$*和$@的区别
当没有双引号("")包含时,$*和$@都是一个一个参数分开的(有换行的意思)整体。当有双引号("")包含时,"$@"依旧是一个个参数分开,而"$*"则是所有参数作为一个整体
下面的例子可以清楚的看到$*和$@的区别:
-
#!/bin/bash
-
echo "\$*=" $*
-
echo "\"\$*\"=" "$*"
-
echo "\$@=" $@
-
echo "\"\$@\"=" "$@"
-
echo "print each param from \$*"
-
for var in $*
-
do
-
echo "$var"
-
done
-
echo "print each param from \$@"
-
for var in $@
-
do
-
echo "$var"
-
done
-
echo "print each param from \"\$*\""
-
for var in "$*"
-
do
-
echo "$var"
-
done
-
echo "print each param from \"\$@\""
-
for var in "$@"
-
do
-
echo "$var"
-
done
执行 ./test.sh"a" "b" "c" "d",看到下面的结果:
$*= a b c d
"$*"= a b c d
$@= a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d
3)退出状态
$?可以获取上一个命令或者函数的退出状态。所谓退出状态,就是上一个命令或者函数执行后的返回结果。
退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1。
不过,也有一些命令返回其他值,表示不同类型的错误。#跟C语言很相似
下面例子中,命令成功执行:
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$echo $?
0
$