微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个 shell 脚本中的 basename 是必要的?

如何解决为什么这个 shell 脚本中的 basename 是必要的?

我找到了这个 shell 脚本($1,$2 是目录):

mv "$2" "$1"  ||  exit               # Make $2 a subdirectory of $1
cd "$1/$(basename "$2")"  ||  exit   # Change directories for simplicity
for f in *; do
    mv "$f" "${f%.*}.txt"            # Add or change the extension
done

它移动第一个目录中的第二个目录(因此第二个目录成为第一个目录的子目录)并且第二个目录中的所有文件都将具有“.txt”扩展名。我不明白为什么 cd "$1/$2" 不起作用,basename 不能从给定目录中去除文件名?有人可以解释一下这部分如何: cd "$1/$(basename "$2")" 有效吗?由于 basename,$2 也需要用单独的引号 ("$2") 括起来?

解决方法

basename 删除前导目录信息。假设使用如下参数调用 sript:

$$> script usr/local/foo usr/local/bar

现在 $2 等于 usr/local/bar

如果只执行 cd $1/$2,命令将如下所示:

cd usr/local/foo/usr/local/bar

但实际上应该是

cd usr/local/foo/bar

它正在从 usr/local/bar 中删除这个目录前缀,这是 basename 所做的。

https://www.geeksforgeeks.org/basename-command-in-linux-with-examples/

,

由于 basename,$2 也需要用单独的引号括起来("$2")?

是的,外部扩展集 "$1/$(...)" 和内部扩展集 "$2" 都需要引用以防止 word splitting 出现问题,否则如果 {{ 1}} 包含空格(或 shell glob 字符)。

参见例如Quoting within $(command substitution) in Bash 在 unix.SE 上了解详情。

(实际上,这也应该是 $2 以防止以 cd -- "$1/$(basename -- "$2")" 开头的文件名/路径。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。