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