2009-05-20 6 views
1

Je veux mettre TEXTA au début de textb parImpossible de se référer à un paramètre dans Bash

cat TextA A TextB 

Le problème est que je ne sais pas comment faire référence aux premier et deuxième paramètres, qui est TEXTA et textb dans le script suivant appelé A:

#!/bin/bash 

    cat TextA > m1 
    cat TextB > m2 
    cat m1 m2 > TextB 

où m1 et m2 sont des fichiers temporaires.

Comment faire référence aux deux fichiers dans le script shell?

Répondre

4

Vous pouvez utiliser $0, $1, etc. $2 de se référer aux variables le script.

$0 est le nom du script lui-même
$1 est le premier paramètre
$2 est le second paramètre
et ainsi de suite

Par exemple, si vous avez cette commande:

a A1 A2 

Puis à l'intérieur a vous aurez:

$0 = a 
$1 = A1 
$2 = A2 
+0

Merci pour votre réponse! –

+0

J'accepte la réponse, puisque c'est une réponse à ma question initiale. S'il vous plaît, voir ma réponse en bas. Le tee de commandement m'a finalement résolu le problème. –

+0

Ce que je ferais dans ce cas, si je voulais partager la solution, est de poster une nouvelle question "comment puis-je préfixer un fichier au fichier b sans utiliser un fichier temporaire?" puis poster la réponse à cela. –

2

vous pouvez simplement utiliser append (>>)

cat TextB >> TextA 

résultat est que TEXTA précède le texte textb dans TEXTA

+1

Ceci est une solution problématique. Cela change le fichier TextA, que je ne veux pas. Par exemple, TextB est mon essai, tandis que TextA est une notice de copyright. Je veux utiliser la même notice de copyright pour tous mes essais. –

+1

Ensuite, vous pouvez utiliser: cat TEXTA TEXTB> TEXTA_B Notez que vous ne pouvez pas faire TEXTA TEXTB> TEXTB car le shell ouvre TEXTB pour l'écriture avant que cat l'ouvre pour la lecture. Cela provoquera l'effacement de TEXTB avant son utilisation, et l'effet sera le même que: chat TEXTA> TEXTB –

3

Dans un script bash, le premier paramètre est $ 1, le second $ 2 et ainsi de suite.

Si vous voulez une valeur par défaut, par exemple le troisième paramètre, vous pouvez utiliser:

var=${3:-"default"} 
+0

Je ne connaissais pas les valeurs par défaut. Merci! –

0

On dirait que vous pouvez juste faire ce qui suit:


TextA="text a" 
TextB="text b" 
echo "$TextA $TextB" > file1 

Ou utilisez le append (> >) opérateur.

1

Je ferais ce qui suit:

#!/bin/bash 

if [ $# -ne 2 ] 
then 
    echo "Prepend file with copyright notice" 
    echo "Usage: `basename $0` <copyright-file> <mainfile>" 
    exit 1 
fi 

copyright=$1 
mainfile=$2 

cat $mainfile > /tmp/m.$$ 
cat $copyright /tmp/m.$$ > $mainfile 

#cleanup temporary files 
rm /tmp/m.$$ /tmp/m2.$$ 
1

Je suis surpris que personne ne suggère le résultat suivant

cat TextA TextB | tee > TextB 

De cette façon, vous pouvez éviter les tracas de la création d'un fichier temporaire.

+0

cela fonctionne-t-il lorsque TextB est trop grand pour tenir dans la mémoire? Dans ce cas, le tee peut commencer à écraser TextB avant que le chat ne finisse de lire tout cela. –

+0

@Nathan: Bon point! Je ne suis pas sûr. Je n'ai pas encore de problème avec la mémoire. Savez-vous quelle est la limite de mémoire? –

Questions connexes