4.Bash的变量
4.1.用户自定义变量
4.1.1.什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息的时候,如一个文件名或是一个数字,就把他存放在一个变量中。每个变量有一个名字,所以很容易引用他。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
4.1.2.变量设置规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
- 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
- 变量是用等号连接值,等号两侧不能有空格。
- 变量的值如果有空格,需要使用单引号或者双引号包括。
- 在变量的值中,可以使用“\”转义符。
- 如果需要增加变量的值,那么可以进行变量值叠加。不过变量需要用双引号包含:“$变量名”,${name}。
- 如果是把命令的结果作为变量的值赋予变量,则需要使用反引号或者$()包含命令。
- 环境变量名建议大写,便于区分。
4.1.3.变量分类
- 用户自定义变量
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
- 预定义变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
4.1.4.本地变量
name="db db"
aa=123
aa="$aa"456
aa=${aa}789
root@mfedang-virtual-machine:~# name="db db"
root@mfedang-virtual-machine:~# aa=123
root@mfedang-virtual-machine:~# aa="$aa"456
root@mfedang-virtual-machine:~# aa=${aa}789
root@mfedang-virtual-machine:~# echo $name
db db
root@mfedang-virtual-machine:~# echo $aa
123456789
root@mfedang-virtual-machine:~#
# 可以使用set命令来查看环境中的所用变量
root@mfedang-virtual-machine:~# set | more
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote
:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progc
omp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
BASH_LINENO=()
BASH_REMATCH=([0]="\\$a" [1]="\\$" [2]="" [3]="a")
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-lin
ux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=80
COMP_WORDBREAKS=$' \\t\\n"\\'><=;|&(:'
DEBUGINFOD_URLS=
DEFAULT_XDG_CONFIG_DIRS=/etc/xdg
DEFAULT_XDG_DATA_DIRS=/usr/local/share/:/usr/share/
DIRSTACK=()
EUID=0
GROUPS=()
# 使用unset name 可以删除变量
4.2.环境变量
4.2.1.环境变量是什么
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。
4.2.2.设置环境变量
# 申明变量
export 变量名=变量值
# 查询变量
env
# 删除变量
unset 变量名
# 示例
root@mfedang-virtual-machine:~# name=db
root@mfedang-virtual-machine:~# export age=20
root@mfedang-virtual-machine:~# sex=man
#这里我在父shell中创建了两个局部变量和一个全局变量
使用set命令可以查看我设置的变量信息
age=20
name=db
sex=man
使用bash,创建一个子shell
使用pstree命令查看当前在哪个shell中
-dropbear-+-dropbear---bash---bash---pstree
再一次使用set命令发现只能查看全局变量了
age=20
4.2.3.系统常见环境变量
PATH:系统查找命令的路径
root@:~# echo $PATH
/opt/qemu/bin:/usr/bin:/bin:/snap/bin
# 环境变量叠加
PATH="$PATH":/root/sh
- PS1:定义系统提示符的变量
#根据这个方式我可以改变系统前面显示的内容
# 示例
root@mfedang-virtual-machine:~# echo $PS1
\\[\\e]0;\\u@\\h: \\w\\a\\]${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$
root@mfedang-virtual-machine:~# PS1='[\\u \\W]\\$ '
[root ~]# ls
ls.txt ls2.txt lserorr.txt qemu-aarch64-static sh snap test testfile
[root ~]# cd sh/
[root sh]#
4.3.位置参数变量
4.3.1位置参数变量
# 示例 创建一个脚本文件
#!/bin/bash
echo "A total of $# parameters"
echo "The parameters is:$*"
echo "The parameters is:$@"
# 运行该脚本
[root sh]# ./show.sh 2321 2313
A total of 2 parameters
The parameters is:2321 2313
The parameters is:2321 2313
# $*和 $#的区别
#!/bin/bash
for i in "$*"
do
echo "the parameters is $i"
done
x=1
for y in "$@"
do
echo "the parameters is $y"
done
[root sh]# ./show2.sh 555 5555s sss
the parameters is 555 5555s sss #$*会一下将参数全部打印,不进行循环打印
the parameters is 555
the parameters is 5555s
the parameters is sss # $#会将参数循环打印出来
4.4.预定义变量
4.4.1.预定义变量
# 常用的是$?这个变量,判断前一个命令是否正确
[root sh]# lsd && ls
Command 'lsd' not found, but can be installed with:
snap install lsd
# 比如这里,就是根据返回值来确定命令是否执行正确的。
4.4.2.接收键盘输入
read [选项] [变量名]
选项:
-p "提示信息":在等待rend输入时,输出提示的信息
-t 秒数:rend命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数:rend命令只接受指定的字符数,就会执行
-s:隐藏输入的数据,适用于机密信息的输入
[root sh]# cat showname.sh
#!/bin/bash
read -t 30 -p "please print your name:" name
echo "name is $name"
read -t 30 -s -p "please print your age:" age
echo -e "\\n"
read -n 1 -t 30 -p "please print your gender[M/W]:" gender
echo -e "\\n"
echo "$name is a $age $gender"
[root sh]# ./showname.sh
please print your name:db
name is db
please print your age:
please print your gender[M/W]:M
db is a 20 M
5.Bash的运算符
5.1.数值运算与运算符
5.1.1.declare声明变量类型
declare [+/-] [选项] 变量名
选项:
-:给变量设定类型属性
+:取消变量的类型属性
-i:将变量声明为整数型(integer)
-x:将变量声明为环境变量
-p:显示指定变量的被声明的类型
# 示例
# 如果我设定了两个变量 aa=11,bb=22,想要做到cc=$aa+$bb
[root sh]# aa=11
[root sh]# bb=22
[root sh]# cc=$aa+$bb
[root sh]# echo $cc
11+22
# 单纯的这样加减是行不通的,这里就要使用到declare
[root sh]# declare -i cc=$aa+$bb
[root sh]# echo $cc
33
# 使用declare 将cc声明为整数型,就可以进行加减了,因为我们变量一开始默认都是字符串型的
# 方法2:expr或let数值运算工具
[root sh]# dd=$(expr $aa + $bb) 注意+两端必须有空格
[root sh]# echo $dd
33
# 方法3:$((运算式)) or $[运算式] (常用)
[root sh]# gg=$(($aa+$bb))
[root sh]# ff=$[$aa+$bb]
[root sh]# echo $aa $bb
11 22
[root sh]# echo $gg $ff
33 33
5.1.2.运算符
5.2.变量测试与内容替换
这个完全可以自己写判断语句,简便方法了解一下即可。
6.环境变量配置文件
6.1.环境变量配置文件简介
6.1.1.source命令
source 配置文件
or
.配置文件
修改了配置文件,可以使用source命令,让配置文件直接生效
6.1.2.环境变量配置文件简介
- 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量。
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
在/etc目录下的环境变量是对当前Linux系统所有用户都生效的
6.2.环境变量配置文件作用
环境变量调用优先级:
# 注意Ubuntu中.bash_profile 是 .profile
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
# 目的是为了判断 .bashrc 是否存在,存在就执行他
6.3.其他配置文件和登录信息
6.3.1.注销时生效的环境变量配置文件
~/bash_logout # 这个我的系统中没有,但是可以自定义
~/.bash_history
/etc/issue 可以通过转义符来显示刚登陆上来的显示信息,远程登录不支持