一、用户自定义变量
1、什么是变量
变量是计算机程序中的一种基本概念,用于保存和处理数据。在程序中,我们可以将变量看作一种“容器”或“盒子”,它们用来存储各种类型的值,并且可以随时修改和访问。在Shell中,变量是一个字符串或数字,它会被存储和处理。可以通过变量名来引用它们,并且可以在Shell脚本中使用。
2、变量规则
- 变量名必须以字母或下划线字符(_)开头,后面可以跟着任意的字母、数字或下划线。
- 变量赋值时不需要声明变量类型,可以直接给变量赋值。例如:
my_value="hello"
。 - 可以在一个变量中存储任何类型的数据,包括字符串、数字、数组等。
- 如果变量的值有空格或其他特殊字符,则需要使用引号将其括起来,例如:
my_value="hello world"
或my_value="hello,world!"
。 - 可以使用$符号来获取变量的值,例如:
echo $my_var
。 - 通过在变量名前加
$
符号,可以将变量的值引用到另一个命令或字符串中。
3、变量分类
- 用户定义的变量:用户定义的变量是由用户自己创建并设置的。例如,
name="zhj"
。 - 环境变量:环境变量是全局的,可以在所有shell会话中使用。例如,PATH变量指定了应该搜索哪些目录以查找可执行文件。
- 位置参数变量:位置参数变量提供了在脚本中传递参数的方法。例如,
$0
包含当前脚本的名称,$1
包含第一个参数,$2
包含第二个参数,以此类推。 - 预定义变量:预定义变量是由Shell程序提前定义好的变量,它们的值是由Shell程序自动设置的。这些变量可以在Shell脚本中直接使用,无需在脚本中显式地定义和初始化。
- 特殊变量:特殊变量在Shell中具有特殊用途,并且不能被修改。例如,
$?
包含上一个命令的退出状态,$$包含当前shell进程的PID。
4、用户自定义变量
在Shell脚本中,用户自定义变量是由用户在程序中手动定义和初始化的变量,其值可以在程序中进行修改。用户自定义变量的名称和含义是由用户自己定义的,没有固定的规则和限制。
用户自定义变量的定义
# 定义一个名为name的字符串变量,并初始化为"zhenghaojie"
name="zhenghaojie"
# 定义一个名为num的整数变量,并初始化为25
age=25
# 定义一个名为is_admin的布尔变量,并初始化为true
is_human=true
在定义和初始化变量后,可以在程序中调用变量的值
# 在命令行中输出变量的值
echo "name=$name, age=$age, is_human=$is_human"
修改已定义的变量的值
# 修改变量name的值为"jack"
name="jack"
# 修改变量num的值为200
num=200
# 修改变量is_admin的值为false
is_human=false
# 输出修改后的变量值
echo "name=$name, age=$age, is_human=$is_human"
使用set命令查看变量
# 查看所有存在"name"关键字的变量
set | grep name
使用unset命令来删除已定义的变量
# 删除变量name
unset name
# 删除变量age
unset age
# 删除变量is_human
unset is_human
注:在Shell脚本中,所有的变量都是字符串类型,无论你定义的变量名是否包含数字、下划线等特殊字符。不过,我们可以通过类型转换操作转换变量类型。
二、环境变量
1、什么是环境变量
在Linux中,环境变量是一些可以被操作系统或者应用程序使用的变量,它们存储在Shell进程中,可以为应用程序提供许多重要的配置信息和参数。环境变量会在当前shell以及这个shell的所有子shell中生效。
常见的Linux环境变量及其作用:
- PATH:用于指定可执行文件所在路径的环境变量。
- HOME:指定当前用户的主目录路径。
- USER:指定当前用户名。
- SHELL:指定命令行shell解释器的路径。
- PS1:指定shell提示符的格式。
- LD_LIBRARY_PATH:指定动态链接库(shared lib)所在路径的环境变量。
- TZ:指定时区。
- TERM:指定终端类型。
关于PATH:
PATH 是一个环境变量,用于指定 Linux 系统中可执行文件的搜索路径。当用户在命令行中输入一个命令时,Linux 会在 PATH 中定义的路径中查找同名的可执行文件,并在找到后执行它。如果 PATH 变量没有包含该命令所在的目录,则会提示“Command not found
”。
关于PS1:
PS1 命令用于设置 Linux Bash shell 环境下的提示符格式和内容。常见的默认提示符为 $ 或 #,但用户可以使用 PS1 命令自定义自己的提示符格式。如我的Linux系统中的该变量:
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
其中,\e
表示转义字符,\a
表示控制字符,${debian_chroot:+($debian_chroot)}
则表示条件语句。
这个命令中的具体含义如下:
\[\e]0;\u@\h: \w\a\]
:设置终端窗口的标题,其中 \u 表示当前用户,\h 表示主机名,\w 表示当前工作目录。${debian_chroot:+($debian_chroot)}
:如果系统中安装了Debian chroot,就在提示符中添加(debian_chroot)。\u@\h:\w\$
:显示当前用户名、主机名、工作目录,并以 $ 结尾。
2、设置环境变量
申明变量:export 变量名=变量值
#将PATH环境变量设置为包含 /usr/local/bin 和 /usr/bin 目录
export PATH=/usr/local/bin:/usr/bin:$PATH
查询环境变量:env
删除变量:unset 变量名
unset name
关于export:
- export 命令用于将变量设置为环境变量,使其可以在程序的整个生命周期内使用。
- export 命令是 Bash shell 的内置命令,可以标记要传递给子进程的变量和函数。
- export 命令可用于将变量设置为子进程(子shell)的环境变量。
注:
子shell是命令处理器的一个独立例子。正如命令在命令行提示符处被理解和执行一样,一个脚本/批处理运行实际上是父shell的一个支线进程(子进程)。每一个shell脚本实际上是父shell的一个子进程。
pstree
命令:pstree 命令是一个用于显示进程树的实用工具。该命令以树形结构显示当前运行在系统中的所有进程及其子进程,其中包含每个进程的PID(进程ID),以及它们之间的父子关系。
root@PC-20210418GNMD:~# pstree
init─┬─init───sshd
├─init───init───bash───bash───pstree
└─{init}
三、位置参数变量
1、什么是位置参数变量
位置参数变量是指在Shell脚本中用于获取命令行、函数或执行脚本时传递的参数的特殊变量。这些变量包括$n、$*、$@、$#
等。
$n
:n是数字,$0
代表命令本身,$1-$9
代表第一个到第九个参数,十以上的参数需要用大括号,如${10}。$*
:代表所有的位置参数。它会将所有参数看作一个字符串。例如,假设你调用了一个脚本,如:./zhj1.sh a b c
,那么$*
就表示a b c
三个参数整体。$@
:代表所有的位置参数。它会将每个参数看作一个独立的字符串。例如,假设你调用了一个脚本,如:./zhj2.sh a b c
,那么$@
表示a b c
三个参数,但是会把每个参数是独立的。$#
:计算参数的个数。比如,用./zhj3.sh a b c
调用脚本时,$#
的值为3。
2、举例
$n
#!/bin/bash
$0
sum=$(( $1+$2 ))
echo $sum
我们在终端中运行以下命令:
$ chmod 755 test.sh # 赋予脚本执行权限
$ ./test.sh 1 2
脚本会输出如下结果:
./canshu.sh
3
$#
#!/bin/bash
echo $#
我们在终端中运行以下命令:
$ chmod 755 test.sh # 赋予脚本执行权限
$ ./test.sh 1 2 3 4 5 6 7
脚本会输出如下结果:
7
$*与$@
#!/bin/bash
for i in "$*"
do
echo "par $i"
done
x=1
for y in "$@"
do
echo "$x --- $y"
x=$(( $x + 1))
done
我们在终端中运行以下命令:
$ chmod 755 test.sh # 赋予脚本执行权限
$ ./test.sh 1 2 3 4 5 6 7
脚本会输出如下结果:
par 1 2 3 4 5 6 7
1 --- 1
2 --- 2
3 --- 3
4 --- 4
5 --- 5
6 --- 6
7 --- 7
四、预定义变量
1、什么是预定义变量
预定义变量是在Linux系统中提前定义的变量,可以在Shell脚本或命令行中直接使用,无需再次定义即可使用。这些预定义变量在Shell脚本中使用较为频繁,它们包括当前用户的家目录路径、系统查找可执行文件的路径列表、上一个命令的返回值等等。
2、常用的预定义变量
$?
:上一个命令的返回值,通常用于判断命令执行是否成功(0表示成功,非0表示失败)。$$
:当前进程(Shell脚本)的进程ID(PID)。$!
:后台运行最后一个进程的进程ID(PID)。
$$与$!
例子:
#!/bin/bash
echo "$$" # 输出当前 Shell 进程的进程 ID
find /root -name hello.sh & # 在后台运行查找 /root 目录下文件名为 hello.sh 的文件的命令
echo "$!" # 输出上一个后台任务的进程 ID
注:&&
和||
这两个逻辑运算符就是通过$?
来判断上一个命令是否正确执行。
3、read命令
read是Linux Shell的一个命令,常用于从标准输入读取用户输入数据并赋值给变量。
read命令的语法为:read [选项] [变量...]
其中,主要有以下选项:
- -p(prompt):指定输出的提示信息,如
read -p "Please enter your name: " name
; - -t(timeout):指定等待用户输入的超时时间,单位为秒;
- -n(count):指定读取指定数量的字符后就结束,如
read -n1 key
表示只读取一个字符; - -s:隐藏在终端上输入的字符,通常用于读取密码等敏感信息;
举例:
#!/bin/bash
read -t 30 -p "please input your name: " name
echo $name
read -s -t 30 -p "please input your password: " password
echo -e
echo $password
read -n 1 -t 30 -p "[M/F]: " sex
echo -e
echo $sex
我们在终端中运行以下命令:
$ chmod 755 test.sh
$ ./test.sh
脚本会输出如下结果:
please input your name: zhenghaojie
zhenghaojie
please input your password:
123456
[M/F]: F
F
五、数值运算与运算符
1、declare声明变量类型
declare 命令是一个用于 shell 编程中的内建命令,它用于声明变量并设置变量的属性,也可以用来显示 shell 函数和变量等信息。
declare命令语法为:declare [+/-] [选项] [变量名]
其中:
- -:给变量设置类型属性;
- +:取消变量的类型属性;
常用选项:
- -r(readonly):将变量设置为只读;
- -i(integer):将变量设置为整数;
- -a(array):将变量设置为数组类型;
- -f(function):显示已定义的函数名称;
- -p(print):以可执行命令的形式输出变量;
- -x(export):将变量设置为环境变量;
声明举例:
#声明一个只读变量,一旦变量被定义为只读,就不能再次更改或重复定义它。
declare -r name="zhenghaojie"
#声明一个整数变量,并将其初始化为10。
declare -i num=10
#声明一个数组变量,可以使用${arr[index]}来访问数组中的元素。
declare -a arr=("zheng" "hao" "jie")
#显示已定义的所有函数名称
declare -f
#输出变量的值
declare -p PATH
#声明一个环境变量
declare -x PATH="/usr/local/bin:$PATH"
2、常用运算方法
运算举例-方法一:
a=1
b=2
declare -i c=$a+$b
运算举例-方法二:
c=$(expr $a + $b)
注:
- expr 是一个用于进行数学运算的工具,
$(...)
是命令替换,表示执行括号内的命令并将其输出作为整体值替换成当前命令行。 - +号两侧的空格必须有。
- 如果
$a
和$b
不是整数类型的变量,在进行加法运算时可能会发生错误,因此可以使用declare -i
命令将变量声明为整数类型以确保其是可加的。
运算举例-方法三:
c=$(($a+$b))
c=$[$a+$b]
注:
c=$(($a+$b))
使用的是 Bash Shell 的算术扩展(Arithmetic Expansion)语法,其中$(())
表示进行算术运算。c=$[$a+$b]
则使用的是 shell 的旧式语法,即美元符号和方括号$[ ]
进行算术运算(已不推荐)。
3、运算符
按照优先级从高到低排序,如下:
()
: 括号!
: 逻辑非*、/、%
: 乘法、除法、取模+、-
: 加法、减法<<、>>
: 位左移、位右移<、<=、>、>=
: 小于、小于等于、大于、大于等于==、!=
: 等于、不等于&
: 位与^
: 位异或|
: 位或&&
: 逻辑与||
: 逻辑或=
: 赋值运算符
举例:
算术运算符:+、-、*、/、%
a=10
b=20
# 加法
c=$((a + b))
echo $c # 输出 30
# 乘法
c=$((a * b))
echo $c # 输出 200
# 取模
c=$((a % b))
echo $c # 输出 10
位运算符:&、|、^、<<、>>
# 与运算
a=3
b=5
c=$((a & b))
echo $c # 输出 1
# 或运算
a=2
b=8
c=$((a | b))
echo $c # 输出 10
# 异或运算
a=3
b=5
c=$((a ^ b))
echo $c # 输出 6
# 左移运算
a=2
c=$((a << 2))
echo $c # 输出 8
# 右移运算
a=16
c=$((a >> 2))
echo $c # 输出 4
六、变量置换
变量置换方式 | 变量y没有设置 | 变量y为空值 | 变量y设置值 |
---|---|---|---|
x=${y-新值} | x=新值 | x为空 | x=$y |
x=${y:-新值} | x=新值 | x=新值 | x=$y |
x=${y+新值} | x为空 | x=新值 | x=新值 |
x=${y:+新值} | x为空 | x为空 | x=新值 |
x=${y=新值} | x=新值 y=新值 | x为空 y值不变 | x=$y y值不变 |
x=${y:=新值} | x=新值 y=新值 | x=新值 y=新值 | x=$y y值不变 |
x=${y?新值} | 新值输出到标准错误输出 | x为空 | x=$y |
x=${y:?新值} | 新值输出到标准错误输出 | 新值输出到标准错误输出 | x=$y |