如何连接两个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 "$@"