bash语言文本的基本用法

目录

 三种处理逻辑

仅对当前shell生效的叫本地变量 

env 查看所有的环境变量

export设置或显示系统环境变量

unset删除指定的shell变量或函数

位置变量

空格语法错误检查

脚本错误

逻辑错误

变量定义和引用

test和 [ ] 字符串测试用法

set的用法

删除变量:unset

printf格式化并输出结果

 内建的随机数生成器变量:$RANDOM

增强型赋值: 

与或非

短路运算 

文件测试

文件权限测试: 

文件属性测试 

大于小于

判断合法ip

关于 () 和 {} 


 三种处理逻辑
  • 顺序执行:程序按从上到下顺序执行
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  • 循环执行:程序执行过程中需要重复执行多次某段语句
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 = 1

x=$[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 = 1

x=$[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 = 0

x=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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值