如何连接两个字符串以构建完整的路径

Hak*_*kim 83 linux bash

我正在尝试编写一个bash脚本.在此脚本中,我希望用户输入目录的路径.然后我想在这个字符串的末尾添加一些字符串,并构建一些子目录的路径.例如,假设用户输入如下字符串:

/home/user1/MyFolder
Run Code Online (Sandbox Code Playgroud)

现在我想在这个目录中创建2个子目录并在那里复制一些文件.

/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Dun*_*nes 119

POSIX标准要求在文件名中将多个/视为单个/.因此 //dir///subdir////file是一样的/dir/subdir/file.

因此,连接两个字符串以构建完整路径非常简单:

full_path="$part1/$part2"
Run Code Online (Sandbox Code Playgroud)

  • 如果部件本身是相对路径,并且part1可能为空,则结果可能从相对路径变为绝对路径. (14认同)
  • 除非$ part1可以为空字符串. (8认同)
  • @TuureLaurinolli 然后你可以简单地在前面添加`./`。但也许用户_想要_连接绝对路径。否则他们可以简单地在前面添加`./`来强制路径是相对的。另请注意,`"$path1/./$path2"` 与 `"$path1/$path2"` 相同。 (3认同)
  • @TuureLaurinolli 我不明白你来自哪里。上述串联仍然会产生有效路径。该路径可能不存在,但它仍然有效。例如。`"" + "/" + "Documents"` 给出 `"/Documents"`。 (2认同)

Sea*_*ght 37

#!/bin/bash

read -p "Enter a directory: " BASEPATH

SUBFOLD1=${BASEPATH%%/}/subFold1
SUBFOLD2=${BASEPATH%%/}/subFold2

echo "I will create $SUBFOLD1 and $SUBFOLD2"

# mkdir -p $SUBFOLD1
# mkdir -p $SUBFOLD2
Run Code Online (Sandbox Code Playgroud)

如果你想使用readline以便完成所有这些,那就添加一个-e调用read:

read -e -p "Enter a directory: " BASEPATH
Run Code Online (Sandbox Code Playgroud)


Lev*_*von 13

是不是简单地连接你的道路部分完成你想要的?

$ base="/home/user1/MyFolder"
$ subdir="subFold1"
$ new_path=$base$subdir
$ echo $new_path
/home/user1/MyFoldersubFold1
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要创建文件夹/目录.

  • 为什么我收到此消息:Myscript.sh:第4行:/ home/user1/MyFolder/subFold1:是一个目录 (3认同)
  • @ user12345,是的...仍然使上述解决方案不正确。 (3认同)
  • 你错过了路径中的一个/.目标是内联`/ home/user1/MyFolder/subFold1`,因此你需要内联`new_path = $ base/$ subdir`.但是如果给出的路径包含尾随'/',你会怎么做? (2认同)

Car*_*ood 5

以下脚本使用相对路径(SUBDIR)连接多个(相对/绝对)路径(BASEPATH):

shopt -s extglob
SUBDIR="subdir"
for BASEPATH in '' / base base/ base// /base /base/ /base//; do
  echo "BASEPATH = \"$BASEPATH\" --> ${BASEPATH%%+(/)}${BASEPATH:+/}$SUBDIR"
done
Run Code Online (Sandbox Code Playgroud)

其输出是:

BASEPATH = "" --> subdir
BASEPATH = "/" --> /subdir
BASEPATH = "base" --> base/subdir
BASEPATH = "base/" --> base/subdir
BASEPATH = "base//" --> base/subdir
BASEPATH = "/base" --> /base/subdir
BASEPATH = "/base/" --> /base/subdir
BASEPATH = "/base//" --> /base/subdir
Run Code Online (Sandbox Code Playgroud)

shopt -s extglob仅需要允许基本路径,结束对多个斜线(这可能是无义).如果没有扩展的全局,你可以使用:

echo ${BASEPATH%%/}${BASEPATH:+/}$SUBDIR
Run Code Online (Sandbox Code Playgroud)

这会导致不那么整洁但仍在工作:

BASEPATH = "" --> subdir
BASEPATH = "/" --> /subdir
BASEPATH = "base" --> base/subdir
BASEPATH = "base/" --> base/subdir
BASEPATH = "base//" --> base//subdir
BASEPATH = "/base" --> /base/subdir
BASEPATH = "/base/" --> /base/subdir
BASEPATH = "/base//" --> /base//subdir
Run Code Online (Sandbox Code Playgroud)