变量简单的理解就是在shell脚本中存储变化的数据的载体



注意事项:
(1)变量名区分大小写

(2)赋值号两边不能有空格

(1)直接赋值给变量
#变量名=字符串或数字等
A=你好
#变量名="字符串1 字符串2"
B="HELLO 世界"

(2)命令执行结果赋值给变量
#变量名=`命令`
A=`date +%m`
#变量名=$(命令)
B=$(hostname)
示例如下:

(3)交互式定义变量——read
read [选项] 变量名

read -p "请输入姓名" name

read -p "请输入id号(4位):" -n 4 id

read -sp 请输入密码: passward

#五秒后自动退出
read -t 5 name

拓:交互式定义变量可使用输入重定向将文件中内容赋值给某一变量,示例如下:

(4)定义有类型的变量——declare
declare [选项] 变量名=变量值




declare -x A="HELLO WORLD"

unset 变量名
注:unset不止可以删除变量名还可以删除函数,格式如下:
unset -f 函数名
该分类本质上来说依据的是变量的作用范围
(1)本地变量
本地变量是当前用户自定义的变量,在当前进程有效,其他进程及当前进程的子进程均无效

注:bash命令即在当前bash下再套一层bash即上面所说的当前进程的子进程
(2)环境变量
当前进程有效当前子进程有效(“传子不传父”)

注:

注:上图仅展示部分
拓——环境变量永久生效的方法 如下:


(3)全局变量
所有用户与程序均可调用

此处我以$HOME为列简单说明,其他的用户自行思索:

(4)系统变量
全局变量的一种,shell本身已经固定了它们的名字和作用

前几条命令示例如下:



注:&表示将该命令放到后台,将一个与用户有交互的命令放到后台是最糟糕的事情,此处仅作简单解释



使用其他执行方式结果如下:

发现区别了吗?我运行同一脚本且两脚本中均有cd命令但一种方式运行出来没改变bash路径,一种方式却改变了bash路径,这就是下面的运行机制:
(1)source与.方式——使用source执行shell脚本时不会创建子进程,在父进程中直接执行(“父亲亲力亲为”)


(2)其他运行方式——会创建子进程,且子进程无法改变父进程属性,故cd失效(“父亲让儿子去做”,本质上来说它改了但他最后没了)

(1) 前台进程可以理解为依托于bash,bash关闭后该进程消失,bash中运行的脚本或命令都是前台进程(父进程为当前bash的都可以理解为前台进程)
(2)后台进程也叫守护进程不依托于bash,bash关闭后仍可运行,不需要与bash交互
拓:将前台命令或脚本强制放到后台执行命令如下:
命令/运行脚本命令 &
前者把传递的参数看作一个整体中间空格隔开(不论几个都是一个),后者将其分开看待,只在for循环且 $* 与 $@ 在双引号下可以看出区别

(1)反撇号功能为命令替换——里面必须为命令

(2)单引号中使用 ${} 与 $无效——不论是啥都当成字符串

(3)双引号中可取变量值但仍允许解析转义符换行、不换行等——有特殊的特殊处理


注:花括号中第一位代表要截取的变量;第二位代表从第几位开始截取(注意从0开始);第三位代表从第二位数开始截取几位