一、Shell 的变量的介绍
1)Linux Shell 中的变量分为:系统变量和用户自定义变量。
2)常用系统变量
系统变量:$HOME
、$PWD
、$SHELL
、$USER
等等
比如: echo $HOME 等等
3)显示系统变量
env:查看所有全局环境变量
printenv:查看所有的系统全局环境变量
printenv 环境变量:查看指定的环境变量(变量前不需要加 $)
4)显示所有变量(系统变量+用户自定义的变量)
显示当前 shell 中所有变量:set 显示所有系统的,用户自定义的变量
二、自定义 shell 变量
1、基本语法
1)定义变量:变量=值
2)撤销变量:unset 变量
3)声明静态变量:readonly 变量,注意:不能 unset
2、定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
- 等号两侧不能有空格,变量名称一般习惯为大写
- 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,需要使用双引号或单引号括起来。
快速入门
案例 1:定义变量 A
[niujifei@njf ~]$ A=5
[niujifei@njf ~]$ echo $A
5
案例 2:给变量 A 重新赋值
[niujifei@njf ~]$ A=8
[niujifei@njf ~]$ echo $A
8
案例 3:撤销变量 A
[niujifei@njf ~]$ unset A
[niujifei@njf ~]$ echo $A
案例 4:声明静态的变量 B=2,不能 unset
[niujifei@njf ~]$ readonly B=2
[niujifei@njf ~]$ echo $B
2
[niujifei@njf ~]$ B=9
-bash: B: 只读变量
[niujifei@njf ~]$ unset B
-bash: unset: B: 无法反设定: 只读 variable
案例 5:在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
[niujifei@njf ~]$ C=1+2
[niujifei@njf ~]$ echo $C
1+2
案例 6:变量的值如果有空格,需要使用双引号或单引号括起来
[niujifei@njf ~]$ D=I love shell
-bash: love: 未找到命令
[niujifei@njf ~]$ D="I love shell"
[niujifei@njf ~]$ echo $D
I love shell
案例 7:可把变量提升为全局环境变量,可供其他 shell 程序使用
export 变量名
[niujifei@njf ~]$ cat helloWorld.sh
#!/bin/bash
echo "hello world!"
echo $B
[niujifei@njf ~]$ ./helloWorld.sh
hello world!
[niujifei@njf ~]$
发现并没有打印输出变量 B 的值
三、设置环境变量
1、基本语法
- export 变量名=变量值 (功能描述:将 shell 变量输出为系统环境变量)
- source 配置文件 (功能描述:让修改后的配置信息立即生效)
- echo $ 变量名 (功能描述:查询环境变量的值)
2、入门案例
(1)在 helloworld.sh 文件中定义 TOMCAT_HOME 环境变量
[niujifei@njf ~]$ cat helloWorld.sh
#!/bin/bash
echo "hello world!"
echo $B
#自定义一个变量,并使用export导出为环境变量
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
(2)查看环境变量 TOMCAT_HOME 的值
[niujifei@njf ~]$ echo $TOMCAT_HOME
/opt/tomcat
(3) 在另外一个 shell 程序中使用 TOMCAT_HOME
[niujifei@njf ~]$ source helloWorld.sh
hello world!
2
[niujifei@njf ~]$ cat helloWorld.sh
#!/bin/bash
echo "hello world!"
echo $B
#自定义一个变量,并使用export导出为环境变量
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
[niujifei@njf ~]$ cat myShell.sh
#!/bin/bash
echo $TOMCAT_HOME
[niujifei@njf ~]$ ./myShell.sh
/opt/tomcat
[niujifei@njf ~]$
注意:在输出 TOMCAT_HOME 环境变量前,需要让其生效 source /etc/profile
使用 env 和 set 命令也可以看到导出的变量
注意:
export 可以把一个局部变量导出为全部变量,在子 Shell 中也可以使用,但是在子 Shell中修改了再导出后在父Shell中无法使用。
父Shell中定义修改的变量可以通过export提升为环境变量,可以在子Shell中使用。
子Shell定义修改的变量只对当前Shell可用,且无法提升为环境变量。
四、将命令的返回值赋给变量(重点)
基本语法
A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量 A
A=$(ls -la) 等价于反引号
入门案例:
[niujifei@njf ~]$ cat test2.sh
#!/bin/bash
RESULT=`ls -l /home`
echo $RESULT
echo ""
MY_DATE=$(date)
echo $MY_DATE
[niujifei@njf ~]$ ./test2.sh
总用量 4 drwx------ 2 niujifei niujifei 4096 3月 10 14:45 niujifei
2023年 03月 10日 星期五 14:45:59 CST
[niujifei@njf ~]$
五、位置参数变量
1、介绍
当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如:./myshell.sh 100 200, 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息
2、基本语法
$n(功能描述:n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 ${10})
$*(功能描述:这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待)
$#(功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)
3、位置参数变量应用实例
案例:编写一个 shell 脚本 param.sh,在脚本中获取到命令行的各个参数信息
[niujifei@njf ~]$ cat param.sh
#!/bin/bash
echo '===$n==='
echo $0
echo $1
echo $2
echo $3
echo '===$#==='
echo $#
echo '===$*==='
echo $*
echo '===$@==='
echo $@
[niujifei@njf ~]$ ./param.sh a b c
===$n===
./param.sh
a
b
c
===$#===
3
===$*===
a b c
===$@===
a b c
[niujifei@njf ~]$
六、预定义变量
1、基本介绍
就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
2、基本语法
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令
正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
3、应用实例
在一个 shell 脚本中简单使用一下预定义变量
[niujifei@njf ~]$ cat preVar.sh
#!/bin/bash
echo "当前的进程号=$$"
#后台的方式运行 myShell.sh, &在后台的方式运行
./myShell.sh &
echo "最后的进程号=$!"
echo "执行的值=$?"
[niujifei@njf ~]$ ./preVar.sh
当前的进程号=15206
最后的进程号=15207
执行的值=0
[niujifei@njf ~]$
七、把自定义脚本当做命令来运行
当我们在执行自定义的脚步是其实和执行的命令效果一样,为什么LInux支持很多命令呢?
因为这些命令也是用脚本来写的,只是放在了 /bin 目录下(真实目录的 /usr/bin),并且设置在 PATH 环境变量中,所以在任何地方都是用这些命令。
如果想要在任何地方都执行我们自定义的脚步,是不是也可以这样呢?
由于/bin,/sbin 这些目录都是系统内置的,我们不希望做修改,我们可以把脚本的目录添加到PATH路径中,查看是否生效
(1)在/root/scripts目录下创建一个Shell
(2)在 /etc/profile 中把上面的路径添加到PATH环境变量并刷新
(3)切换到任意目录,执行hello.sh 脚本
这时候就可以在任意目录执行自定义的脚步