3.变量和参数
变量的赋值
$var、var,区别好这两个,就基本能正常使用变量了,var只是变量的名字,好比一个人的名字,狗蛋啊、狗剩啊……$var才是这个变量的值,实际上$var只是${var}的简化方式,有的地方写成$var会不好理解,就要写成${var}的形式了。
1 2 3 4 5 6
| # a="hello" # echo $a #------------------------ 变量的复制用=,左右两边不能有空格 声明变量的时候不需要$,使用的时候需要$ #------------------------
|
变量是没有类型的
1 2 3 4 5 6 7 8
| a=123 a=${a/3/b}
将a中的数字直接替换成字符,这是a便是一个字符串了 实际上变量没有类型区别,再次将字符b替换成数字, a又变成了数字
a=${a/b/4}
|
这样增加了脚本的灵活性,但是很容易出现错误,写脚本时要做好一定的
变量检查
特殊的变量
环境变量
大多数情况下,一个进程会有一个“进程表”,它是一组进程使用的环境变量。一个Shell启动时,会创建一个相应的“进程表”,当更新一个变量时,这个表会立即更新,shell的子进程可以继承它的环境变量。
如果一个脚本要设置一个环境变量,需要将它导出,通知给执行这个脚本的进程,使用export进行导出
set、export和env区别
检查环境变量常用到的几个命令有set,export和env,举个例子看一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| set --- 当前shell的变量,包括当前用户变量 env --- 显示当前用户变量 export --- 显示当前导出成用户变量的shell变量
var_test=1
_=var_test var_test=1
var_test=1
declare -x var_test="1"
|
位置参数
$0是脚本的名字,$1是第一个参数,$2是第二个参数,$3是第三个,以此类推。在位置参数$9之后的参数必须用括号括起来,例如:${10}, ${11}, ${12}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| $* $@都表示命令行中所有的参数(不包括$0,区别在于使用被“”修饰的时候,$*会将所有参数作为一个整体,用下面的脚本测试一下:
#!/bin/bash
echo "---------With \"\"--------" echo "\"\$*\":" for var in "$*" do echo $var done echo
echo "\"\$@\":" for var in "$@" do echo $var done echo
echo "---------Without \"\"--------" echo "\$*:" for var in $* do echo $var done echo
echo "\$@:" for var in $@ do echo $var done echo
|
执行脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
---------With ""-------- "$*": a b c d
"$@": a b c d
---------Without ""-------- $*: a b c d
$@: a b c d
|
shift命令
shift命令会使命令行参数移位,删除$1位置的参数,将后面的参数均向前移位
测试脚本:
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash
until [ -z "$1" ] do echo "$1" shift done
echo exit 0
|
执行脚本: