AI智能
改变未来

Shell自学笔记day_02


一、变量

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关键字并不像其他语言一样,返回的是函数返回值,它返回的是函数的退出状态。这里要记得区分一下,虽然在结果上没有什么区别,但是在概念上是不一样的。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Shell自学笔记day_02