2012-06-27 64 views
44

我正在尝试编写一个bash脚本。在这个脚本中,我希望用户输入一个目录的路径。然后我想在这个字符串的末尾附加一些字符串并构建一些子目录的路径。 例如,假设用户进入一个像这样的字符串:如何连接两个字符串以构建完整路径

/home/user1/MyFolder 

现在我想的目录下建立2个子目录和复制一些文件存在。

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

我怎样才能做到这一点?

+1

你尝试过这么远吗?另外,您的问题是从用户那里获得输入的一部分,另一部分是关于构建路径的部分?或者只是路径? – Levon

+0

只是创建路径。 – Hakim

回答

9

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

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

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

+3

为什么我收到此消息:Myscript.sh:第4行:/ home/user1/MyFolder/subFold1:是目录 – Hakim

+1

您缺少路径中的/。目标是 inline'/ home/user1/MyFolder/subFold1' 因此您需要内嵌'new_path = $ base/$ subdir'的 。但是,如果给出的路径包含尾随的'/',你会怎么做? – Thrasi

+1

@Thrasi只是将尾部的'/'添加到subdir变量或'newpath = $ base/$ subdir /'您可以直接在命令行 – user12345

30
#!/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 

如果你想要让你得到完成,这一切,将呼叫添加-eread成使用输入:

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

不幸的是,这在BASEPATH为空时不起作用。我需要的是类似的东西,只有当它还没有结束斜线并且不为空时才会添加/。因此,当它在合法的文件名字符上结束时。 –

0
#!/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 "[email protected]" 
66

多个/正在治疗的POSIX标准规定作为文件名中的单个/。因此, //dir///subdir////file/dir/subdir/file相同。

这样串联一个两个字符串建立一个完整路径是一个简单的为:

full_path="$part1/$part2" 
+2

除非$ part1可以是空字符串。 –

+1

@TuureLaurinolli我不明白你来自哪里。上面的连接仍然会导致有效的路径。路径可能不存在,但它仍然有效。例如。 '“”+“/”+“文件”'给出'“/ Documents”'。 – Dunes

+5

如果零件本身是相对路径,且零件1可能为空,则结果可能会从相对路径转为绝对路径。 –

3

下面的脚本catenates若干(相对/绝对)路径(基本路径)与相对路径(SUBDIR):

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以多个斜线结束(这可能是无稽之谈)。如果没有扩展globing你可以使用:

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