Bash脚本串联

问题描述 投票:0回答:1

伙计们,我有一个小脚本,用于创建一个带有n个子文件夹的父文件夹。

我基于命令mkdir -p parentFolder/{"Folder 1", "Folder 2",...}

通过像上面这样写出来运行它,将创建以下文件夹结构:

parentFolder
|-Folder 1
|-Folder 2
|-Folder 3
#!/bin/bash
#Takes two arguments for the name of your parent folder 
#and how many subfolders you want

function createFolderAndSubfolders {
folderName="$1"
numberOfSubfolders="$2"
subFolderName="subFolder"

buildString="$folderName/{"

for (( i=1; i<=$numberOfSubfolders; i++ ))
do
        if [[ $i -ne $numberOfSubfolders ]]; then
           buildString+="\"$subFolderName $i\","
        else
           # If last number in loop, don't add comma
           buildString+="\"$subFolderName $i\""
        fi
done
buildString+="}"
#This should make an example string like: 'parentFolder/{"subFolder 1","subFolder 2"}'

#Create parent and sub folders
mkdir -p "$buildString"
}

当我使用此字符串串联运行它时,我得到的是父文件夹,但只有一个子文件夹,而不是手动键入时所发生的事情。

parentFolder
|-{"subFolder 1","subFolder 2"}

我还尝试过使用单引号将双引号转义以达到相同的效果。

我是否遗漏了任何可能阻止其正常工作的内容?

bash escaping concatenation mkdir double-quotes
1个回答
0
投票

[mkdir -p "$buildString"为命令提供了一个很长的参数,并且像{这样的所有运算符都被转义并视为字符。

您应该直接为每个文件夹直接调用mkdir吗?即

for (( i=1; i<=$numberOfSubfolders; i++ ))
do
        mkdir -p "$subFolderName $i"
done

即使您的方法可以使用,也会使您容易遇到问题,例如subFolderName中有双引号吗,例如:./myscript.sh "folder \" name" 10

如果您真的想建立一个列表,请不要使用{}运算符,因为bash只是将其用作mkdir的额外参数。

即:

buildString=""
for (( i=1; i<=$numberOfSubfolders; i++ ))
do
    buildString+=" \"$subFolderName $i\""
done
mkdir -p $buildString

最后,bash通配符表达式已经支持您要执行的操作。

mkdir New\ Folder\ {0..10}
© www.soinside.com 2019 - 2024. All rights reserved.