给定文件的路径,请说: /home/user1/archive.zip
有人可以告诉我如何在不使用外部二进制文件的情况下删除字符串 archive.zip ?
我知道:
${Path2File##*/}
可以给我文件名,但我需要这个文件夹的路径。
也欢迎使用通配符理解指南或解释。
答案 0 :(得分:5)
做
"${Path2File%\/*}"
或使用外部二进制文件
dirname "$Path2File" # Not desirable as you've mentioned already
备注:强>
${parameter%word}
的shell参数扩展中,单词被扩展为生成模式,就像在文件名扩展中一样。如果模式匹配参数的扩展值的尾部,则扩展的结果是删除了最短匹配模式的参数的值。 /
在shell参数扩展中有特殊含义,我们只是将其转义为\/
。目的是匹配文件基名,即
/example.zip
中的/path/to/example.zip
并将其删除。<强>参考:强>
Shell [ Parameter Expansion ]
答案 1 :(得分:3)
##
通配符表示任何字符都匹配。 $ a=/path/to/file
$ echo ${a##*t}
o/file
正在从参数中删除最长匹配模式。例如:
t
在这个例子中,我们说删除所有内容,包括/pat
。它按照您的预期删除了t
,但是当它发现第二个#
时,它仍然继续。 (单个t
将停在第一个/
)。
更有用的示例是通过匹配最后一个$ echo ${a##*/}
file
来删除路径。
%
$ echo ${a%/*}
/path/to
匹配字符串的末尾。
/
这意味着从最右侧斜线*
以及其他所有内容%
中删除。
单%%
寻找最短的匹配。如果我们使用/
,则匹配会一直回到字符串的开头,并匹配第一个字符requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
并吞噬该批次。