2017-10-10 4 views
3

Ok j'ai une fonction qui aura comme paramètre une chaîne et il émet un nouvelle chaîne que n'a pas ont des espaces , ', "Bash - Renommer le fichier qui ont "dans ce

function rename_file() { 

local string_to_change=$1 
local length=${#string_to_change} 
local i=0 
local new_string=" " 
local charac 

for i in $(seq $length); do 
    i=$((i-1)) 
    charac="${string_to_change:i:1}" 

    if [ "$charac" != " " ] && [ "$charac" != "'" ] && [ "$charac" != """ ]; then #Here if the char is not" ", " ' ", or " " ", we will add this char to our current new_string and else, we do nothing 

     new_string=$new_string$charaC#simply append the "normal" char to new_string 

    fi 

done 

echo $new_string #Just print the new string without spaces and other characters 
} 

Mais je ne peux pas tester si le caractère est " parce qu'il ne fonctionne pas seulement. Et si je l'appelle ma fonction avec

rename_file (file"n am_e) 

il suffit d'ouvrir > et attend moi pour entrer quelque chose .. toute aide?

+0

Avez-vous essayé rename_file (fichier \ "n am_e) –

+0

Si vous tapez (ou mettez un script)' rename_file (fichier "n ame)', alors vous n'avez pas appelé la fonction 'rename_file' avec l'argument' file "n ame." Au lieu de cela, vous avez entré le début d'une chaîne, et bash vous invite et vous attend pour terminer la chaîne.Essayez 'Rename_file file \" n ame' –

+0

Vous ne savez pas si vous voulez une solution purement bash, mais puis-je suggérer un one-liner à la place? :) 'new_string = $ (echo $ string | sed -e 's///' -e 's /, //' -e 's /" //') '. Aussi, changez $ 1' en $ {@} 'en tant que paramètre de fonction, sinon il va se casser sur les espaces – favoretti

Répondre

5

Mettez le nom entre guillemets simples.

rename_file 'file"n am_e' 

Et si vous voulez tester des guillemets simples, mettre des guillemets doubles:

rename_file "file'n am_e" 

Pour tester les deux, les mettre en doubles guillemets et les guillemets internes:

rename_file "file'na \"me" 

Une autre option consiste à utiliser une variable:

quote='"' 
rename_file "file'na ${quote}me" 

De même, vous n'avez pas besoin de mettre des parenthèses autour des arguments d'une fonction shell. Ils sont appelés comme des commandes ordinaires, avec des arguments séparés par des espaces sur la même ligne de commande.

Et vous n'avez pas besoin de cette boucle pour remplacer les caractères.

new_string=${string_to_change//[\"\' ]/} 

Voir Parameter Expansion dans le Manuel Bash pour une explication de cette syntaxe.

+2

Je soupçonne que l'OP ne veut pas réellement les parens dans le nom de fichier, et il peut être utile de souligner qu'ils ne sont pas nécessaires dans un appel de fonction –

+0

Ah, celui-ci est en fait assez cool! J'ai oublié les expansions moi-même, offert une solution basée sur sed dans le commentaire à OP – favoretti

+0

@WilliamPursell Merci, mis à jour la réponse – Barmar