shell中的##*,%%*问题

假设我们定义了一个变量为:

file=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:

${file#*/}:删掉第一个 /
及其左边的字符串:dir1/dir2/dir3/my.file.txt

${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt

${file#*.}:删掉第一个 .  及其左边的字符串:file.txt

${file##*.}:删掉最后一个 .  及其左边的字符串:txt

${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3

${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)

${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file

${file%%.*}:删掉第一个  .  
及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:

# 是 去掉左边(键盘上#在 $ 的左边)

%是去掉右边(键盘上% 在$ 的右边)

单一符号是最小匹配;两个符号是最大匹配

${file:0:5}:提取最左边的 5
个字节:/dir1

${file:5:5}:提取第 5
个字节右边的连续5个字节:/dir2

也可以对变量值里的字符串作替换:

${file/dir/path}:将第一个dir
替换为path:/path1/dir2/dir3/my.file.txt

${file//dir/path}:将全部dir
替换为 path:/path1/path2/path3/my.file.txt

利用 ${ }
还可针对不同的变数状态赋值(沒设定、空值、非空值):

${file-my.file.txt} :假如 $file
沒有设定,則使用 my.file.txt
作传回值。(空值及非空值時不作处理)

${file:-my.file.txt} :假如 $file
沒有設定或為空值,則使用 my.file.txt
作傳回值。 (非空值時不作处理)

${file+my.file.txt} :假如 $file
設為空值或非空值,均使用 my.file.txt
作傳回值。(沒設定時不作处理)

${file:+my.file.txt} :若 $file
為非空值,則使用 my.file.txt
作傳回值。 (沒設定及空值時不作处理)

${file=my.file.txt} :若 $file
沒設定,則使用 my.file.txt
作傳回值,同時將 $file
賦值為 my.file.txt
。 (空值及非空值時不作处理)

${file:=my.file.txt} :若 $file
沒設定或為空值,則使用 my.file.txt
作傳回值,同時將 $file
賦值為 my.file.txt
。 (非空值時不作处理)

${file?my.file.txt} :若 $file
沒設定,則將 my.file.txt
輸出至 STDERR。 (空值及非空值時不作处理)

${file:?my.file.txt}
:若 $file
没设定或为空值,则将 my.file.txt
输出至 STDERR。 (非空值時不作处理)

${#var}
可计算出变量值的长度:

${#file}
可得到 27
,因为/dir1/dir2/dir3/my.file.txt
是27个字节

转自:http://space.baidu.com.cn/ugo5/blog/item/c550bbc54d1644079c163dbd.html

时间: 2024-10-31 17:49:42

shell中的##*,%%*问题的相关文章

linux在shell中获取时间

获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使用date的 -d参数 获取明天的日期 date -d next-day +%Y%m%d 获取昨天的日期 date -d last-day +%Y%m%d 获取上个月的年和月 date -d last-month +%Y%m 获取下个月的年和月date -d next-month +%Y%m 获取明年

在 shell 中使用 vi 模式

作为一名大型开源社区的参与者,更确切地说,作为 Fedora 项目的成员,我有机会与许多人会面并讨论各种有趣的技术主题. 我最喜欢的主题是"命令行"或者说 shell,因为了解人们如何熟练使用 shell 可以让你深入地了解他们的想法,他们喜欢什么样的工作流程,以及某种程度上是什么激发了他们的灵感. 许多开发和运维人员在互联网上公开分享他们的" dot 文件"(他们的 shell 配置文件的常见俚语),这将是一个有趣的协作机会,让每个人都能从对命令行有丰富经验的人中

shell中的重定向(输入输出)

注意:不同版本的Linux会有所区别,不过大同小异 Linux 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出重定向 命令的输出不仅可以是显示器,还可以很容易的转移向到文件,这被称为输出重定向. 命令输出重定向的语法为: $ command > file 这样,输出到显示器的内容就可以被重定向到文件. 例如,下面的命令在显示器上不会看到任何输出: $ who > users 打

书写优雅的shell脚本(五)- shell中(())双括号运算符

在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构语句,就是对shell中算数及赋值运算的扩展. 1.语法: ((表达式1,表达式2-)) 2.特点: (1)在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等. (2)在双括号结构中,所有变量可以不加入:"$"符号前缀. (3)双括号可以进行逻辑运算,四则运算 (4)双括号结

[ SHELL编程 ] shell中各种括号的使用方法

转载自:http://www.jb51.net/article/60326.htm 在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下:1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)现在分

shell中$(( )) 与 $( ) 还有${ }的区别

http://blog.chinaunix.net/uid-14351756-id-2820651.html $( ) 与 ` ` (反引号)在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的. 所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:* 完成引号里的命令行,然后将其结果替换出来,再重组命令行.例如:[code]$ echo the last sunday is $(date -d "la

Python3 Tkinter基础 Frame bind 绑定敲击键盘事件 将按键打印到Shell中

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: from tkinter import * root=Tk() #创建一个框架,在这个框架中响应事件 frame=Frame(root, width=200,height=200, background='green') def callBack(event):

shell中&&和||的使用方法

&&运算符: command1  && command2 &&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行:换句话说,"如果这个命令执行成功&&那么执行这个命令". 语法格式如下: command1 && command2 [&& command3 ...] 1 命令之间使用 && 连接,实现逻辑与的功能. 2 只

shell中的`和$()、eval、crontab

一.`和$()的区别 反引号本身就对\进行了转义,保留了本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示. 反引号中: \\ = \ $()中:\ = \ 注意:反引号是老的用法,$()是新的用法,不管是在学习测试中,还是在实际工作中,$()的用法都是被推荐的. 二.eval命令 eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接引用,则保证间接引用的语义. 例如有一个文件test1,里面的内容是"this

shell简单用法笔记(shell中数值运算)二

shell中变量值,如果不手动指定类型,默认都是字符串类型: 例如: a=123 b=456 c=$a+#b echo $c 结果会输出:123+456 shell中,如果要进行数值运算,可以通过一下方法: 方法1: a=123 b=456 c=$(($a+$b)) 方法2: a=123 b=456 declare -i c=$a+$b 通过declare -i 来声明c的数值类型为int类型 方法3: a=123 b=456 c=$(expr $a + $b) 注意+号两边有空格 通过貂绒ex