如何连接两个string来构build一个完整的path

我正在尝试写一个bash脚本。 在这个脚本中我想让用户input一个目录的path。 然后我想在这个string的末尾附加一些string,并build立一些子目录的path。 例如,假设用户input一个像这样的string:

/home/user1/MyFolder 

现在我想在这个目录下创build2个子目录,并在那里复制一些文件。

 /home/user1/MyFolder/subFold1 /home/user1/MyFolder/subFold2 

我怎样才能做到这一点?

POSIX标准规定多个/被视为单个文件名。 因此//dir///subdir////file/dir/subdir/file

像这样连接两个string来构build一个完整的path是很简单的:

 full_path="$part1/$part2" 
 #!/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 

如果你想使用readline,所以你可以完成所有的工作,添加一个-e的调用read

 read -e -p "Enter a directory: " BASEPATH 

不会简单地连接你的path的一部分完成你想要的?

 $ base="/home/user1/MyFolder" $ subdir="subFold1" $ new_path=$base$subdir $ echo $new_path /home/user1/MyFoldersubFold1 

您可以根据需要创build文件夹/目录。

以下脚本使用相对path(SUBDIR)链接几个(相对/绝对)path(BASEPATH):

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

其输出是:

 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 

shopt -s extglob只是允许BASEPATH以多个斜线结束(这可能是无稽之谈)。 没有长时间的布局,你可以使用:

 echo ${BASEPATH%%/}${BASEPATH:+/}$SUBDIR 

这将导致不太整洁,但仍然工作:

 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 
 #!/usr/bin/env bash mvFiles() { local -a files=( file1 file2 ... ) \ subDirs=( subDir1 subDir2 ) \ subDirs=( "${subDirs[@]/#/$baseDir/}" ) mkdir -p "${subDirs[@]}" || return 1 local x for x in "${subDirs[@]}"; do cp "${files[@]}" "$x" done } main() { local baseDir [[ -t 1 ]] && echo 'Enter a path:' read -re baseDir mvFiles "$baseDir" } main "$@"