【问题标题】:Why is basename in this shell script necessary?为什么这个 shell 脚本中的 basename 是必需的?
【发布时间】:2021-07-01 12:20:53
【问题描述】:

我找到了这个 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" won't work basename 不能从给定目录中删除文件名?有人可以解释这部分如何: cd "$1/$(basename "$2")" 有效吗?由于基本名称,$2 还需要用单独的引号 ("$2") 括起来?

【问题讨论】:

  • 假设使用参数/full/path/to/1 /full/path/to/2调用脚本

标签: shell directory move basename


【解决方案1】:

由于基本名称,$2 还需要用单独的引号 ("$2") 括起来吗?

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

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

(实际上应该是cd -- "$1/$(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/

【讨论】:

  • 如果我像这样调用脚本:script directory1 directory2(没有路径,只是简单的目录名称)比 cd $1/$2 可以正常工作吗?
猜你喜欢
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多