2010-10-13 5 views
3

Je les bases de données nom suivant le formatComment briser la chaîne en script shell

username_databasename 

Maintenant, je veux mettre des sauvegardes de bases de données séparées dans le répertoire nom d'utilisateur comme

/backups/username/backup 

Comment puis-je obtenir la usernamae de cette chaîne

Je veux également que si la chaîne ne contient pas de trait de soulignement (_) alors la sauvegarde devrait aller à

/backups/others/backup 

Répondre

4

Vous pouvez faire:

username=others 
if echo $name | grep '_'; then 
username=$(echo $name | cut -d'_' -f 1) 
fi 
+1

merci pour cela. je veux aussi que si (_) n'est pas présent alors nom d'utilisateur par défaut = autres –

3

Vous pouvez utiliser une variante:

case $fullname in 
(*_*) username=$(echo $fullname | sed 's/_.*//');; 
(*) username=others;; 
esac 
backupdir="/backups/$username/backup" 
3

Jonathan Leffler a une réponse agréable, propre.

Si vous ne souhaitez pas utiliser sed pour une raison quelconque, vous pouvez remplacer le bit $(echo | sed) avec:

username="${fullname%_*}" 

qui fait la même chose.

0

vous pouvez utiliser awk:

username = `echo $name | awk -F"_" '{print $1}'` 
1

Pas besoin de cut, grep, sed ou awk ici. Il suffit d'utiliser la substitution de paramètres intégré de bash:

db_name=username_databasename 

username=others 
if [[ ${db_name} =~ '_' ]]; then 
    username=${db_name%%_*} 
fi 
backup_dir=/backups/${username}/backup 

Je préfère en tenir à une seule langue par scénario, avec aussi peu que possible fourches :-)

0

Pour une solution bash -seulement sans potentiellement coûteux appels à des programmes externes (seulement important si vous faites beaucoup, ce qui ne peut pas être le cas ici):

pax> export x=a ; if [[ "${x%%_*}" != "${x}" ]]; then 
...> export bkpdir=/backups/${x%%_*}/backup 
...> else 
...> export bkpdir=/backups/others/backup 
...> fi 
pax> echo "  ${bkpdir}" 
    /backups/others/backup 

pax> export x=a_b ; if [[ "${x%%_*}" != "${x}" ]]; then 
...> export bkpdir=/backups/${x%%_*}/backup 
...> else 
...> export bkpdir=/backups/others/backup 
...> fi 
pax> echo "  ${bkpdir}" 
    /backups/a/backup 

la déclaration if détecte s'il y a un trait de soulignement en cochant une chaîne modifiée contre le ori ginal. S'il y a un trait de soulignement, ils seront différents.

Le ${x%%_*} vous donne la chaîne jusqu'à la suppression du plus long _* motif (en d'autres termes, il supprime tout du premier soulignement à la fin).


A (légèrement) variante plus simple serait:

export bkpdir=/backups/others/backup 
if [[ "${x%%_*}" != "${x}" ]]; then 
    export bkpdir=/backups/${x%%_*}/backup 
fi 
+0

De quelle façon est-ce bash-only? L'opération '%%' est définie dans POSIX. De plus, vous n'avez pas besoin de mettre "export" partout. En fait, je ne vois pas pourquoi vous voudriez le mettre du tout, puisque vous ne faites aucun appel de programme externe. –

+0

Je voulais dire bash seulement comme dans aucun appel externe à grep ou sed. Je ne voulais pas dire que ça marcherait seulement à bash. Et j'utilise généralement l'export en cas de doute car il y a peu de choses plus ennuyantes que d'essayer de comprendre pourquoi un processus démarré ne peut pas voir la variable d'environnement. Mon utilisation de l'exportation n'a cependant rien à voir avec ma réponse - c'est un simple code de support pour donner un échantillon complet. – paxdiablo

+0

ha ha je pense que j'ai besoin d'apprendre tant de choses afin de comprendre votre réponse. Pouvez-vous s'il vous plaît me donner un tutoriel pour comprendre l'exportation, %% thing.i aussi ne sais pas beaucoup seb, awk. des tutts qui peuvent me faire écrire un programme comme vous. Bien que j'ai eu ma réponse en étapes simples, mais j'aime la façon dont les choses peuvent être faites –

2

En bash, vous pouvez utiliser des tableaux, comme ceci:

str="a/bc/def" 
IFS="/" arr=($str) 
echo ${arr[0]}; # prints 'a' 
echo ${arr[1]}; # prints 'bc' 
echo ${arr[2]}; # prints 'def' 

echo ${arr[@]}; # prints 'a bc def' 

Si vous voulez diviser la chaîne par un différent "séparateur", il suffit de changer IFS = "/" ligne à ce séparateur, par exemple

str="a,bc,def" 
IFS="," arr=($str) 
Questions connexes