j'ai un petit soucis avec mon script (ci-dessous) j'aimerai qu'il retourne "nicolas.sh" (juste en lui indiquant que le fichier suivant est un .sh) mais quand je lance le script celui-ci ne retourne rien :
#!/bin/bash
IN="albert/ouais/nicolas.sh"
OIFS=$IFS
IFS='/'
for x in $IN
do
if [ $x == "*.sh" ]
then
echo "> [$x]"
fi
done
Tu déclare OIFS avant IFS alors que OIFS doit contenir ce que IFS contient. D'ailleurs, je vois pas trop à quoi sert OIFS ici.
De plus, pour faire une comparaison avec une regex, il faut une syntaxe différente.
Toi tu veux faire:
#!/bin/bash
IN="albert/ouais/nicolas.sh"
IFS='/'
OIFS=$IFS
for x in $IN
do
if [[ "$x" =~ .*\.sh ]] # Ou [[ "$x" == *.sh ]] pour motif glob
then
echo "> [$x]"
fi
done
Cependant, ce n'est pas très propre vu que tu compares albert et ouais aussi d'abord. Et je suppose que le but est d'utiliser ce script dans une boucle. Ce qui donnera beaucoup plus d'opérations inutiles.
Il existe basename ( voir manuel) qui permet d'enlever les dossiers parents du chemin d'un fichier.
En fait de base j'ai ce script : (qui me permet de récupérer la différence entre 2 versions d'OSTicket)
#!/bin/bash
cd /root/Bureau
diff -r OSTicket1.8/osTicket-develop/ ticketcusto/osTicket-1.8-custom | grep ticketcusto/osTicket-1.8-custom | awk ‘{print $4}’ > differencecusto.txt #permet de récupérer les différences entre les deux fichiers et les répertories dans differencecusto.txt
c=$(sed -n '$=' differencecusto1.txt) #permet d'avoir le nombre de lignes dans le fichier texte
for i in `seq 1 $c`; #boucle pour passer en revu les fichiers
do
j=$(sed -n $i'p' differencecusto1.txt) #lire les lignes du fichier texte
cp -p $j DiffOSTICKETCustom #copier les lignes dans le dossier DiffOSTICKETCustom
done
Le problème c'est qu'à lui seul il ne me suffit pas, j'ai besoin d'ajouter des lignes pour que mon script ajoute les fichiers qui sont retournés dans les bons dossiers afin qu'ensuite je puisse appliquer la màj sur une version plus récente (oui une sombre histoire), seulement je suis très loin d'être un cador du scripting ! Je découvre totalement, si quelqu'un peut m'aider et apporter des modifications ça m'aiderai grandement !
#!/bin/bash
cd /root/Bureau
c=$(sed -n '$=' differencecusto1.txt)
for i in `seq 1 $c`;
do
j=$(sed -n $i'p' differencecusto1.txt)
case $j in
*/include/"*.php")
fich=$(basename "$j")
mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include
echo "$fich a ete deplace dans le dossier /include"
;;
*/include/cli/modules/file.php)
fich=$(basename "$j")
mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include/cli/modules
echo "$fich a ete deplace dans le dossier /include/cli/modules/"
;;
*/include/i18n/en_US/*)
fich=$(basename "$j")
mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include/i18n/en_US
echo "$fich a ete deplace dans le dossier /include/i18n/en_US"
;;
*/include/staff/"*")
fich=$(basename "$j")
mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include/staff
echo "$fich a ete deplace dans le dossier /include/staff"
;;
*/include/staff/templates/*)
fich=$(basename "$j")
mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include/staff/templates
echo "$fich a ete deplace dans le dossier /include/staff/templates"
;;
*)
fich=$(basename "$j")
echo "$fich n'a pas ete deplace"
esac
done
Evidemment la comparaison dans le case ne marche pas j'ai essayé =~ et == mais bon je poste ce que j'ai écris pour que vous compreniez le contexte mais il est faux.
oh, tu sais, tu peux le dire : tu es un total débutant, et tu fais n'importe quoi, parce que tu n'as pas lu la doc dispos.
un fichier se lit avec une boucle while :
while read line; do : whatever with "$line"; done < fichier
et il est préférable de présenter un échantillon représentatif du fichier à traiter, et du résultat correspondant attendu.
case/esac (le shell tout entier) obéit à une syntaxe fixe :
case MOT in [MOTIF [| MOTIF]...) COMMANDES ;;]... esac
en général, on ne change pas de répertoire dans un script : on concatène le répertoire au nom du fichier à traiter.
dans ton script, dans tous les cas, le répertoire est le même. :/
pour obtenir le résultat d'une commande dans une variable il faut utiliser une substitution de commande. la forme `cmd` est vieillotte, et peu pratique à imbriquer; maintenant on utilise $(cmd).
et avant d'écrire un script, on écrit un algorithme en pseudo-code.
- Edité par dantonq 23 février 2018 à 21:37:16
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Aide script comparaison de caractères
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique