6.shell脚本基础笔记-shell相关展开和引用

作者: 温新

分类: 【Linux】

阅读: 1643

时间: 2022-03-02 12:45:28

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>

我是温新

每天进行一步点,就一点点

请登录后再评论