Jednoduchá expanze v Bashi

robert

Jednoduchá expanze v Bashi
« kdy: 08. 02. 2011, 17:19:25 »
Dobrý den, mám následující skript:

#!/bin/bash
EXCLUDE="--exclude="{a,b,c}
echo $EXCLUDE


Vypisuje: --exclude{a,b,c}
a potřebuji, aby vypsal --exlude=a --exclude=b --exclude=c. Prosím o radu, R.
 
« Poslední změna: 08. 02. 2011, 19:44:30 od Petr Krčmář »


robert

Re: Jednoduchá expanze - dovysvětlení
« Odpověď #1 kdy: 08. 02. 2011, 17:43:02 »
proměnnou WHAT čtu ze souboru, neznám ji dopředu - viz:

#!/bin/bash

WHAT={a,b,c}
EXCLUDE=`echo "--exclude"$WHAT`

echo "$EXCLUDE"

branchman2

Re: Jednoduchá expanze
« Odpověď #2 kdy: 08. 02. 2011, 18:55:27 »
EXCLUDE=`eval echo "--exclude"$WHAT`

MilanK

Re: Jednoduchá expanze v Bashi
« Odpověď #3 kdy: 08. 02. 2011, 20:15:17 »
Problém je v tom, že to {a,b,c} neboli "brace expansion" se provádí dříve, než $... neboli "parameter expansion". Takže je opravdu nutné si pomoci přes echo:

EXCLUDE=`echo --exclude={a..c}`
echo $EXCLUDE

(v příkladu je ještě ukázka toho, jak zjednodušit to ",b,")

robert

Re: Jednoduchá expanze v Bashi
« Odpověď #4 kdy: 09. 02. 2011, 01:47:43 »
Díky za rady, to funguje OK. Snažil jsem se příklad maximálně zjednodušit, ale v mém příkladu stále nevím.

EXCLUDES="*.7z;*.tar.gz"
APPENDSTR=`eval echo "--exclude={"$EXCLUDES | tr -s ';' ','"}"`
echo $APPENDSTR

Dál pak zavolám tar s tím exclude ...


robert

Re: Jednoduchá expanze v Bashi
« Odpověď #5 kdy: 09. 02. 2011, 08:59:32 »
Ještě prosím o radu. Funguje to takto (prosím o nástin řešení bez pomocné proměnné):


EXCLUDES="S;Z;*.tar.gz"
HLP=`echo $EXCLUDES | tr -s ';' ','`
APPENDSTR=`echo --exclude={$HLP}`
eval echo $APPENDSTR

robert

Re: Jednoduchá expanze v Bashi
« Odpověď #6 kdy: 09. 02. 2011, 09:46:42 »
Moc děkuji za všechny reakce, nyní si mohu odpovědět sám:

} musí být na konci, jinak ho bere program tr jako argument

EXCLUDES="S;Z;*.tar.gz"
APPENDSTR=`echo --exclude={$EXCLUDES | tr -s ';' ','`}
eval echo $APPENDSTR