Linux 中如何对变量进行切分截取?获取文件的扩展名

简介: Linux 中如何对变量进行切分截取?获取文件的扩展名

${VAR%.*} 的含义

❏ 从 $VAR中删除位于%右侧的通配符(在上例中是.*)所匹配的字符串。通配符从右向左进行匹配。

❏ 给VAR赋值,即VAR=sample.jpg。通配符从右向左匹配到的内容是.jpg,因此从$VAR中删除匹配结果,得到输出sample。

%属于非贪婪(non-greedy)操作。它从右向左找出匹配通配符的最短结果。

还有另一个操作符%%,它与%相似,但行为模式却是贪婪的,这意味着它会匹配符合通配符的最长结果。

例如

[root@hadoop100 test]# url="www.google.com.hk"
[root@hadoop100 test]#
# 使用%操作符从右向左执行非贪婪匹配
[root@hadoop100 test]# echo ${url%.*}
www.google.com
#使用%%操作符从右向左执行贪婪匹配
[root@hadoop100 test]# echo ${url%%.*}
www

不同分隔符都可以这样使用

[root@hadoop100 test]# a="www-google-com-hk"
[root@hadoop100 test]#
[root@hadoop100 test]#
[root@hadoop100 test]# echo ${a%.*}
www-google-com-hk
[root@hadoop100 test]# echo ${a%-*}
www-google-com
[root@hadoop100 test]# echo ${a%%-*}
www

${VAR#*.}的含义

#操作符可以从文件名中提取扩展名。这个操作符与%类似,不过求值方向是从左向右

从$VARIABLE中删除位于#右侧的通配符(即在上例中使用的*.)从左向右所匹配到的字符串。和%%类似,

#也有一个对应的贪婪操作符##。##从左向右进行贪婪匹配,并从指定变量中删除匹配结果。来看一个例子:

# 使用#操作符从左向右执行非贪婪匹配
[root@hadoop100 test]# echo ${url#*.}
google.com.hk
[root@hadoop100 test]#
# 使用##操作符从左向右执行贪婪匹配
[root@hadoop100 test]# echo ${url##*.}
hk

考虑到文件名中可能包含多个.字符,所以相较于#,##更适合于从中提取扩展名。##执行的是贪婪匹配,因而总是能够准确地提取出扩展名

--update 2023年5月5日11:34:56

实例

for i in ${images};do echo ${i} ; echo ${i##*/} ;done
registry.cn-hangzhou.aliyuncs.com/kainstall/kube-apiserver:v1.22.10
kube-apiserver:v1.22.10
registry.cn-hangzhou.aliyuncs.com/kainstall/kube-scheduler:v1.22.10
kube-scheduler:v1.22.10
registry.cn-hangzhou.aliyuncs.com/kainstall/kube-controller-manager:v1.22.10
kube-controller-manager:v1.22.10
registry.cn-hangzhou.aliyuncs.com/kainstall/kube-proxy:v1.22.10
kube-proxy:v1.22.10
rancher/mirrored-flannelcni-flannel:v0.16.3
mirrored-flannelcni-flannel:v0.16.3
rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1
mirrored-flannelcni-flannel-cni-plugin:v1.0.1
registry.cn-hangzhou.aliyuncs.com/kainstall/etcd:3.5.0-0
etcd:3.5.0-0
registry.cn-hangzhou.aliyuncs.com/kainstall/coredns:v1.8.4
coredns:v1.8.4
registry.cn-hangzhou.aliyuncs.com/kainstall/pause:3.5
pause:3.5

tr、sed、变量替换伯仲之间

#!/usr/bin/env bash
#echo 'text here'
string="stirng" ; echo "$string" | sed -e "s/ir/ri/"
# 效率高于sed ,参见https://www.shellcheck.net/wiki/SC2001
string="stirng" ; echo "${string//ir/ri}"
# 获取最后一个字符
string="stirng" ; echo "$string" | sed -e "s/^.*\(.\)$/\1/"
url=/dfs/acf/A1575A1BPK1/A1298/A129803C/A129803CAR/FORMAT/A3353A129803CAR.TXT
# 获取文件名
#basename ${url}
# 获取路径
#dirname ${url}
# 变量截取从右向左非贪婪匹配,也就是说匹配到一个/就停止
echo ${url%/*}
# output:  /dfs/acf/A1575A1BPK1/A1298/A129803C/A129803CAR/FORMAT
# 变量截取从左向右贪婪匹配,也就是说从左往右贪婪匹配/,直到最后一个才停止
echo ${url##*/}
# output: A3353A129803CAR.TXT
echo -en '12345\n6789' | tr '\n' ','
echo
echo "${url}" | tr -d '/' 
echo "${url}" | tr -s '/' '\'

0d265ac2a42e4d04a019c24ab8c61b5f.png

目录
相关文章
|
3天前
|
Linux 开发工具
Linux下视频截取命令 使用【ffmpeg】使用
Linux下视频截取命令 使用【ffmpeg】使用
8 1
|
5天前
|
Linux API C语言
C语言读写BMP文件-EasyBmp【 linux 平台】
**EasyBmp** 是一个49KB的轻量级C++图像处理库,专注于BMP格式,提供简单易用的API。它的特点是小巧、开源、易于理解和高度定制。通过示例代码展示了如何轻松读取、缩放和保存BMP图像。适合需要高效处理BMP图像的开发者。
|
6天前
|
Linux Shell
蓝易云 - Linux下查看文件和文件夹大小
这两个命令是查看Linux系统中文件和文件夹大小的基本工具,可以根据需要进行组合使用。
8 0
|
6天前
|
应用服务中间件 Linux nginx
蓝易云 - Linux使用pid文件结束nginx
以上就是使用pid文件结束nginx进程的方法。
7 0
|
7天前
|
缓存 Linux Windows
初识Linux操作系统(根目录下的重要文件)(命令提示符的含义)
Linux系统基于"一切皆文件"的理念,重要文件分布在如/root(root用户目录)、/home(普通用户目录)、/etc(应用配置)、/dev(设备文件)、/boot(内核及启动文件)、/proc(动态系统信息)、/lib64(库文件)、/opt(软件存放)、/tmp(临时文件)。"[root@localhost ~]#"代表管理员在root目录,"$"代表普通用户。创建新用户用`useradd`命令。调节终端字体大小:Ctrl+Shift++增大,Ctrl+减号缩小。绝对路径从根目录开始,相对路径从当前目录开始。
|
9天前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
13 1
|
9天前
|
Linux Python
在 Linux 中查看目录文件数的方法
【6月更文挑战第7天】在 Linux 中查看目录文件数的方法包括:使用 `ls` 命令结合 `wc -l`,`find` 命令,`tree` 命令,以及编程方式(如 Python)。`ls` 和 `find` 命令通过管道传递给 `wc -l` 统计行数,而 `tree` 命令提供树状视图并显示文件数。编程方式则允许自定义实现,例如 Python 中的 `os.walk()`。注意权限、效率和场景适用性,选择合适的方法以提高 Linux 操作效率。
28 3
|
9天前
|
监控 Linux Perl
在 Linux 中显示文件指定行内容的方法和技巧
【6月更文挑战第7天】在 Linux 中查看文本文件指定行,可使用 head/tail 显示文件头/尾部行,sed 的行号指定功能或 awk 进行处理。在代码审查、日志分析和文本处理等场景下,这些命令能提升效率。注意文件编码、行号准确性,并组合使用命令以实现更多功能。通过练习,能更好地掌握这些工具。
34 0
|
22小时前
|
算法 网络协议 Linux
探索Linux命令idn:处理国际化域名
`idn`命令在Linux中用于处理国际化域名,转换成ASCII兼容的ACE格式或反之。它支持Punycode算法,提供命令行接口及多种参数,如`-a`转ASCII,`-d`转回国际化域名。示例包括将`xn--zhonggu-wu9d.com`转换。使用时注意有效输入,考虑版本兼容性,并可与其他工具结合使用。
|
22小时前
|
Linux 数据处理 数据库
深入解析Linux命令id:理解用户身份与权限
`id`命令在Linux中用于显示用户身份(UID, GID和附加组)。它查看系统用户数据库获取信息。参数如`-u`显示UID,`-g`显示GID,`-G`显示附加组,结合`-n`显示名称而非ID。用于确认命令执行者身份,确保权限正确。在脚本中使用时注意权限管理,遵循最小权限原则。