Contenu | Rechercher | Menus

Annonce

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

Ubuntu 18.04 LTS
Ubuntu-fr propose des clés USB de Ubuntu et toutes ses « saveurs » ainsi qu'un magnifique t-shirt pour cette toute nouvelle version d'Ubuntu !

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 11/09/2017, à 12:04

kholo

[tuto bash] changement valeurs dans un fichier texte

Bonjour à tous,
aujourd'hui on va modifier des fichiers de texte.
Le but est d'avoir une fonction facilement modifiable pour tester et changer une valeur sur une ligne dans le fichier du type

texte=une valeur

cas 1 simple
un fichier sert de référence à un interrupteur
je crée 2 fichiers
fichier 1 "on-off.txt"

on-off=0

fichier 2 "on-off.sh"

#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION="changement valeur dans un fichier texte - cas simple"
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
echo "lancement $nomlogiciel..."

echo "------------------------
fichier avant modification"
#cat "on-off.txt"
echo $( < "on-off.txt") # autre façon de faire un cat

# modification de la valeur
#case $(cat "on-off.txt") in # UUOC mauvaise utilisation de cat
case $(< "on-off.txt") in
	on-off=1) echo "on-off=0" > "on-off.txt" ;;
	on-off=0) echo "on-off=1" > "on-off.txt" ;;
esac

echo "fichier après modification"
cat "on-off.txt"

exit 0

explications :
chaque fois que le script est lancé, il regarde dans le fichier et inverse la valeur en modifiant toute la ligne (et tout le fichier). on peut facilement récupérer la valeur avec un cat.
NB on peut faire plus simple et ne mettre dans le fichier que la valeur 0 ou 1 (mais j'ai pris cette forme pour la suite du tuto)

autre méthode simple

#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION="changement valeur dans un fichier texte - cas simple"
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
echo "lancement $nomlogiciel..."
echo "------------------------
fichier avant modification"
read -r onOff <"on-off.txt"
echo "$onOff"
case $onOff in
	on-off=1) echo "on-off=0" > "on-off.txt" ;;
	on-off=0) echo "on-off=1" > "on-off.txt" ;;
esac
echo "fichier après modification"
# cat on-off.txt
echo "$( < on-off.txt)" # fait la même chose.

exit 0
Anonyme68 (expliqué) a écrit :
sed -i '/^on-off/y/01/10/' "on-off.txt"

ne marche que si la valeur contient qu'un chiffre

explication a écrit :

vous pouvez remplacer

case $onOff in
	on-off=1) echo "on-off=0" > "on-off.txt" ;;
	on-off=0) echo "on-off=1" > "on-off.txt" ;;
esac

par cette ligne

cas 2 : utiliser sed
fichier 1 "on-off.txt"

on-off=0
enabled=0
unTexte=gnouf gnouf
laVariable=et un autre

fichier 2 "on-off.sh"

#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION="changement valeur dans un fichier texte - cas 2 : utiliser sed"
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
echo "lancement $nomlogiciel..."

dans1prendre2remplacer3par4 () {
	local unFichier="$1"
	local uneVariable="$2"
	local unTexte="$3"
	local unAutreTexte="$4"
	# echo "
	# unFichier=$unFichier
	# uneVariable=$uneVariable
	# unTexte=$unTexte
	# unAutreTexte=$unAutreTexte
	# "
	
	sed -i "s/${uneVariable}=${unTexte}/${uneVariable}=${unAutreTexte}/" "${unFichier}"
	}

echo "--------------------------------"
echo "fichier avant modification"
cat "on-off.txt"
dans1prendre2remplacer3par4 "on-off.txt" "laVariable" "et un autre" "avec du texte"
echo "--------------------------------"
echo "fichier après modification"
cat "on-off.txt"

exit 0

explications :
chaque fois que le script est lancé, cette fois il ne modifie que la ligne concernée avec la valeur envoyée mais il faut connaître la valeur actuelle sur la ligne

cas 3 : utiliser sed sans connaître la valeur de la variable à modifier
fichier 1 "on-off.txt"

on-off=0
enabled=0
unTexte=gnouf gnouf
laVariable=et un autre

fichier 2 "on-off.sh"

#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION="changement valeur dans un fichier texte - cas 3 : utiliser sed sans connaître la valeur de la variable à modifier"
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
echo "lancement $nomlogiciel..."

dans1prendre2remplacerLaValeurpar3 () {
	local unFichier="$1"
	local uneVariable="$2"
	local unAutreTexte="$3"
	local unTexte="$( grep "${uneVariable}=" "$unFichier" )"
	unTexte="${unTexte##*${uneVariable}=}"
	
	sed -i "s/${uneVariable}=${unTexte}/${uneVariable}=${unAutreTexte}/" "${unFichier}"
	
	}
# mettre ici la valeur changée
nouvelleValeur="ce que je veux"

echo "--------------------------------"
echo "fichier avant modification"
cat "on-off.txt"
dans1prendre2remplacerLaValeurpar3 "on-off.txt" "laVariable" "${nouvelleValeur}"
echo "--------------------------------"
echo "fichier après modification"
cat "on-off.txt"
exit 0

explications :
chaque fois que le script est lancé, il ne modifie que la ligne concernée avec la valeur envoyée mais sans avoir à connaître la valeur actuelle de la variable

NB : les limites :
si une variable est identifiée 2 fois (si une ligne est commentée) c'est la dernière ligne concernée qui est modifiée et l'autre ou les autres non
on peut aller un peu plus loin en ajoutant une boucle qui changera toutes les valeurs correspondantes sans tenir compte du fait que certaines des lignes soient en commentaires
pas terrible mais fonctionnel...

fichier 1 "on-off.txt"

on-off=0
enabled=0
unTexte=gnouf gnouf
laVariable=hop hop hop
#laVariable=tout doit disparaitre

fichier 2

#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION="changement valeur dans un fichier texte - les limites"
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
echo "lancement $nomlogiciel..."

dans1prendre2remplacerLaValeurpar3 () {
	local unFichier="$1"
	local uneVariable="$2"
	local unAutreTexte="$3"
	local unTexte="$( grep "${uneVariable}=" "$unFichier" )"
	IFS=$'\n' unTexte=( $unTexte )
	
	for leTexte in ${unTexte[@]}
	do
		leTexte="${leTexte##*${uneVariable}=}"
		sed -i "s/${uneVariable}=${leTexte}/${uneVariable}=${unAutreTexte}/" "${unFichier}"
	done
	}

# mettre ici la valeur changée
nouvelleValeur="ce que je veux"

echo "--------------------------------"
echo "fichier avant modification"
cat on-off.txt
dans1prendre2remplacerLaValeurpar3 "on-off.txt" "laVariable" "${nouvelleValeur}"
echo "--------------------------------"
echo "fichier après modification"
cat on-off.txt
exit 0

Dernière modification par kholo (Le 12/09/2017, à 10:07)

Hors ligne

#2 Le 11/09/2017, à 14:58

Watael

Re : [tuto bash] changement valeurs dans un fichier texte

salut,

cas 1 : UUOC

read -r onOff <on-off.txt
echo "$onOff"
case $onOff in
...
esac
cat on-off.txt # eh, oui ! il faut quand même afficher le résultat ;)
# mais ce n'est pas indispensable en bash :
echo "$( < on-off.txt)" # fait la même chose.

cas 3 : UUOC.
grep sait lire un fichier, comme sed, awk...


eval, c'est mal.

Hors ligne

#3 Le 11/09/2017, à 15:57

kholo

Re : [tuto bash] changement valeurs dans un fichier texte

merci Watael,
je vais essayer de retenir tout cela

la syntaxe

echo "$( < on-off.txt)"

est compliquée à retenir...
mais je comprends parfaitement l’intérêt de virer le cat et le pipe

Hors ligne

#4 Le 11/09/2017, à 20:59

Watael

Re : [tuto bash] changement valeurs dans un fichier texte

case $(echo $( < "on-off.txt")) in

bah, non.

case $(<on-off.txt) in

eval, c'est mal.

Hors ligne

#5 Le 12/09/2017, à 07:35

Compte anonymisé

Re : [tuto bash] changement valeurs dans un fichier texte

vous êtes fatigués ? big_smile

sed -i '/^on-off/y/01/10/' on-off.txt

ou c'est moi, enfin ça marche que si la valeur contient qu'un chiffre smile

UUOC c'est l'utilisation inutile de cat, si tu te retrouves avec une solution plus compliqué en évitant le cat, c'est plus un UUOC. UUOC != interdiction du cat

Dernière modification par Compte anonymisé (Le 12/09/2017, à 07:42)

#6 Le 12/09/2017, à 08:38

kholo

Re : [tuto bash] changement valeurs dans un fichier texte

ok,
j'en apprends tous les jours et plus j'en sais et plus j'en ai à apprendre...

je vais remettre les cat là où ils restent les plus évidents et j'en laisserai un pour l'exemple
je vais mettre la variante de Anonyme68 en avant avec les contre indications et l'alternative de Watael...
merci...
je suis aux anges !

Hors ligne

#7 Le 12/09/2017, à 12:18

kholo

Re : [tuto bash] changement valeurs dans un fichier texte

avec ce fichier je cherche à ne modifier que les lignes qui ne sont pas en commentaire

laVariable=de un
laVariable=deux deux # commentaire
# laVariable=de trois 
#laVariable=et cat

je cherche à tenir compte des lignes avec commentaires
mais ça reste "sale":

dans1prendre2remplacerLaValeurpar3 () {
	local unFichier="$1"
	local uneVariable="$2"
	local unAutreTexte="$3"
	local unTexte="$(grep "${uneVariable}=" "$unFichier")"
	IFS=$'\n' unTexte=( $unTexte )

Methode 1

	for leTexte in ${unTexte[@]}
	do
		leTexte="${leTexte##*${uneVariable}=}"
		sed -i "/^#/!s/${uneVariable}=${leTexte}/${uneVariable}=${unAutreTexte}/g" "${unFichier}"
		# attention ces lignes retirent les commentaires de fin de ligne
	done
	}

Methode 2

	for leTexte in ${unTexte[@]}
	do
		isCom=$( grep -E -v '^#' <<< ${leTexte} )
		if [ ${#isCom} -gt 1 ] ; then
			leTexte="${leTexte##*${uneVariable}=}"
			sed -i "s/${uneVariable}=${leTexte}/${uneVariable}=${unAutreTexte}/g" "${unFichier}"
			# attention ces lignes retirent les commentaires de fin de ligne
		# fi
	done
	}

sinon
-x sur le sed considère la ligne entière pour l'échange
mais ne tiendrait pas non plus compte des lignes avec des commentaires à la fin
donc on pourrait avoir tout ça...
des idées ?

Hors ligne

#8 Le 12/09/2017, à 13:47

Watael

Re : [tuto bash] changement valeurs dans un fichier texte

oulala, on s'y perd.

pourquoi utiliser et grep et sed et le remplacement de paramètres ?

soit un fichier de plusieurs lignes :

laVariable=de un
laVariable=deux deux # commentaire
# laVariable=de trois 
#laVariable=et cat

on veut, sur toutes les lignes qui ne sont pas commentées, remplacer toutes les expressions laVariable. <-un point, c'est tout.
voilà les spécifications, elles ne doivent plus changer pour l'exemple.
si on change les spécs, on change de cas.

d'abord, savoir lire un fichier en shell :

while read line; do echo "$line"; done < fichier

ensuite, on effectue la sélection : les lignes non commentées

 while read line; do test "${line:0:1}" = "#" && echo "remplace PAS -> $line" || echo "remplace -> $line"; done < fichier

si c'est bon, on fait le remplacement :

while read line; do test "${line:0:1}" = "#" || line="${line//laVariable/REMPLACÉ}"; echo "$line"; done < fichier

si on change les consignes, on change de cas.

Dernière modification par Watael (Le 12/09/2017, à 13:48)


eval, c'est mal.

Hors ligne

#9 Le 12/09/2017, à 14:21

kholo

Re : [tuto bash] changement valeurs dans un fichier texte

oui, c'est vrai je part un peu dans tous les sens...
au début je voulais juste un truc simple...
bon on y est...

maintenant un cas concret : la swappiness
par défaut, on a rien dans le fichier et ubuntu desktop swap avec une valeur de 60
pour modifier

echo vm.swappiness=5 | sudo tee /etc/sysctl.d/99-swappiness.conf

mais il peut arriver qu'on ai déjà mis une ligne avec la valeur... d'où ce fil,
mais aussi on peut avoir ajouté des lignes d'exemples ou de tests et se retrouver avec

#pour modifier le déclenchement de la swap utilisez "vm.swappiness=valeur"
#avec "valeur" en pourcentage avant déclenchement
#exemple 
#vm.swappiness=10
vm.swappiness=5

donc, je me suis dis qu'il suffisait de distinguer les lignes avec #
mais on peut avoir (on est d'accord les valeurs sont bidonnées)

#vm.swappiness=10 # pour un serveur
vm.swappiness=10 # pour ce que vous voulez

Hors ligne

#10 Le 12/09/2017, à 15:17

Watael

Re : [tuto bash] changement valeurs dans un fichier texte

fichier=/etc/sysctl.d/99-swapiness.conf
if test -s "$fichier"
then
    echo "le fichier existe et n'est pas vide"
# plusieurs traitements possibles :
#    si le fichier n'est pas gros : avec bash _seul_
#    si le fichier est gros : avec sed _seul_
#    s'il y a des calculs à effectuer : avec awk _seul_
elif test -f "$fichier"
then
    echo "le fichier est vide" #on peut l'écraser, avec une redirection.
else
    echo "le fichier n'existe pas" #il faut le créer, avec une redirection.
fi

Dernière modification par Watael (Le 12/09/2017, à 15:19)


eval, c'est mal.

Hors ligne

#11 Le 12/09/2017, à 17:37

Compte anonymisé

Re : [tuto bash] changement valeurs dans un fichier texte

$ cat fichier
laVariable=de un
laVariable=deux deux # commentaire
# laVariable=de trois 
#laVariable=et cat
$ sed -r 's/^[[:blank:]]*laVariable=[^#]*(#?.*)/laVariable=new value \1/' fichier 
laVariable=new value 
laVariable=new value # commentaire
# laVariable=de trois 
#laVariable=et cat

si j'ai bien suivi, un truc comme ça ?

$ cat fichier 
#pour modifier le déclenchement de la swap utilisez "vm.swappiness=valeur"
#avec "valeur" en pourcentage avant déclenchement
#exemple 
#vm.swappiness=10
vm.swappiness=5
$ sed -r 's/^[[:blank:]]*vm.swappiness=[^#]*(#?.*)/vm.swappiness=60 \1/' fichier
#pour modifier le déclenchement de la swap utilisez "vm.swappiness=valeur"
#avec "valeur" en pourcentage avant déclenchement
#exemple 
#vm.swappiness=10
vm.swappiness=60

PS : le ^[[:blank:]]* n'est pas obligatioire dans ce cas, mais si il y a un espace ou équivalent avant la variable

EDIT : simplification

Dernière modification par Compte anonymisé (Le 12/09/2017, à 17:59)

#12 Le 04/01/2018, à 13:20

kholo

Re : [tuto bash] changement valeurs dans un fichier texte

bon, comme je passais par là, je fais avancer le schmilblick
je n'ai pas pu mettre en œuvre la version de anonyme68
une version testable :
elle crée et supprime les fichiers pour les tests
juste créez le fichier exécutable et lancez le

#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION="dans un fichier, prendre la valeur et remplacer par une autre"
# https://forum.ubuntu-fr.org/viewtopic.php?pid=21793651
VERSION="006"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
echo "lancement $nomlogiciel..."
echo "DEMO :"
LE_FICHIER="/tmp/test-change-conf.txt"

# création du fichier :
echo "# fichier de test
on-off=0
enabled=0
plus_dur=un texte avec des espaces
unTexte=gnouf gnouf # un commentaire
# faut pas se tromper de ligne
# laVariable=de trois 
#laVariable=et cat
laVariable=coucou pizza 3 # un autre commentaire
#laVariable=et cat encore

# exemples d'affectations avec espaces autour du =
# NB seul l'espace APRES est valide
unevariable1=unevaleur
unevariable2= unevaleur
unevariable3=unevaleur # un commentaire 1
unevariable4= unevaleur # un commentaire 2
unevariable5 =unevaleur NON
unevariable6 = unevaleur NON
unevariable7 =unevaleur # un commentaire 3 NON
unevariable8 = unevaleur # un commentaire 4 NON

# NB unevariable9 déjà existante mais commentée
# une nouvelle valeur ajoutera une ligne pour conserver celle existante si celle ci étais un exemple
# NB : nouvelle valeur ajoutée à la fin du fichier quelque soit l'emplacement du commentaire
# unevariable9= unevaleur" > "${LE_FICHIER}"
# la copie conservera une trace pour faire un diff à la fin
# (pour la démo)
cp "${LE_FICHIER}" "${LE_FICHIER}.old"

dansfichier1prendre2remplacerLaValeurpar3 () {
	local unFichier="$1"
	local uneVariable="$2"
	local unAutreTexte="$3"

	# recherche la variable (doit commencer la ligne ;
	# pour ignorer les lignes de commentaire)
	# if grep -q ^${uneVariable}= "${unFichier}"
	if grep -q ^${uneVariable} "${unFichier}"
	then 
		local unTexte=()
		local leTexte=""
		local un_com=""

		# IFS=$'\n' unTexte=( $(grep "${uneVariable}=" "$unFichier") )
		IFS=$'\n' unTexte=( $(grep "${uneVariable}" "$unFichier") )
		for leTexte in ${unTexte[@]}
		do
				leTexte="${leTexte#*${uneVariable}=}"

				# MODIFICATION

				# version Anonyme68
				# https://forum.ubuntu-fr.org/viewtopic.php?pid=21849497#p21849497
				# sed -ri 's/^[[:blank:]]*'"$uneVariable"'=[^#]*(#?.*)/'"$uneVariable=$unAutreTexte"' \1/' "$unFichier"
				# sed -ri 's/^[[:blank:]]*'"${uneVariable}"'=[^#]*(#?.*)/'"${uneVariable}=${unAutreTexte}"' \1/' "${unFichier}"
		done
	else
		echo "${uneVariable}=${unAutreTexte}" >> "${unFichier}"
	fi
	}

# mettre ici la valeur changée
nouvelleValeur="ce que je veux"

echo "--------------------------------"
echo "fichier avant modification"
echo "--------------------------------"
cat "${LE_FICHIER}"

echo "--------------------------------"
echo "# TOUT SE PASSE ICI"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "on-off" "1"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "plus_dur" "cool ca marche"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "laVariable" "${nouvelleValeur}"

dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable1" "unevaleur1"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable2" "unevaleur2"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable3" "unevaleur3"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable4" "unevaleur4"

echo "--------------------------------"
# erreurs 
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable5" "unevaleur5"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable6" "unevaleur6"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable7" "unevaleur7"
dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable8" "unevaleur8"
echo "--------------------------------"

dansfichier1prendre2remplacerLaValeurpar3 "${LE_FICHIER}" "unevariable9" "unevaleur9"

echo "--------------------------------"
echo "fichier après modification"
echo "--------------------------------"
cat "${LE_FICHIER}"
echo "--------------------------------"
echo "Affichage des différences"
echo "--------------------------------"
diff "${LE_FICHIER}" "${LE_FICHIER}.old"
echo "--------------------------------"
# lignes non modifiées
echo 'lignes exemples non modifiées (grep "unevaleur ")'
cat "${LE_FICHIER}" | grep "unevaleur "
rm "${LE_FICHIER}"
rm "${LE_FICHIER}.old"

exit 0

Dernière modification par kholo (Le 05/01/2018, à 10:32)

Hors ligne

#13 Le 05/01/2018, à 08:45

Compte anonymisé

Re : [tuto bash] changement valeurs dans un fichier texte

man bash

paragraphe "protections" et "définitions"

si tu commençais par la base ? lire le manuel ?

sed -r 's/^[[:blank:]]*${uneVariable}=[^#]*(#?.*)/${uneVariable}=${unAutreTexte} \1/' "${unFichier}"

sed ne connait pas ${uneVariable} alias $uneVariable (bordel, pourquoi tu mets des chevrons partout ?)

c'est à bash de l’interpréter, donc il ne faut pas que $uneVariable soit protégé sinon il est envoyé tel quel à sed. Et pour éviter que bash découpe en mot  (voir le manuel) au cas où la variable contient un espace il faut la mettre la variable entre double guillemets.

exemple :

sed -ri 's/^[[:blank:]]*'"$uneVariable"'=[^#]*(#?.*)/'"$uneVariable=$unAutreTexte"' \1/' "$unFichier"

#14 Le 05/01/2018, à 09:57

kholo

Re : [tuto bash] changement valeurs dans un fichier texte

merci pour les précisions...

ok je décompose...
sed -ri 's/^[[:blank:]]*'"$uneVariable"'=[^#]*(#?.*)/'"$uneVariable=$unAutreTexte"' \1/' "$unFichier"

sed -ri 

's/^[[:blank:]]*'
"$uneVariable"
'=[^#]*(#?.*)/'

"$uneVariable=$unAutreTexte"
' \1/' 

"$unFichier"

Hors ligne

#15 Le 05/01/2018, à 10:58

kholo

Re : [tuto bash] changement valeurs dans un fichier texte

bon, je tire un script de tout cela :
fichier : dansfichier1prendre2remplacerLaValeurpar3 (bien sûr on peut faire plus court !)

#!/bin/bash
# ----------------------------------------------
# https://forum.ubuntu-fr.org/viewtopic.php?id=2014654
# http://wiki.bash-hackers.org/
nomlogiciel="${0##*/}"
FONCTION="script dansfichier1prendre2remplacerLaValeurpar3 :
dans un fichier $1
prendre (rechercher) $2
remplacer La Valeur de $2 par $3"
VERSION="0.004"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
# echo "lancement $nomlogiciel..."
# echo "chargement ligne $LINENO"

# set -o xtrace

# parser les arguments
unFichier="$1"
uneVariable="$2"
unAutreTexte="$3"

aide () {
cat << EOF
AIDE
---------------------------------------
$0 version - $VERSION
---------------------------------------
$FONCTION
Dans des fichiers de configuration, on a souvent besoin de ne modifier qu'une ou quelques lignes \
voire d'ajouter une ligne de configuration sans savoir si elle existe déjà.
Ces lignes de configurations sont sous la forme :
une_variable=une valeur
et éventuellement un commentaire
une_variable=une valeur # un commentaire

Utilisation :
$nomlogiciel "FICHIER" OPTION VALEUR
exemple : 
dans le fichier /etc/default/grub changer la valeur de  GRUB_TIMEOUT  à 5
sudo ./$nomlogiciel "/etc/default/grub" GRUB_TIMEOUT 5
sudo update-grub
---------------------------------------
exemples de lignes reconnues d'affectation de valeur à une variable
unevariable1=unevaleur
unevariable2= unevaleur
unevariable3=unevaleur # un commentaire 3
unevariable4= unevaleur # un commentaire 4
EOF
	}

# [ -z "$@" ] && { echo -e "erreur : pas d'argument" ; aide ; exit 65 ; }
# [ -z "$2" ] && { echo -e "erreur : impossible de parser $@" ; aide ; exit 66 ; }
# [ -z "$3" ] && { echo -e "erreur : impossible de parser $@" ; aide ; exit 67 ; }
# if [ -f "$1" ] 
# then 
	# echo -e "erreur : impossible de parser $@"
	# aide
	# exit 68
# fi

# tableau de chaque ligne du fichier
unTexte=()
# une ligne du fichier prise temporairement
leTexte=""

remplacerValeur () {
	unTexte=()
	leTexte=""

	IFS=$'\n' unTexte=( $(grep "${uneVariable}" "$unFichier") )
	for leTexte in ${unTexte[@]}
	do
		leTexte="${leTexte##*${uneVariable}=}"

		sed -ri 's/^[[:blank:]]*'"$uneVariable"'=[^#]*(#?.*)/'"$uneVariable=$unAutreTexte"' \1/' "$unFichier"
	done
	}
ajouterValeur () {
	echo "${uneVariable}=${unAutreTexte}" >> "${unFichier}"
	}

# recherche la variable qui doit commencer la ligne 
# (^ pour ignorer les lignes de commentaire)
if grep -q ^${uneVariable} "${unFichier}"
then 
	# remplacerValeur
	remplacerValeur && {
	exit 0
	} || { 
		exit 1
	}
else 
	# ajouterValeur
	ajouterValeur && {
	exit 0
	} || { 
		exit 1
	}
fi

exit 0

mise en œuvre
ATTENTION CET EXEMPLE MODIFIE UNE VALEUR SYSTEME
DANS UN FICHIER SYSTEME... à n'exécuter qu'en connaissance de cause

en ligne de commande
on va changer GRUB_TIMEOUT=X en GRUB_TIMEOUT=5 dans /etc/default/grub

sudo ./dansfichier1prendre2remplacerLaValeurpar3 "/etc/default/grub" GRUB_TIMEOUT 5

puis normalement

sudo update-grub

un script
fichier : change_grub_option

#!/bin/bash
# ----------------------------------------------
# http://wiki.bash-hackers.org/
nomlogiciel="${0##*/}"
FONCTION="démonstration lancement de dansfichier1prendre2remplacerLaValeurpar3
appliqué au fichier de configuration de grub
ici, on change la valeur du temps d'attente"
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
echo "lancement $nomlogiciel..."
# echo "chargement ligne $LINENO"
# set -o xtrace

echo "ROOT OBLIGATOIRE"
if [ "$UID" -ne "0" ]
then
	echo "Vous devez être en mode SU pour pouvoir utilisé ce script"
	echo "je relance la commande $NOM_LOGICIEL en sudo; Entrez le mot de passe root"
	sudo ./"$nomlogiciel"
	exit 1
fi

# on va changer GRUB_TIMEOUT=X en GRUB_TIMEOUT=5

./dansfichier1prendre2remplacerLaValeurpar3 "/etc/default/grub" GRUB_TIMEOUT 5
# puis normalement
update-grub

reset
# cat "/etc/default/grub" | grep GRUB_TIMEOUT
cat "/etc/default/grub"

exit 0

puis on lance le script

./change_grub_option

Dernière modification par kholo (Le 05/01/2018, à 11:41)

Hors ligne