Shell基础之Bash变量

一、用户自定义变量

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
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值