Bash сцепление сценариев - PullRequest
       83

Bash сцепление сценариев

0 голосов
/ 22 февраля 2020

Эй, ребята, у меня есть небольшой скрипт для создания родительской папки с 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"}

Я также пробовал одинарные кавычки для экранирования двойных кавычек с тем же эффектом.

Я пропустил что-нибудь, что могло бы помешать этому?

1 Ответ

0 голосов
/ 22 февраля 2020

mkdir -p "$buildString" предоставляет команде один действительно длинный аргумент, и все операторы, такие как {, экранируются и обрабатываются как символы.

Вы должны просто вызвать mkdir для каждой папки напрямую? ie.

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

Даже если ваш метод можно заставить работать, это оставит вас открытым для возможных проблем, таких как, если subFolderName имеет двойную кавычку в ?, ie: ./myscript.sh "folder \" name" 10

Если вы действительно хотите построить список, не используйте оператор {}, так как он просто расширяется на bash в качестве дополнительных аргументов для mkdir в любом случае.

ie :

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

И, наконец, bash подстановочные выражения уже поддерживают то, что вы пытаетесь сделать.

mkdir New\ Folder\ {0..10}
...