再次声明:本专栏内容适合有基础的朋友观看
shell
格式要求
以#!/bin/bash打头声明语言类型
注意shell脚本需要有执行权限
执行shell脚本 (多种)
sh 文件名
bash 文件名
bash < 文件名
./ 文件名
bash -n 对语法进行检查
bash -x 行行执行,解释性执行
扩展:也可放到系统PATH路径包含的文件夹下,此时可在系统任意位置执行此脚本
扩展 :将命令放到远程主机 可用curl下载再用管道方式将内容定向输入到bash执行
变量常识
变量的生效范围等标准划分变量类型
普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程
,包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
变量引用
$变量名
${变量名} 须分割变量时用到
命令执行结果也可赋值给变量
HOSTNAME='hostname'
变量赋值也支持通配符
变量也可进行追加:等于字符串相加+号
pstree -p
查看系统进程关系
exec
进程替换
环境变量:
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
export
查看所有环境变量
bash内建的环境变量
PATH
SHELL
USER
UID
HOME
PWD
SHLVL #shell的嵌套层数,即深度
LANG
MAIL
HOSTNAME
HISTSIZE
_ #下划线 表示前一命令的最后一个参数
unset
取消环境变量
只读变量
只读变量:只能声明定义,但后续不能修改和删除,即常量
声明只读变量:
readonly name
declare -r name
查看只读变量:
readonly [-p]
declare -r
位置变量
位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ... 对应第1个、第2个等参数,shift [n]换位置
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异
清空所有位置变量
set --
退出状态码
进程执行后,将使用变量 $? 保存状态码的相关数字,不同的值反应成功或失败,$?取值范例 0-255
$?的值为0 #代表成功
$?的值是1到255 #代表失败
简单来说就是前一条命令执行的状态
自定义退出值:
exit 数字
退出程序且保存指定状态值
逻辑运算使用不赘述
与 &
或 |
非 !
异或 ^
1 真 0假
true
直接返回真
echo $?
0
false
直接返回假
echo $?
1
短路运算
短路与
&&
根据命令1状态来判断是否执行下一条命令,真则执行,假则不执行,跳转执行
命令三
短路或
||
第一个命令为真那么后面则不用执行
条件测试指令shell
用来判断表达式最终真假
[]
也可和test达到一定效果
做比较须有空格否则会进行赋值
[$i = $k ]
(())
可直接输入< , > ,= 符号进行比较
((i>j))
[[]]
升级版[] test
建议使用[[]]
最大特点支持通配符匹配和正则表达式匹配
使用可看帮助
help \[\[
在[]中的变量必须使用双引号,以避免不必要麻烦
(命令....)
在子进程中执行命令,影响范围,子进程
可再当前shell执行命令得到结果却不影响当前shell
(cd /data;ls;pws)
执行完成后并没有进入此文件夹
{命令....}
在当前shell环境中执行,影响范围当前shell
禁止所有普通用户登录
在etc下建立文件nologin
echo "Deny common user log" > /etc/nologin
read
将输入值分配给一个或多个变量(执行此操作会开启子shell进行操作)
不跟其他参数默认赋值给系统变量REPLAY
read NAME NV (多个变量同时赋值)
-p 给出提示信息
read -p "提示语句" 变量名
read -p "your are name:" NAME
shell登录方式
登录shell的方式会影响脚本执行顺序
可将脚本或者环境变量放到对应目录下,在登录账号时自动执行
交互式登录:
脚本执行顺序
非交互式:
用户退出时自动执行定义的脚本或命令
修改~/.bash_logout文件