Como combinar variáveis de ambiente e expansão de colchetes em strings no Linux Bash?

0

Gostaria de escrever um script bash que criaria uma estrutura de diretórios como esta:

foo
 | - innerdir1
 | - innerfile1

Esta ação deve ser repetida várias vezes para diferentes nomes de diretório foo. Cada nome foo consiste em duas partes. Então eu acho que primeiro preciso definir variáveis de ambiente:

    $BAR=something
    $BAZ=anotherthing

E então eu preciso usá-los em um script que produza a estrutura mencionada com o nome de foo como $ BAR. $ BAZ, ou seja, algo. Como eu escrevo esse roteiro?

    
por Oleg 09.12.2010 / 02:25

4 respostas

2

for BAR in abc def
do
    for BAZ in ghi jkl mno
    do
        mkdir -p "$BAR.$BAZ/innerdir1"
        touch "$BAR.$BAZ/innerfile1"
    done
done

criará:

abc.ghi
 | - innerdir1
 | - innerfile1
abc.jkl
 | - innerdir1
 | - innerfile1
abc.mno
 | - innerdir1
 | - innerfile1
def.ghi
 | - innerdir1
 | - innerfile1
def.jkl
 | - innerdir1
 | - innerfile1
def.mno
 | - innerdir1
 | - innerfile1
    
por 09.12.2010 / 04:35
0

Em vez de variáveis de ambiente, passe seus nomes como argumentos e escreva o script para usar esses argumentos - isso tornaria uma ferramenta mais flexível.

Consulta ' getopts ' em esta página de guia bash e em outros lugares.

    
por 09.12.2010 / 03:45
0

O script:

#!/bin/bash
if [ -z "$BAR" -o -z "$BAZ" ]; then
  echo "This script needs environment variables $BAR and $BAZ to be set."
  exit 1 
fi

dir=$BAR.$BAZ
mkdir $dir
mkdir $dir/innerdir1
touch $dir/innerfile1

Invoque como:

BAR=bar BAZ=baz ./script.sh

Isso criará: bar.baz/innerdir1 e bar.baz/innerfile1 .

    
por 09.12.2010 / 02:58
0

Você deve dar uma olhada em

link

Um começo simples seria:

#!/bin/bash

# define foo array
FOOLIST=()

# can be repeated

# create foonames
BAR="something"
BAZ="anotherthing"

# add to foolist
FOOLIST+=("${BAR}.${BAZ}")

BAR="somethingnew"
FOOLIST+=("2${BAR}.${BAZ}")

BAR="somethingnewer"
FOOLIST+=("3${BAR}.${BAZ}")

# create folders from list
for folder in ${FOOLIST[@]}
do
        mkdir $folder
        mkdir $folder/innerdir1
        mkdir $folder/innerfile1
done
    
por 09.12.2010 / 03:02

Tags