使用带有 mkdir 和变量的 shell 脚本一次创建多个目录

Bha*_*wal -1 command-line bash scripts

我想mkdir在 shell 脚本中使用如下创建目录树。

Tutorial
?
??? abc
?   |
?   ??? def
?       
??? pqr
    ??? stu
    ?   
    ??? vwx
Run Code Online (Sandbox Code Playgroud)

当我在终端中运行以下命令时,

mkdir -p /home/LinuxServer/GIT/bbb/Tutorial/{abc/def,pqr/{stu,vwx}}
Run Code Online (Sandbox Code Playgroud)

然后它正在工作。

但是当我执行以下 shell 脚本时,它没有正确创建目录树

DIRECTORY_PATH="/home/LinuxServer/GIT/bbb/"
CREATE_DIRECTORY_STRUCTURE="Tutorial/{abc/def,pqr/{stu,vwx}}"
TUTORIAL_PATH="$DIRECTORY_PATH$CREATE_DIRECTORY_STRUCTURE"

mkdir -p  $TUTORIAL_PATH
Run Code Online (Sandbox Code Playgroud)

你能帮我理解这个问题吗?

mur*_*uru 6

大括号扩展发生在变量扩展之前,并且不会在变量赋值期间发生:

$ foo={a,b,c}
$ echo $foo
{a,b,c}
Run Code Online (Sandbox Code Playgroud)

将公共部分保留在变量中,其余部分保留在命令本身中:

DIRECTORY_PATH="/home/LinuxServer/GIT/bbb/"
TUTORIAL_PATH="${DIRECTORY_PATH}Tutorial"

mkdir -p  "$TUTORIAL_PATH"/{abc/def,pqr/{stu,vwx}}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用数组,其中在赋值期间会发生大括号扩展:

TUTORIAL_PATHS=( "${DIRECTORY_PATH}Tutorial"/{abc/def,pqr/{stu,vwx}} )
mkdir -p "${TUTORIAL_PATH[@]}"
Run Code Online (Sandbox Code Playgroud)

  • 只是为了加强这个答案:https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html#Shell-Expansions。“扩展的顺序是:大括号扩展;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和文件名扩展。” 这里的大括号永远不会扩展,因为在变量扩展已经发生之后为时已晚。 (2认同)