Shell学习笔记(二)

一. Shell变量的定义

1. 在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储,在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串。

2. Shell 支持以下三种定义变量的方式:

variable=value
variable='value'
variable="value"

3. 以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。

4. 以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

注意,赋值号=的周围不能有空格,和大部分编程语言都不一样。

二. 变量的使用

1. 使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:

author="physics"
echo $author
echo ${author}

推荐给所有变量加上花括号{ },这是个良好的编程习惯。

2. 已定义的变量,可以被重新赋值,第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$。

3. Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

variable=`command`
variable=$(command)

第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆;

第二种方式把命令用$()包围起来,区分更加明显。

4. 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

5. 使用 unset 命令可以删除变量:

unset variable_name

变量被删除后不能再次使用;unset 命令不能删除只读变量。

三. 全局变量

1. 在 Shell 中定义的变量,默认就是全局变量。

2. 全局变量的作用范围是当前的 Shell 会话,而不是当前的 Shell 脚本文件,它们是不同的概念。打开一个 Shell 窗口就创建了一个 Shell 会话,打开多个 Shell 窗口就创建了多个 Shell 会话,每个 Shell 会话都是独立的进程,拥有不同的进程 ID。在一个 Shell 会话中,可以执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。

四. 局部变量

1. Shell 函数和 C/C++、Java 等其他编程语言函数的一个不同点就是:在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果。

#!/bin/bash
#定义函数
function func(){
    a=99
}
#调用函数
func
#输出函数内部的变量
echo $a

输出:99

2. 要想变量的作用域仅限于函数内部,那么可以在定义时加上local命令,此时该变量就成了局部变量。

#!/bin/bash
#定义函数
function func(){
    local a=99
}
#调用函数
func
#输出函数内部的变量
echo $a

输出结果为空,表明变量 a 在函数外部无效,是一个局部变量。在 JavaScript 函数内部定义的变量,默认也是全局变量,只有加上var关键字,它才会变成局部变量。

五. 环境变量

1. 全局变量只在当前 Shell 会话中有效,如果使用export命令将它导出,那么它就在所有的子 Shell 中也有效了,这称为“环境变量”。

2. 环境变量被创建时所处的 Shell 被称为父 Shell,如果在父 Shell 中再创建一个 Shell,则该 Shell 被称作子 Shell。当子 Shell 产生时,它会继承父 Shell 的环境变量为自己所用,所以说环境变量可从父 Shell 传给子 Shell。

$ a=22      #定义一个全局变量
$ echo $a    #在当前Shell中输出a,成功
22
$ bash    #进入子Shell
$ echo $a    #在子Shell中输出a,失败

$ exit    #退出子Shell
exit
$ export a    #将a导出为环境变量
$ bash    #重新进入子Shell
$ echo $a    #在子Shell中再次输出a,成功
22
$ exit    #退出子Shell
exit
$ exit    #退出父Shell,结束整个Shell会话

1) export a这种形式是在定义变量 a 以后再将它导出为环境变量,如果想在定义的同时导出为环境变量,可以写作export a=22。

2) 通过export命令导出的环境变量是临时的,关闭 Shell 会话后它就销毁了。所以,这种环境变量也只是在局部范围内起作用,并不影响所有 Shell。如果想让环境变量在所有 Shell 中都有效,并且能够永久保存,在关闭 Shell 后也不丢失,那么就需要把环境变量写入启动文件。

六. Shell位置参数

1. 定义 Shell 函数时不能带参数,但是在调用函数时却可以传递参数,这些传递进来的参数,在函数内部就也使用$n的形式接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

2. 给脚本文件传递参数

#!/bin/bash
echo "Process ID: $$"  #当前 Shell 进程 ID
echo "File Name: $0"   #当前脚本的文件名
echo "First Parameter : $1"  #传递给脚的第一个参数
echo "Second Parameter : $2"  #传递给脚的第二个参数
echo "All parameters 1: $@"  #传递给脚本或函数的所有参数
echo "All parameters 2: $*"  #传递给脚本或函数的所有参数
echo "Total: $#" #传递给脚本或函数的参数个数

运行 test.sh,并附带参数:

$ chmod +x ./a.sh
$ ./test.sh Shell Linux

运行结果为:
Process ID: 2788
File Name: ./test.sh
First Parameter : Shell
Second Parameter : Linux
All parameters 1: Shell Linux
All parameters 2: Shell Linux
Total: 2

3. 给函数传递参数

#!/bin/bash
#定义函数
function func(){
    echo "Language: $1"
    echo "URL: $2"
    echo "First Parameter : $1"
    echo "Second Parameter : $2"
    echo "All parameters 1: $@"
    echo "All parameters 2: $*"
    echo "Total: $#"
}
#调用函数
func Shell Ubuntu

运行结果:

七. Shell $?

1. $? 获取上一个命令的退出状态

先编写下面的代码,并保存为 a.sh:
 

#!/bin/bash
if [ $1 == 100 ]
then
   return 0  #参数正确,返回0
else
   return 1  #参数错误,返回1
fi

再编写下面的代码,并保存为 b.sh:

#!/bin/bash
echo $?

先运行 a.sh,传递参数 100,然后再运行 b.sh,结果如下:

$ . ./a.sh 100
$ . ./b.sh
0

如果将传递给 a.sh 的参数改为 89,b.sh 的运行结果就不同了:

$ . ./a.sh 89
$ . ./b.sh
1

2. $? 获取函数的返回值

#!/bin/bash
#得到两个数相加的和
function add(){
    return `expr $1 + $2`
}
add 231 100  #调用函数
echo $?  #获取函数返回值

运行 test.sh:

$ . ./test.sh
331

expr命令为Linux中的命令,一般用于整数值计算,但也可用于字符串操作。
格式:          expr argument operator argument
参数说明:   argument:为第一个参数
                  operator:为操作运算符
                  argument:为第二个参数
 

猜你喜欢

转载自blog.csdn.net/weixin_40599145/article/details/87594883
今日推荐