【问题标题】:Get the name of the folder from a path with whitespace从带有空格的路径中获取文件夹的名称
【发布时间】:2020-03-27 03:25:20
【问题描述】:

我是 bash 新手,我想知道如何打印路径中的最后一个文件夹名称。

mypath="/Users/ckull/Desktop/Winchester stuff/a b c/some other folder/"
dir="$(basename $mypath)"
echo "looking in $dir"

其中 dir 是路径中的最后一个目录。它应该打印为

some other folder

相反,我得到:

Winchester
stuff
a
b
c
some
other
folder

我知道空格会导致问题 ;) 我需要将结果通过管道传输到字符串然后替换换行符吗?或者也许是更好的方法...

【问题讨论】:

  • 我收到一条错误消息:“基本名称:额外的操作数‘b’”。所以试试dir="$(basename "$mypath")"
  • Always 引用参数表达式。总是。这样做是错误的情况大大被必要或不相关的情况所取代;引用将为您节省大量调试时间。
  • 将您的脚本复制/粘贴到ShellCheck(在其前面的第一行添加shebang,例如#!/usr/bin/env bash),它将指出问题所在。
  • 我有 #! /bin/bash 作为shebang。哪一个是对的?或者那是另一个问题;)
  • 已经被问过了。点击我之前评论中的链接。

标签: bash directory path basename


【解决方案1】:

在处理空格时,所有变量在作为命令行参数传递时都应该被双引号,以便 bash 知道将它们视为单个参数:

mypath="/Users/ckull/Desktop/Winchester stuff/a b c/some other folder/"
dir="$(basename "$mypath")" # quote also around $mypath!
echo "lookig in $dir"
# examples
ls "$dir" # quote only around $dir!
cp "$dir/a.txt" "$dir/b.txt"

这就是 bash 中变量扩展的方式:

var="aaa bbb"
               # args: 0      1              2     3
foo $var ccc   # ==>   "foo"  "aaa"          "bbb" "ccc"
foo "$var" ccc # ==>   "foo"  "aaa bbb"      "ccc"
foo "$var ccc" # ==>   "foo"  "aaa bbb ccc"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多