目录
三种处理逻辑
- 顺序执行:程序按从上到下顺序执行
- 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
- 循环执行:程序执行过程中需要重复执行多次某段语句
shell的配置以及相关用
仅对当前shell生效的叫本地变量
()里面的变量仅对()里面的生效。属于单独进程
全局配置:针对所有用户皆有效
全局配置最好写在/etc/profile.d/*.sh里面,不想要了直接删了
/etc/profile #一般环境变量放在这里
/etc/profile.d/*.sh
/etc/bashrc #别名放在这里 虽说作用一样但是分开比较好
个人配置:只针对特定用户有效
~/.bash_profile
~/.bashrc
交互式登录
直接通过终端输入账号密码登录
使用 su - UserName 切换的用户
#放在每个文件最后
/etc/profile.d/*.sh
/etc/bashrc
/etc/profile
/etc/bashrc #此文件执行两次
~/.bashrc
~/.bash_profile
非交互式登录
su UserName
图形界面下打开的终端
执行脚本
任何其它的bash实例
执行顺序
etc/profile.d/*.sh
/etc/bashrc
~/.bashrc
- source 在当前进程执行配置文件
- bash 在子进程执行配置文件
Bash 退出任务
保存在~/.bash_logout文件中(用户),在退出登录shell时运行
功能:
- 创建自动备份
- 清除临时文件
env 查看所有的环境变量
export设置或显示系统环境变量
补充说明
export命令 用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。
一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执 行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。
unset删除指定的shell变量或函数
-f:仅删除函数;
-v:仅删除变量。
vim /etc/profile.d/env.sh #有空可以在这里里面写上所有颜色,方便脚本引用
或者在vim /etc/profile.d/里面单独创建文件,也可
不加点就可以读取,为什么这里加点呢?/不加点是创造新的进程读取,加点是在原进程读取
位置变量
$1, $2, ... 对应第1个、第2个等参数,shift [n]换位置
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异
- wait 进程里面的所有子进程执行完之后,在退出
- tee 的功能是从标准输入读取,再写入标准输出和文件
空格语法错误检查
- cat -A som #暴露空格错误
- vim里面可以用 :set list #暴露空格问题
脚本错误
- bash -n /path/to/som 用来测试语法错误(非执行)bash -x /path/to/so调试执行试错
逻辑错误
- 默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用
- bash -x 进行观察 逻辑错误:只能使用 bash -x 进行观察
变量定义和引用
环境变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
弱引用和强引用
"$name" 弱引用,其中的变量引用会被替换为变量值
'$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
bash:弱引用不需要强调数字类型(字符,数值)
test和 [ ] 字符串测试用法
- tset -v #判断是否存在
- [ -v name]也可以比较[ ]醒目
set的用法
set 查看的本地值 wei=123 | set |grep wei
set -o #当有错误立马停下及时止损,
set -u #空变量立马停止
-z 字符串是否为空,没定义或空为真,不空为假, [ -z name]
-n 字符串是否不空,不空为真,空为假
删除变量:unset <name>
printf格式化并输出结果
替换符 功能
%s 字符串
%d,%i 十进制整数
%f 浮点格式
%c ASCII字符,即显示对应参数的第一个字符
%b 相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转
义
%o 八进制值
%u 不带正负号的十进制值
%x 十六进制值(a-f)
%X 十六进制值(A-F)
%% 表示%本身
用法
[root@centos8 ~]#printf "%s" 1 2 3 4
1234[root@centos8 ~]#
[root@centos8 ~]#printf "%s\n" 1 2 3 4
1
2
3
4
[root@centos8 ~]#printf "%f\n" 1 2 3 4
1.000000
2.000000
3.000000
4.000000
#.2f 表示保留两位小数
[root@centos8 ~]#printf "%.2f\n" 1 2 3 4
1.00
2.00
3.00
4.00
[root@centos8 ~]#printf "(%s)" 1 2 3 4;echo
(1)(2)(3)(4)
[root@centos8 ~]#printf " (%s) " 1 2 3 4;echo ""
(1) (2) (3) (4)
[root@centos8 ~]#printf "(%s)\n" 1 2 3 4
(1)
(2)
(3)
(4)
[root@centos8 ~]#printf "%s %s\n" 1 2 3 4
1 2
3 4
[root@centos8 ~]#printf "%s %s %s\n" 1 2 3 4
1 2 3
4
#%-10s 表示宽度10个字符,左对齐
[root@centos8 ~]#printf "%-10s %-10s %-4s %s \n" 姓名 性别 年龄 体重 小明 男 20 70 小红 女 18 50
姓名 性别 年龄 体重
小明 男 20 70
小红 女 18 50
#将十进制的17转换成16进制数
[root@centos8 ~]#printf "%X" 17
11
#将十六进制C转换成十进制
[root@centos8 ~]#printf "%d\n" 0xC
12
[root@rocky8 ~]#VAR="welcome to Magedu";printf "\033[1;32m%s\033[0m " $VAR
welcome to Magedu
[root@centos8 ~]#VAR="welcome to Magedu";printf "\033[1;32m%s\033[0m\n" $VAR
welcome
to
Magedu
[root@centos8 ~]#VAR="welcome to Magedu";printf "\033[1;32m%s\033[0m\n" "$VAR"
welcome to Magedu
内建的随机数生成器变量:$RANDOM
$RANDOM 取值范围:0-32767
随机字体颜色
[root@centos8 ~]#echo -e "\033[1;$[RANDOM%7+31]mhello\033[0m"
增强型赋值:
增强型赋值:
格式:
范例:
范例:
+= i+=10 相当于 i=i+10
-= i-=j 相当于 i=i-j
*=
/=
%=
++ i++,++i 相当于 i=i+1
-- i--,--i 相当于 i=i-1
与或非
true, false 真。加
与:& 和0相与结果为0,和1相与结果保留原值, 一假则假,全真才真
0 与 0 = 0
0 与 1 = 0
1 与 0 = 0
1 与 1 = 1x=$[2&6]
echo $x
2
x=$[7&3]
echo $x
3
或:| 和1相或结果为1,和0相或结果保留原值,一真则真,全假才假
0 或 0 = 0
0 或 1 = 1
1 或 0 = 1
1 或 1 = 1x=$[7|3]
echo $x
7
x=$[2|5]
echo $x
7
非:!
! 1 = 0 ! true
! 0 = 1 ! false
异或:^
异或的两个值,相同为假,不同为真。两个数字X,Y异或得到结果Z,Z再和任意两者之一X异或,将得出另一个值Y
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0x=10;y=20;temp=$x;x=$y;y=$temp;echo x=$x,y=$y
x=20,y=10
x=10;y=20;x=$[x^y];y=$[x^y];x=$[x^y];echo x=$x,y=$y
x=20,y=10
[root@CentOS ~]# i=10; let j=i++;echo j=$j i=$i
j=10 i=11
[root@CentOS ~]# i=10; let j=++i;echo j=$j i=$i
j=11 i=11
短路运算
短路与 &&
CMD1 && CMD2
第一个CMD1结果为真(1),第二个CMD2必须要参与运算,才能得到最终的结果
第一个CMD1结果为假(0),总的结果必定为0,因此不需要执行CMD2
短路或 ||
CMD1 || CMD2
第一个CMD1结果为真(1),总的结果必定为1,因此不需要执行CMD2
第一个CMD1结果为假(0),第二个CMD2 必须要参与运算,才能得到最终的结果
短路与和或组合
CMD1 && CMD2 || CMD3
当CMD1执行成功时,会执行CMD2
当CMD1执行失败时,会执行CMD3
注意: CMD1 || CMD2 && CMD3 逻辑不通,不使用
文件测试
-a FILE:同 -e
-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
[ ! -e /etc/issue ] #判断文件是否存在
echo $?
1
[ -d /etc ] #判断目录是否存在目录
echo $?
0
[ -d /etc/issue ]
echo $?
1
文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
注意:最终结果由用户对文件的实际权限决定,而非文件属性决定
文件属性测试
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组
FILE1 -ef FILE2 #FILE1是否是FILE2的硬链接
FILE1 -nt FILE2 #FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2 #FILE1是否旧于FILE2
大于小于
Linux下有一些判断比较的逻辑,下面解释一下相关关键字的意思:
-gt是大于的意思。
-eq是等于的意思。
-ne是不等于的意思。
-ge是大于等于的意思
-lt是小于的意思。
-le是小于等于的意思
#字符串测试用法 [[ ]]正则表达式
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中为扩展的正则表达式
[root@centos8 ~]#FILE="ab"
[root@centos8 ~]#[[ $FILE == a* ]]
[root@centos8 ~]#echo $?0
[root@centos8 script]#SCORE=101
[root@centos8 script]#[[ $SCORE =~ 100|[0-9]{1,2} ]]
[root@centos8 script]#echo $?
0判断合法ip
[root@centos8 ~]#[[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
[root@centos8 ~]#echo $?
1#结论:[[ == ]] == 右侧的 * 做为通配符,不要加“”,只想做为*符号使用时, 需要加 “” 或转义
关于 () 和 {}
( list ) 会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境
{ list; } 不会启子shell, 在当前shell中运行,会影响当前shell环境
[root@centos8 ~]#name=mage;(echo $name;name=wang;echo $name );echo $name
mage
wang
mage
[root@centos8 ~]#name=mage;{ echo $name;name=wang;echo $name; } ;echo $name
mage
wang
wang