2014-09-02 3 views
0

En tant que newbee Unix, je veux analyser le chemin complet du fichierAffecter une valeur à une variable après une coupe?

/Users/E/atsp_0001.tar.gz

dans 0001 et affecter la 0001 à la variable sub_id.

L'analyse syntaxique, bien que les travaux peut-être maladroit, comme ceci:

E$ file=/Users/E/atsp_0001.tar.gz 
E$ echo ${file##*/} | cut -d "_" -f2 | cut -d "." -f1 
0001 

Ensuite, je ne ai pas affecter le 0001 à une variable comme ceci:

E$ file=/Users/E/atsp_0001.tar.gz 
E$ sub_id=${file##*/} | cut -d "_" -f2 | cut -d "." -f1 
E$ echo ${sub_id} 

E$ 

Je serais très heureux, si (0) expliquer pourquoi cela ne fonctionne pas et comment le réparer, et (2) améliorer l'analyse maladroite.

Répondre

1

Voici comment nous procédons. Vous pouvez utiliser $(). Vous pouvez également utiliser `` au lieu de $() mais je ne le recommanderais pas.

:~> file=/Users/E/atsp_0001.tar.gz 
:~> echo ${file##*/} | cut -d "_" -f2 | cut -d "." -f1 
0001 
:~> variabletest=$(echo ${file##*/} | cut -d "_" -f2 | cut -d "." -f1) 
:~> echo $variabletest 
0001 

Vous faites plusieurs opérations dans l'affectation des variables plutôt que de stocker la valeur qui est la raison pour laquelle il ne fonctionne pas pour vous

echo imprimera les données, mais vous faites opération canalisé de sorte que ne fonctionnera pas jusqu'à ce que vous entourez-le pour le marquer comme une seule opération. Votre analyse est OK car elle dépend de vos conventions de dénomination de fichier. Mais j'utiliserais la commande de nom de base

:~> echo $file 
/Users/E/atsp_0001.tar.gz 

:~> basename $file 
atsp_0001.tar.gz 

Ceci supprimera le chemin.

Donc vous pouvez le faire variabletest=$(echo basename $file | cut -d "_" -f2 | cut -d "." -f1)

+0

Merci beaucoup! (1) L'écho ne signifie donc pas «imprimer», n'est-ce pas? (2) L'analyse n'est-elle pas maladroite? –

Questions connexes