自定义变量
$ cat variable_scope.sh
#!/bin/sh
echo $a
a=2
echo $a
$ chmod a+x variable_scope.sh
$ a=1
$ ./variable_scope.sh
2
$ echo $a
1
在派生的进程中,$a
原本不存在,所以最开始打印的为空,在shell脚本执行完毕后进程结束,派生进程中的$a
被销毁,也不会影响到原shell中的$a
。
$ a=1
$ export a
$ ./variable_scope.sh
1
2
$ echo $a
1
export a
会在派生进程时,制作一个a
的副本,所以$a
最开始是存在的,但是在新进程中对变量的修改不会影响到原来的变量。
$ a=1
$ source ./variable_scope.sh
1
2
$ echo $a
2
source
会使用本地的进程运行shell脚本,所以a
在最开始是存在的,同时对a
的修改也会影响到本地的a
内建变量
当运行cmd.sh arg1 arg2 arg3
时,有一些内建的变量会自动设置
-
$0: cmd.sh
,程序名 -
$1: arg1
,第一个参数 -
$2: arg2
,第二个参数 -
$3: arg3
,第三个参数 -
$#: 3
,参数列表元素个数 -
$@: arg1 arg2 arg3
,所有参数 -
$*
,忽略"
后解析出的所有参数 -
shift
,移除参数列表的第一个参数
$?
,上一个命令的退出值,正常退出为0
$$
,当前运行shell的PID
$!
,上一个后台运行的命令的PID
IFS
,中间字段分隔符
#!/bin/sh
old_IFS="$IFS"
IFS=:
echo "Please input some data separated by colons(:) ..."
read x y z
IFS=$old_IFS
echo "x is $x y is $y z is $z"
默认值
-
:-
,变量为null时使用默认值 -
:=
,变量未定义时使用默认值
$ # 变量为null
$ a=""
$ echo ${a:-loki}
loki
$ # 变量未定义
$ echo ${b:=maomi}
maomi