变量简单的理解就是在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开始);第三位代表从第二位数开始截取几位