gpt4 book ai didi

bash - 在 Bash 中删除可选的/(目录分隔符)

转载 作者:行者123 更新时间:2023-11-29 09:18:04 25 4
gpt4 key购买 nike

我有一个 Bash 脚本,它将一个目录作为参数,经过一些处理后,将根据该目录中的文件进行一些输出。

命令如下,其中dir是一个目录,里面有如下结构

dir/foo
dir/bob
dir/haha
dir/bar
dir/sub-dir
dir/sub-dir/joe

> myscript ~/files/stuff/dir

经过一些处理,我希望输出是这样的

foo
bar
sub-dir/joe

我必须删除传入的路径的代码如下:

shopt -s extglob

for file in $files ; do
filename=${file#${1}?(/)}

这让我想到了以下内容,但出于某种原因,可选的 / 没有得到处理。因此,我的输出如下所示:

/foo
/bar
/sub-dir/joe

我把它设为可选的原因是如果用户运行命令

> myscript ~/files/stuff/dir/

我希望它仍然有效。而且,就目前而言,如果我使用尾部斜杠运行该命令,它会按需输出。

那么,为什么我的 ?(/) 不起作用?根据我读过的所有内容,这应该是正确的语法,我也尝试了一些其他变体,但都无济于事。

谢谢。

最佳答案

that other guy's helpful answer解决了您眼前的问题,但有两件事毫无值(value):

  • 使用不带引号的字符串变量 ( for file in $files ) 枚举文件名是不明智的,因为 sjsam's helpful answer指出:它将破坏带有嵌入空格的文件名和看起来像 glob 的文件名;如前所述,将文件名存储在数组中是可靠的选择。

  • 不需要更改全局 shell 选项 shopt -s extglob : 参数扩展可以嵌套,因此无需更改 shell 选项即可执行以下操作:

# Sample values:
file='dir/sub-dir/joe'
set -- 'dir/' # set $1; value 'dir' would have the same effect.

filename=${file#${1%/}} # -> '/sub-dir/joe'

内部参数扩展,${1%/} , 删除尾随 ( % ) /来自 $1 , 如果有的话。

关于bash - 在 Bash 中删除可选的/(目录分隔符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38298208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com