6.shell脚本基础笔记-shell相关展开和引用
hi,我是温新,一名PHPer
当你的代码被吐槽像一坨屎的时候,怎么办?那就靠近它,闻闻它的味道。
相关路径展开
路径展开
路径展开
指将*
等特殊符号替换为路径名或文件名的功能,也称通配符展开或文件名展开。
相关符号如下:
在当前目录下创建测试文件: file1.txt file2.txt file3.txt file4.txt string.c string.h string.txt
? 匹配任意一个字符
<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"># 匹配任意一个字符</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> string.?</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">string.c string.h</span><br></br><span style="color: rgb(171, 178, 191); padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"># 多个 ?</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> string.???</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">string.txt</span>
星号 匹配任意字符串
<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"># 匹配以.txt结尾的文件</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> *.txt</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">file1.txt file2.txt file3.txt file4.txt string.txt</span>
[] 匹配其中的任意一个字符串
<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> string.[ch]</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">string.c string.h</span><br></br><span style="color: rgb(171, 178, 191); padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"># 使用- 指定范围</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> file[1-3].txt</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">file1.txt file2.txt file3.txt</span>
符号组合使用
<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> *.[ch]</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">string.c string.h</span>
{}大括号展开
{}
除了可以展开字符串外,还用用于目录。
方式一:{字符串1,字符串2,...}
<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"># 创建filea.txt filec.txt两个文件</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">touch</span> file{a,c}.txt</span><br></br><span style="color: rgb(171, 178, 191); padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"># 创建目录</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">mkdir</span> <span style="">-p</span> project/{app,public}</span>
方式二:范围创建
语法:{开始值..结束值}
<span style="color: rgb(255, 192, 0);">touch file{10..12}.txt</span><br></br>
波浪线展开
波浪线展开是一种用于指定用户目录的方法。
语法:~用户名
含义:展开指定用户的主目录
<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"># 展开用户demo1的目录</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> ~demo1</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">www</span>
参数展开
若在变量名前加$
,则使用这个变量的值进行展开,这就是参数展开。参数展开时可使用{}
,如下案例:
<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> <span style="">$HOME</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="">ls</span> <span style="">${HOME}</span></span>
使用:-
展开
语法:${变量名:-值}
:-
会根据指定的变量是否被赋值来决定要展开的值。
<span style="color: rgb(255, 192, 0);"># 未定义变量,因此展开时值是 ziruchu<br></br>echo ${nickname:-ziruchu}<br></br>#定义变量<br></br>nickname=www.ziruchu.com<br></br># 输出url<br></br>echo ${nickname:-ziruchu}</span>
由此可以看出,若变量未定义时则使用参数展开的值,若定义了变量,则使用定义后的变量的值。简单的理解,:-
是为变量定义默认值。
使用:=
展开
语法:${变量名:=值}
:=
对变量进行赋值操作。若变量名没有初始化赋值,或者值为空,则对该变量进行赋值。
<span style="color: rgb(255, 192, 0);"># 对未定义的变量age初始化赋值<br></br>echo ${age:=19}<br></br>echo $age # 19</span>
:-与:=的区别是:
:-是 当变量不存在时使用默认值,并不会对该变量进行声明;
:= 声明并赋值,当变量不存在时,赋值并声明该变量
使用 :? 扩展
语法:${变量名:?值}
:?
是用于在变量没有被赋值时进行错误处理的符号。
<span style="color: rgb(255, 192, 0);"># 输出一个不存在的变量<br></br># 变量不存在就会输出 :?之后的内容<br></br>echo ${nickname:?I am not there} <br></br>-bash: nickname: I am not there</span>
如果变量
的值
是非空字符串,则直接输出变量的值。如果是空字符串,则将值
的内容输出到标准错误输出。
使用 :+ 扩展
语法:${变量名:+值}
若变量已经被赋值,则使用自定的值。
<span style="color: rgb(255, 192, 0);">name=ziruchu<br></br>echo ${name:+www.ziruchu.com} # 输出域名<br></br># 输出原变量<br></br>echo $name</span>
name变量已经定义,因此输出域名这个值,但是不会改变原变量的值。
字符串截取
语法:${变量名:数值}
从变量的值中截取一部分内容。注意,数值是从0
开始。
1)截取部分内容
<span style="color: rgb(255, 192, 0);">name=www.ziruchu.com<br></br># 截取内容为 ziruchu.com<br></br>echo ${name:4}</span>
2)根据负数取值
<span style="color: rgb(255, 192, 0);">name=wwww.ziruchu.com<br></br># 输出末尾2个字符<br></br># 输出结果是 om<br></br>echo ${name -2}</span>
使用负数取末尾的值时需要注意的是,变量名与负数之间有空格,如${变量名 空格 负数}
3)取出指定长度的内容
语法:${变量名:数值:长度}
<span style="color: rgb(255, 192, 0);">name=wwww.ziruchu.com<br></br># 取出 ziruchu<br></br>echo ${name:4:7}</span>
获取字符串长度
语法:${#变量名}
使用该方式获取长度时,若变量未被赋值或者值是空字符串,则返回0。
<span style="color: rgb(255, 192, 0);">name=www.ziruchu.com<br></br>echo ${#name}</span>
使用匹配模式进行截取
语法1:${变量名#模式}
语法2:${变量名%模式}
1)匹配删除的部分
<span style="color: rgb(255, 192, 0);">name=www.ziruchu.com<br></br># 匹配www.开头的字符串<br></br># 并删除匹配到的字符串<br></br># 然后输出剩余的字符串<br></br># 或没有匹配到则输出原字符串<br></br>echo ${name#www.}</span>
2)最短匹配获取扩展名
<span style="color: rgb(255, 192, 0);">file=20220131.001.jpg<br></br>echo ${file#*.} # 输出 001.jpg<br></br># 最长匹配<br></br>echo ${file##*.} # 输出 jpg</span>
3)删除扩展名
<span style="color: rgb(255, 192, 0);">image=20210131/1000.jpg<br></br>echo ${image%.jpg} #20210131/1000</span>
4)%%获取路径
<span style="color: rgb(255, 192, 0);">file=home.tar.gz<br></br>echo ${file%%.*} # home</span>
#
和%
的区别:
#
是字符串头部开始截取;
%
是从字符串尾部开始截取;
5)只取出文件名
<span style="color: rgb(255, 192, 0);">path=/home/demo1/www/index.php<br></br>echo ${path##*/} # index.php</span>
6)取出目录部分
<span style="color: rgb(255, 192, 0);">path=/home/demo1/www/index.php<br></br>echo ${path%/*} #/home/demo1/www</span>
先获取再替换值
语法:${变量名/模式/替换的字符串}
该语法先使用 替换的字符串
对 变量名
的值中与 模式
一致的部分进行替换,然后展开。
<span style="color: rgb(255, 192, 0);"># 将 . 替换成 _<br></br>file=home.tar.gz<br></br>echo ${file/./_} # home_tar.gz 只有一个被替换了<br></br># 替换所有点<br></br># 在替换的字符串前加 /<br></br>echo ${file//./_}</span>
命令替换
命令替换
是指将命令执行后的输出结果作为字符串展开。
$()
将执行括号中的命令,并将标准输出的结果作为字符串输出。
<span style="color: rgb(255, 192, 0);"># 将命令执行后的结果赋值的path变量<br></br>path=$(pwd)<br></br>echo $path</span>
我是温新
每天进行一步点,就一点点