我正在尝试编写一个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)
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)
然后,您可以根据需要创建文件夹/目录.
以下脚本使用相对路径(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)