Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/08/2008, à 13:18

®om

Paramètres avec espaces et séparateur \n

Salut,

Tout d'abord, un script monscript qui permet de voir les arguments passés en ligne de commande :

#!/bin/sh
for arg; do echo "-- $arg"; done

Supposons que dans une variable, on ait n chemins séparés par des '\n' (ou chaque chemin peuvent comporter des espaces), et qu'on veuille passer chacun de ces chemins en paramètre d'un autre script :

#!/bin/sh
paths="/tmp/a
/tmp/b c
/tmp/d/e f/g"
./monscript ??????

Si à la place des ?????? je mets $paths (./monscript $path), j'obtiens :

-- /tmp/a
-- /tmp/b
-- c
-- /tmp/d/e
-- f/g

Si par contre je mets "$paths" (./monscript "$path"), j'obtiens :

-- /tmp/a
/tmp/b c
/tmp/d/e f/g

Comment donc obtenir :

-- /tmp/a
-- /tmp/b c
-- /tmp/d/e f/g

(autrement dit, 1 chemin par argument)?

Hors ligne

#2 Le 30/08/2008, à 13:40

Yannick_LM

Re : Paramètres avec espaces et séparateur \n

Le plus simple à mon avis est de jouer avec la variable IFS
(internal field separator: en gros, le truc qui sépare les arguments)

Quelque chose du genre:

OLD_IFS=$IFS
IFS="
"
paths="/tmp/a
/tmp/b c
/tmp/d/e f/g"

./monscript $paths

IFS=$OLD_IFS

Dernière modification par Yannick_LM (Le 30/08/2008, à 13:41)


Trucs et astuces pour Vim
Ma web page  avec des trucs dessus ...

Hors ligne

#3 Le 30/08/2008, à 14:42

Alain.g

Re : Paramètres avec espaces et séparateur \n

En bash on utiliserait un tableau :

#!/bin/bash
paths=("/tmp/a" "/tmp/b c" "/tmp/d/e f/g")
./monscript "${paths[@]}"

Xubuntu Karmic !

Hors ligne

#4 Le 30/08/2008, à 19:50

Totor

Re : Paramètres avec espaces et séparateur \n

Pour répondre à ta question, une solution sans changer grand chose, si ce n'est monscript.sh :

#!/bin/bash

no=0
numArg=1
for arg;
do
	let no=${no}+1
	if [ ${no} -eq ${numArg} ]; then
		echo -e "${arg}"|while read chemin
		do
			echo "-- ${chemin}"
	     	done
        fi
done

Au besoin, change la valeur de numArg.
Aussi, lors de l'appel à monscript.sh, encadre paths avec des guillemets pour que ça fonctionne.

Sinon, tu peux aussi faire comme ceci :

Dans ton premier script :

echo -e "/tmp/a\n/tmp/b c\n/tmp/d/e f/g"|monscript.sh <arg1> <arg2> <arg...>

Ensuite, au début du script monscript.sh :

while read chemin
do
   echo "-- ${chemin}"
done

EDIT : Bien entendu, <arg1> <arg2> <arg...> étant d'autres paramètres que des chemins !

Dernière modification par Totor (Le 30/08/2008, à 19:52)


-- Lucid Lynx --

Hors ligne