一、变量
1.定义变量的方式
[code]params=valueparams=\'value\'params=\"value\"
值中如果不包含空白符,则使用第一种方式即可赋值。如果有了空白符,则一定需要引号包裹起来,不然会报错。
[code]params=1 23
bash: 23: command not found
这里需要注意的是,变量赋值的时候,=号两边不能有空白符,道理和上面的报错是一个原因,shell把23当成命令执行了。而shell中没有23这个指令。可以试下创建一个test2.sh,编辑以下内容,执行下。
[code]params=1 dateecho ${params}
结果如下:
2.变量的命名规范
-
变量名必须是由数字、字母、下划线组成
-
必须以字母或者下划线开头
-
不能使用关键字
3.变量的使用
[code]params=\"你好\"echo $paramsecho ${paramms}
建议保持第二种使用变量方式的习惯,加了{}是给变量化了边界,方便解释器识别变量,不然可能识别不出来。
4.单引号和双引号的区别
[code]params=\"你好\"params1=\'Hello,${params}\'params2=\"Hello,${params}\"echo ${params1}echo ${params2}
输出结果如下:
可以看出,使用单引号的话,是不会解析变量或者指令的,直接是原本是什么就输出什么。相反,双引号是会先解析变量或指令再进行输出。
5.将命令结果赋值给变量
[code]params=$(date)params1=`ls -a`echo ${params}echo ${params1}echo \"${params1}\"
输出结果如下:
建议使用$()这种格式,第二种格式有时候容易分不清,影响阅读。这边值得一提的是,如果命令的执行结果中存在空白符,使用双引号输出,则会把空白符当成换行符输出,就能看到上图中ls -a的多行输出结果。
6.只读变量和删除变量
规定只读变量之后,变量就不允许再次赋值
[code]params=\"Hello\"readonly paramsparams=\"Hello Word!\"
输出结果如下:
删除变量之后,这个变量就不能再使用,除非再次赋值
[code]params=\"Hello\"unset paramsecho \"${params}\"params=\"Hello word\"echo \"${params}\"
输出结果如下:
可以看到有个空行,其实是第三行的输出为空
7.位置参数
在脚本中加入$1,$2···$n,可以在执行脚本的命令之后,带上自己的值,有几个加几个,中间空格隔开
[code]echo \"Hello,I am $1\"echo \"I am $2 years old\"
输出结果如下:
同样,也可以在脚本中给函数传递参数值,引用函数时将赋值好传递给参数
[code]function transfer_params(){echo \"I am $1\"echo \"I am $2 years old\"}transfer_params 小鹿 25
8.特殊变量
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名。 |
$n(n≥1) | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数 |
$@ | 传递给脚本或函数的所有参数。当被双引号包围住时,和$*有点区别 |
$? | 上个命令的退出状态,或函数的返回值 |
$$ | 当前 Shell 进程 ID。 |
[code]echo \"当前脚本的文件名:$0\"echo \"传递给脚本的参数个数:$#\"echo \"传递给脚本的所有参数:$*\"echo \"传递给脚本的所有参数:$@\"echo \"上个命令的退出状态:$?\"echo \"当前进程的ID号:$$\"
输出结果如下:
$*和$@在双引号中的区别:$*会把命令行的所有参数看成一个整体,而$@会区分各个参数
[code]for i in \"$@\"doecho \"$i\"donefor i in \"$*\"doecho \"$i\"done
输出结果如下:
不在双引号中的,是一样的,都是区分各个参数的,且参数个数是$#个。
$?大部分情况下执行成功返回的数据值是0,失败会返回其他值。但是还有其他情况,如下所示
[code]#! /bin/bashfunction add(){return $(($1+$2))}add 1 2 #调用函数echo $?
输出结果如下:
这边值得一提的是,在shell中,return关键字并不像其他语言一样,返回的是函数返回值,它返回的是函数的退出状态。这里要记得区分一下,虽然在结果上没有什么区别,但是在概念上是不一样的。