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

作者: 温新

分类: 【Linux】

阅读: 1963

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

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

我是温新

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

请登录后再评论