如何解决为什么这个 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 举报,一经查实,本站将立刻删除。