{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2019/05/03/script-shell-unix-avec-ksh-bash-serveur-dimpression/","llm_html_url":"https://tutos-gameserver.fr/2019/05/03/script-shell-unix-avec-ksh-bash-serveur-dimpression/llm","llm_json_url":"https://tutos-gameserver.fr/2019/05/03/script-shell-unix-avec-ksh-bash-serveur-dimpression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Script shell Unix avec ksh / bash\n\n &#8211; Serveur d&rsquo;impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2019-05-03T13:55:37+00:00","modified_at":"2019-05-03T13:55:37+00:00","word_count":15025,"reading_time_seconds":4508,"summary":"Script shell Unix avec ksh / bash Document du cours: (dernière mise à jour le 22 mars 2012) Ces notes sont disponibles sur http://www.dartmouth.edu/~rc/classes/ksh. La version en ligne contient de nombreux liens vers des informations supplémentaires et peut être plus à jour que les notes imprimées. Les objectifs de cette classe sont de vous permettre [&hellip;]","summary_points":["Script shell Unix avec ksh / bash\n    Document du cours: (dernière mise à jour le 22 mars 2012) \nCes notes sont disponibles sur http://www.dartmouth.edu/~rc/classes/ksh.","La version en ligne contient de nombreux liens vers des informations supplémentaires et peut être plus à jour que les notes imprimées.","Les objectifs de cette classe sont de vous permettre de:\n\nDécouvrez quels types de problèmes conviennent aux scripts shell\n\nPassez en revue les commandes Unix les plus couramment utilisées et utiles dans les scripts de shell.","Écrire des scripts shell simples en utilisant les shells Bourne, Korn ou Bash\n\n\nCes notes sont destinées à être utilisées dans un cours en deux parties, d’une durée totale de 3 heures."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"f95d235038aa27a6940eb50b9528451e","plain_text":"Script shell Unix avec ksh / bash\n    Document du cours: (dernière mise à jour le 22 mars 2012) \nCes notes sont disponibles sur http://www.dartmouth.edu/~rc/classes/ksh. La version en ligne contient de nombreux liens vers des informations supplémentaires et peut être plus à jour que les notes imprimées.\n\n\n    Les objectifs de cette classe sont de vous permettre de:\n\nDécouvrez quels types de problèmes conviennent aux scripts shell\n\nPassez en revue les commandes Unix les plus couramment utilisées et utiles dans les scripts de shell.\n\nÉcrire des scripts shell simples en utilisant les shells Bourne, Korn ou Bash\n\n\nCes notes sont destinées à être utilisées dans un cours en deux parties, d’une durée totale de 3 heures.\n\nHypothèses:On suppose que vous savez déjà comment:\n\n\nconnectez-vous et obtenez une fenêtre de ligne de commande (n&#39;importe quel shell)\n\nexécuter des commandes de base, naviguer dans les répertoires\n\nutiliser une redirection simple d&#39;E / S et des tubes\n\nutiliser un éditeur de texte (n&#39;importe lequel)\n\nrecherche des détails sur l&#39;utilisation des commandes dans les pages de manuel\n\n\nDes exemples de commandes sont affichés comme ça. Beaucoup de commandes\nsont affichés avec des liens vers leurs pages de manuel complètes\n(sh)La sortie des commandes est affichée comme ça;\nles éléments optionnels sont [ in brackets ].\n\nCertaines descriptions dans ces notes ont plus de détails disponibles,\net sont notés comme ceci:\n\n\nPlus de détails sur cet article apparaissent ici. Les notes imprimées\ninclure toutes les informations supplémentaires\n\n\n\nLa permission est donnée de télécharger et d’utiliser ces notes et exemples de scripts, à condition que\ntous les avis de droits d&#39;auteur sont conservés intacts. Certains exemples sont tirés de textes\nou des ressources en ligne qui ont autorisé la redistribution.\n\n\n\nCes notes sont mises à jour de temps en temps. Le développement&quot;\nensemble de notes sont\n http://northstar-www.dartmouth.edu/~richard/classes/ksh\n(Dartmouth seulement)\n\n\n\nRichard Brittain, Services informatiques du Dartmouth College.\n© 2003,2004,2010 Dartmouth College.\nCommentaires et questions, contactez Richard.Brittain @ dartmouth.edu\n\n\n  \n\n\nTable des matières\n(1)\n\n\nUn fichier texte contenant des commandes qui auraient pu être saisies directement dans le shell.\n\nIl n&#39;y a pas de différence de syntaxe entre l&#39;utilisation interactive de la ligne de commande et le placement des commandes\ndans un fichier. Certaines commandes ne sont utiles que lorsqu&#39;elles sont utilisées de manière interactive (par exemple, rappel de l&#39;historique en ligne de commande).\net les autres commandes sont trop complexes pour pouvoir être utilisées de manière interactive.\n\n\nLe shell lui-même a des capacités limitées &#8211; le pouvoir provient de son utilisation comme &quot;colle&quot;\nlangue pour combiner les utilitaires Unix standard et un logiciel personnalisé, pour produire un outil\nplus utile que les composants seuls.\n\nTout shell peut être utilisé pour écrire un script shell. Pour permettre cela, la première ligne de chaque script\nest:#! / chemin / vers / shell        (par exemple. #! / bin / ksh).\n\nle #!    les caractères indiquent au système de localiser le chemin suivant, de le démarrer et de\nalimentez le reste du fichier en entrée.\nTout programme capable de lire les commandes d’un fichier peut être démarré de cette manière, à condition que\nreconnaît le #    convention de commentaires. Le programme est lancé, puis le fichier de script\nest donné comme argument. Pour cette raison, le script doit être lisible et exécutable.\nLes exemples sont perl, awk, tcl et python.\n\n\nTout fichier peut être utilisé comme entrée dans un shell en utilisant la syntaxe suivante:ksh myscript\n\nSi le fichier est rendu exécutable avec chmod, cela devient une nouvelle commande\net disponible pour utilisation (sujet à la recherche habituelle de $ PATH).chmod + x myscript\n\n\nUn script shell peut être aussi simple qu&#39;une séquence de commandes que vous tapez régulièrement. En mettant\nles dans un script, vous les réduisez à une seule commande.\n\nExemple: ex0 affichage, texte\n\n\n            1: #! / bin / sh\n            2: rendez-vous amoureux\n   3: pwd\n            4: du -k\n\n\n(2)\n\n\nCombinez des séquences de commandes longues et répétitives en une seule commande simple.\n\nGénéraliser une séquence d&#39;opérations sur un ensemble de données, en une procédure pouvant être\nappliqué à tout ensemble similaire de données.\n  \n(par exemple.\nappliquer la même analyse à chaque fichier de données sur un CD, sans avoir à répéter les commandes)\n\n\nCréer de nouvelles commandes en utilisant des combinaisons d’utilitaires comme les auteurs originaux\njamais pensé à.\n\nDes scripts shell simples peuvent être écrits sous la forme d&#39;alias shell, mais le script peut être mis à la disposition de tous les utilisateurs.\net tous les processus. Les alias de shell s&#39;appliquent uniquement au shell actuel.\n\nEnveloppez les programmes sur lesquels vous n&#39;avez aucun contrôle dans un environnement que vous pouvez contrôler.\n\npar exemple. définir des variables d&#39;environnement, basculer vers un répertoire spécial, créer ou sélectionner un fichier de configuration,\nredirigez la sortie, enregistrez l’utilisation, puis exécutez le programme.\n\n\nCréez des jeux de données personnalisés à la volée et appelez des applications (par exemple, matlab, sas, idl, gnuplot) pour fonctionner\nsur eux, ou créer des commandes / procédures d’application personnalisées.\n\nPrototypage rapide (mais évitez de laisser les prototypes devenir production)\n\n\nUtilisations typiques\n\nScripts de démarrage du système (/etc/init.d)\n\nAdministrateurs système, pour automatiser de nombreux aspects de la maintenance informatique, compte utilisateur\ncréation etc.\n\nOutils d&#39;installation du package d&#39;application\n \nD&#39;autres outils peuvent créer des installateurs plus sophistiqués (par exemple, tcl / tk), mais ne peuvent pas être considérés comme déjà installés. Les scripts shell sont utilisés car ils sont très portables. Certains logiciels sont livrés avec une installation complète de l&#39;outil qu&#39;il veut utiliser\n(tcl / tk / python) pour être autonome, mais cela conduit à un gonflement logiciel.\n\n\nScripts de démarrage d&#39;application, en particulier\napplications sans surveillance (par exemple, à partir de cron    ou à)\n\nTout utilisateur ayant besoin d&#39;automatiser le processus de configuration et d&#39;exécution d&#39;applications commerciales,\nou leur propre code.\n\n\nAUTOMATISER, AUTOMATISER, AUTOMATISER\n(3)\n\n\nsh\n\n&quot;Bourne&quot;, écrit par Steve Bourne chez AT &amp; T Bell Labs pour Unix V7 (1979).\nPetit, simple et (à l&#39;origine) très peu de commandes internes, donc il a appelé des programmes externes pour même le plus simple\ndes tâches. Il est toujours disponible sur tout ce qui ressemble vaguement à Unix.\n\ncsh\nLa coquille &quot;C&quot;. (Bill Joy, à Berkeley).\nBeaucoup de choses en commun\navec le shell Bourne, mais de nombreuses améliorations pour améliorer l’utilisation interactive. L&#39;interne\nles commandes utilisées uniquement dans les scripts sont très différent de &quot;sh&quot;, et\nsimilaire (par conception) à la syntaxe du langage &quot;C&quot;.\n\n\n\ntcsh\nLe shell &quot;TC&quot;. Librement disponible et basé sur &quot;csh&quot;.\nIl comporte de nombreuses fonctionnalités supplémentaires pour rendre l&#39;utilisation interactive plus pratique.  \n\nNous l&#39;utilisons comme shell interactif par défaut pour les nouveaux comptes sur tous nos systèmes publics.\nPeu de gens écrivent des scripts dans\nVoir la programmation de Csh considérée comme nuisible par\nTom Christiansen pour une discussion sur les problèmes de programmation des scripts csh.\n\n\n\nksh\n\n\n\nLe &quot;Korn&quot; shell, écrit par David Korn de AT &amp; T Bell Labs (maintenant AT &amp; T Research).\nÉcrit comme une mise à niveau majeure vers &quot;sh&quot; et une compatibilité ascendante avec celui-ci, mais possède de nombreuses commandes internes pour le\nfonctions les plus fréquemment utilisées. Il intègre également de nombreuses fonctionnalités de tcsh qui améliorent\nutilisation interactive (rappel de l&#39;historique de ligne de commande, etc.).  \n\nL’acceptation a été lente, car les versions précédentes étaient grevées de licences AT &amp; T.\nCe shell est maintenant disponible gratuitement sur tous les systèmes, mais n&#39;est parfois pas installé par défaut sur Unix &quot;libre&quot;.\nIl existe deux versions principales. ksh88 était la version intégrée à AT &amp; T SVR4 Unix, et peut encore être installé\npar certains des vendeurs Unix commerciaux. ksh93 a ajouté plus de fonctionnalités, principalement pour la programmation, et une meilleure conformité POSIX.\n\n\nPOSIX 1003.2 Standard Shell.\n\nLes comités de normalisation ont travaillé sur le shell Bourne et ont ajouté de nombreuses fonctionnalités au shell Korn (ksh88).\nC shell pour définir un ensemble standard de fonctionnalités que doivent posséder tous les shells conformes.  \n\nSur la plupart des systèmes, / bin / sh est maintenant un shell compatible POSIX.\nKorn shell et Bash sont compatibles POSIX, mais possèdent de nombreuses fonctionnalités qui vont au-delà de la norme.\nSous Solaris, les commandes POSIX / XPG4 qui diffèrent\nlégèrement dans le comportement des commandes SunOS traditionnelles se trouvent dans / usr / xpg4 / bin\n\n\nfrapper\n\nLa coquille &quot;Bourne again&quot;. Ecrit dans le cadre de l’effort Open Source GNU / Linux et du shell par défaut pour Linux et\nMac OS X. C&#39;est un clone fonctionnel de sh, avec des fonctionnalités supplémentaires pour améliorer l&#39;utilisation interactive,\najouter la conformité POSIX et la compatibilité partielle de ksh.\n\nzsh\n\nUn clone fonctionnel gratuit de sh, avec des éléments de ksh, bash et une conformité POSIX complète, et\nnombreuses nouvelles fonctionnalités d&#39;édition en ligne de commande interactives.\nIl a été installé en tant que shell par défaut sur les anciens systèmes MacOSX.\n\n\n(4)\n\nTous les shells énumérés ci-dessus partagent certaines caractéristiques communes et les différences majeures de syntaxe.\ngénéralement, n&#39;affectent que les scénaristes. Ce n&#39;est pas inhabituel\nutiliser un shell (par exemple, tcsh) pour une utilisation interactive, mais un autre (sh ou ksh)\npour écrire des scripts.\nPrincipales similitudes (et récapitulation de l&#39;utilisation de base de la ligne de commande)\nChacun de ces éléments est traité plus en détail ultérieurement.\n\nAnalyser les lignes par des espaces, rechercher des commandes externes à l&#39;aide de $ PATH.\n\nPeut exécuter un script shell en utilisant shellname scriptfile, ou exécuter un seul\n    commande en utilisant shellname -c &quot;commande&quot;\n\nTransmettez les arguments de ligne de commande développés aux programmes; récupérer le statut de sortie.\n\nPasser des variables d&#39;environnement aux programmes.\n\nDéveloppez les jokers de nom de fichier en utilisant []*?. Chaque coquille a quelques autres\nmétacaractères génériques, mais ceux-ci sont communs à tous les shells.\n\nRedirection I / O standard et tuyauterie avec , &gt;&gt;, |\n\nQuelques fonctions internes (CD)\n\nCommandes d&#39;arrière-plan avec Et\n\nRègles de cotation: les &quot;guillemets&quot; protègent la plupart des choses, mais permettent $ var    interprétation;\nLes &quot;guillemets simples&quot; protègent tous les métacaractères de l&#39;interprétation.\n\nExtension du répertoire personnel à l&#39;aide de ~ utilisateur    (à l&#39;exception de sh)\n\n#    commentaires\n\nSubstitution de commande en utilisant `commande`    (backtics)\n\nDéveloppez les variables en utilisant $ varname    syntaxe\n\nExécution conditionnelle utilisant &amp;&amp;    et ||\n\nSuite de ligne avec &quot;&quot;\n\n\nPrincipales différences\nentre sh (+ dérivés) et csh (+ dérivés).\n\nSyntaxe de toutes les constructions de contrôle de flux et des tests conditionnels.\n\nSyntaxe de manipulation des chaînes dans les scripts\n\nSyntaxe pour la manipulation arithmétique à l&#39;intérieur des scripts\n\nSyntaxe de définition des variables locales (utilisées uniquement dans le script) et des variables d’environnement\npassé aux processus enfants). setenv    contre exportation\n\nSyntaxe de redirection des flux d&#39;E / S autres que stdin / stdout\n\nFichiers de démarrage de connexion (.cshrc    et .s&#39;identifier, contre .profil) et les options par défaut\n\nLecture d’autres scripts shell dans le shell actuel (nom de fichier source, contre . nom de fichier)\n\nTraitement des signaux (interruptions)\n\n\n(5)\n\nIl existe de nombreux autres programmes qui lisent un fichier de commandes et exécutent\nune séquence d&#39;actions. le &quot;#! / chemin / à / programme&quot;    convention\npermet à n&#39;importe lequel d&#39;entre eux d&#39;être utilisé comme langage de script pour créer de nouvelles commandes.\nCertains sont hautement spécialisés, et certains sont beaucoup plus efficaces que leurs équivalents\nscripts shell à certaines tâches. Il n&#39;y a jamais qu&#39;un seul moyen d&#39;effectuer une fonction,\net souvent, le choix dépend de facteurs tels que:\n\nce qui est déjà installé &#8211; beaucoup d&#39;autres langages de script ne sont pas disponibles par défaut\n\nquel code similaire existe déjà\n\nce que vous connaissez et pouvez utiliser de la manière la plus efficace.\nVotre temps est toujours plus coûteux que les cycles informatiques.  \n\n\nCertains des principaux acteurs (tous disponibles gratuitement) dans les langages de script à usage général sont:\n\nawk\n\nUn outil de correspondance de modèle et de manipulation de données (texte et numérique). Prédate perl. Installé sur\ntous les systèmes Unix. Souvent utilisé en combinaison avec des scripts shell.\n\n\nperl\n\nLe langage de script le plus utilisé pour les applications Web CGI et les tâches d&#39;administration système. Perl\nest plus difficile à apprendre et est généralement installé par défaut maintenant.\nIl est plus efficace et dispose d’une énorme bibliothèque de fonctions. Vous pouvez utiliser Perl pour\npresque toutes les tâches de script, mais la syntaxe est très différente de la ligne de commande du shell\n\n\npython\n\nUn langage de script orienté objet. Communément installé par défaut sur les systèmes modernes.\n\n\ntcl/tk\n\nLangage de commande de l&#39;outil. Un autre langage de script à usage général. Le composant &quot;tk&quot; est un\ninterface scriptée vers les composants graphiques X-windows standard, la combinaison est donc souvent utilisée\ncréer des interfaces utilisateur graphiques.\n\nKsh93 peut être étendu en se connectant à des bibliothèques partagées fournissant des commandes internes supplémentaires. Un exemple\nd&#39;une coquille étendue est\ntksh\nqui intègre Tcl / Tk avec ksh et permet la génération de\nscripts utilisant les deux langues. Il peut être utilisé pour le prototypage d&#39;applications d&#39;interface graphique.\n\n\n\n\n(6)\n\nKsh et bash sont les deux super-ensembles de sh. Pour une portabilité maximale, même très ancienne\nordinateurs, vous devriez vous en tenir aux commandes trouvées dans sh. Si possible, fonctionnalités spécifiques à ksh ou bash\nsera noté dans les pages suivantes. En général, les nouveaux obus courent un peu plus vite\net les scripts sont souvent plus lisibles, car la logique peut être exprimée plus proprement au plus récent\nsyntaxe. De nombreuses commandes et tests conditionnels sont maintenant internes.\n\nLa philosophie des outils Unix séparés effectuant chacun un seul\nopération a été suivie de près par les concepteurs de la coque d&#39;origine, de sorte qu&#39;il\navait très peu de commandes internes et\nutilisé des outils externes pour des opérations très triviales\n(comme écho    et [[[[). Ksh et bash en interne\neffectue un grand nombre de manipulations numériques et de chaînes de base et de tests conditionnels. Problèmes occasionnels\nse pose parce que les versions internes de certaines commandes comme écho    ne sont pas entièrement compatibles avec\nl&#39;utilitaire externe ils ont remplacé.\n\nL&#39;action entreprise chaque fois qu&#39;un shell doit exécuter un programme externe consiste à localiser le programme.\n(via $ PATH), fourchette(), qui crée une deuxième copie du shell,\najustez l&#39;entrée / sortie standard pour le\nprogramme externe, et exec (), qui remplace le second shell par le programme externe.\nCe processus est onéreux en termes de calcul (relativement), donc lorsque le script fait quelque chose de trivial\nplusieurs fois dans une boucle, cela fait gagner beaucoup de temps si la fonction est gérée en interne.\n\n\nSi vous suivez des manuels sur la programmation du shell Bourne, tous les conseils doivent être valables\nlequel des coquillages dérivés de Bourne que vous utilisez. Malheureusement, de nombreux fournisseurs ont ajouté des fonctionnalités au fil des ans\net atteindre la portabilité complète peut être un défi. Écrire explicitement pour ksh (ou bash) et insister\nsur ce shell en cours d&#39;installation, peut souvent être plus simple.\n\nLe sh et le ksh homme les pages utilisent le terme commande spéciale    pour les commandes internes &#8211; gérées par le shell\nlui-même.\n(7)\n\nLe script shell le plus élémentaire est une liste de commandes exactement telles qu’elles pourraient être.\ndactylographié de manière interactive, préfacé par le #!    en-tête magique.\nToutes les règles d&#39;analyse, les caractères génériques de nom de fichier, les recherches $ PATH, etc., qui ont été résumés\nci-dessus, appliquer.\nEn outre:\n\n#    en tant que premier caractère non blanc sur une ligne\n\nmarque la ligne en tant que commentaire et le reste de la ligne est complètement ignoré. Utilisation\ncommente librement dans vos scripts, comme dans toutes les autres formes de programmation.\n\n    comme dernier caractère d&#39;une ligne\n\nprovoque la jointure logique de la ligne suivante avant interprétation. Ceci permet\ncommandes très longues à saisir dans le script de manière plus lisible. Tu peux continuer\nla ligne autant de fois que nécessaire.\n\nCeci est en fait juste un cas particulier de     Être à échapperou supprimer\nla signification spéciale de, le caractère suivant.\n\n\n;    comme séparateur entre les mots d&#39;une ligne\n\nest interprété comme une nouvelle ligne. Il vous permet de placer plusieurs commandes sur une seule ligne. Il y a\nquelques occasions où vous doit faire cela, mais souvent il est utilisé pour améliorer la mise en page\ndes commandes composées.\n\n\nExemple: affichage ex1, texte\n\n\n            1: #! / bin / ksh\n            2: # Aux fins d’affichage, certaines parties du script ont \n            3: # été rendu en technicolor glorieux.\n            4: ## Certains commentaires sont en gras pour signaler les sections spéciales\n            5: \n            6: # Les numéros de ligne à gauche ne font pas partie du script.\n            7: # Ils sont simplement ajoutés au HTML pour référence.\n            8: \n            9: # Les commandes intégrées et les mots-clés (par exemple, print) sont en bleu\n        dix: # Les substitutions de commandes sont violettes. Les variables sont noires\n        11: impression &quot;Résumé de l&#39;utilisation du disque pour $ USER sur `rendez-vous amoureux`&quot;\n  12: \n        13: # Tout le reste est rouge - ce qui est principalement externe \n        14: # commandes et les arguments de toutes les commandes.\n        15: impression Ce sont mes fichiers       # commentaire de fin de ligne pour impression\n        16: # Liste les fichiers en colonnes\n        17: ls -C\n  18: # Résumer l&#39;utilisation du disque\n        19: impression\n        20: impression Utilisation de l&#39;espace disque\n  21: du -k \n  22: sortie 0\n\n\nStatut de sortie\nChaque commande (programme) a un valeur ou statut de sortie\nqu&#39;il retourne au programme appelant. Ce\nest séparé de toute sortie générée. Le statut de sortie d&#39;un script shell peut être défini explicitement à l&#39;aide de\nsortie Nou la valeur par défaut de la dernière commande exécutée.\n\nLe statut de sortie est un entier compris entre 0 et 255. Conventionnellement 0 = succès et\ntoute autre valeur indique un problème. Pensez-y comme à un seul moyen pour que tout\ntravailler, mais de nombreuses façons d’échouer. Si la commande s&#39;est terminée par un signal, la valeur est 128 plus\nla valeur du signal.\n\n(8)\n\nLe shell interprète les caractères suivants comme des caractères génériques de nom de fichier, et\ntout mot les contenant est remplacé par une liste triée de tous les fichiers correspondants.\n\nLes caractères génériques peuvent être utilisés dans les parties de répertoire d&#39;un chemin ainsi que dans la partie de nom de fichier.\nSi aucun fichier ne correspond au caractère générique, celui-ci reste inchangé.\nLes caractères génériques ne sont pas des expressions régulières complètes. Sed, grep, awk etc. fonctionnent avec plus de souplesse (et plus\ncomplexes) opérateurs de correspondance de chaînes.\n\n\n*\n\nCorrespond à zéro ou plusieurs caractères.\n\n?\n\nCorrespondre à n&#39;importe quel personnage\n\n[...]\n\nFaites correspondre n&#39;importe quel caractère de l&#39;ensemble entre crochets. Une plage de caractères peut être spécifiée\navec [  -  ]\n\n[!...]\n\nAssociez n&#39;importe quel caractère non inclus dans l&#39;ensemble entre crochets.\n\n\n\n    Une initiale &quot;.&quot; dans un nom de fichier ne correspond pas à un caractère générique, sauf si explicitement\ndonné dans le motif. En ce sens, les noms de fichiers commençant par &quot;.&quot; sont cachés.\nUNE &quot;.&quot; ailleurs dans le nom de fichier n&#39;est pas spécial.\n\nLes opérateurs de modèle peuvent être combinés\n\n\nExemple:chapitre[1-5]. *    pourrait correspondre chapitre1.tex, chapitre4.tex, chapitre5.tex.old.\nCela ne correspond pas chapitre10.tex    ou chapitre 1\n(9)\n\nLes scripts ne sont pas très utiles si toutes les commandes, options et noms de fichiers sont explicitement\ncodé. En utilisant des variables, vous pouvez créer un script générique et l’appliquer à différents\ndes situations. Les noms de variables sont composés de lettres, de chiffres et de traits de soulignement\n ([a-zA-Z0-9_], ne peut pas commencer par un nombre, et sont des cas\nsensible. Plusieurs variables spéciales (toujours des noms en majuscule) sont utilisées par le système &#8211; en les réinitialisant.\npeut provoquer un comportement inattendu. Certaines variables spéciales peuvent être en lecture seule.\nL&#39;utilisation de noms minuscules pour vos propres variables est la plus sûre.\nDéfinition et exportation de variables\n\nsrcfile = dataset1\n\nCrée (si elle n’existait pas) une variable nommée &quot;srcfile&quot; et lui attribue la valeur &quot;dataset1&quot;. Si la\nLa variable existait déjà, elle est écrasée. Les variables sont traitées comme des chaînes de texte, sauf si le contexte\nimplique une interprétation numérique. Vous pouvez faire en sorte qu&#39;une variable soit toujours traitée comme un nombre. Notez ici\ndoit être sans espaces autour du &quot;=&quot;.\n\nensemble\n\nAfficher toutes les variables actuellement définies dans le shell\n\nnon fixé srcfile\n\nSupprimer la variable &quot;srcfile&quot;\n\nsrcfile =\n\nDonnez à la variable une valeur nulle (ce n&#39;est pas la même chose que de la supprimer).\n\nexportation srcfile\n\nAjout de srcfile à la liste des variables qui seront mises à la disposition du programme externe via\nl&#39;environnement. Si vous ne le faites pas, la variable est locale pour cette instance de shell.\n\nexportation\n\nRépertorie toutes les variables en cours d’exportation &#8211; c’est l’environnement qui sera transmis.\naux programmes externes.\n\n\nEn utilisant des variables\n\n$ srcfile\n\nPréfacer le nom de la variable avec $ provoque la valeur de la variable à\nêtre substitué à la place du nom.\n\n$ srcfile\n\nSi la variable n&#39;est pas entourée d&#39;espaces (ou d&#39;autres caractères qui ne peuvent pas être dans un nom),\nle nom doit être entouré d&#39;accolades &quot;&quot;\nafin que le shell sache quels caractères vous voulez faire partie du nom.\n\nExemple:\n\n\n\n\n\nfichier de données = recensement2000\n# Essaie de trouver $ datafile_part1, qui n&#39;existe pas\necho $ datafile_part1.sas\n# C&#39;est ce que nous voulions\necho $ datafile _part1.sas  \n\n\n\nModificateurs conditionnels\nIl existe différentes manières d’utiliser conditionnellement une variable dans une commande.\n\n$ datafile-default\n\nSubstituez la valeur de $ fichier de données, s’il a été défini, sinon utilisez la chaîne &quot;default&quot;. C&#39;est facile\nmoyen de permettre des variables optionnelles, et avoir des valeurs par défaut raisonnables si elles n’ont pas été définies. Si fichier de données    était\nindéfini, il en reste ainsi.\n\n$ datafile = default\n\nSimilaire à ce qui précède, sauf si fichier de données    n&#39;a pas été défini, définissez-le sur la chaîne &quot;default&quot;.\n\n$ datafile + default\n\nSi variable fichier de données    a été défini, utilisez la chaîne &quot;default&quot;, sinon utilisez null. Dans ce cas, le\nvaleur actuelle $ fichier de données    N&#39;est pas utilisé.\n\n$ datafile? &quot;message d&#39;erreur&quot;\n\nSubstituez la valeur de $ fichier de données, s&#39;il a été défini, sinon affichez datafile: message d&#39;erreur.\nCeci est utilisé pour les diagnostics lorsqu&#39;une variable aurait dû être définie et qu&#39;il n&#39;y a pas de valeur par défaut raisonnable à utiliser.\n\nPlacer un colon (:) avant que le caractère opérateur dans ces constructions ait pour effet de compter un\nnul valeur identique à une variable non définie. Les variables peuvent recevoir une valeur nulle en les définissant\nen une chaîne vide, par exemple fichier de données = .\nExemple:\necho $ datafile: -mydata.datÉcho de la valeur de variable fichier de données    s&#39;il a été défini et est non nul, sinon\necho &quot;mydata.dat&quot;.\n\n\n\nPréfixe de commande d&#39;attribution de variable\nIl est possible d’exporter une variable pour la durée d’une seule commande en utilisant le\nsyntaxe:\nvar = valeur commande args\n(dix)\n\nLe système utilise plusieurs variables spéciales. Vous pouvez les utiliser, mais vous ne pourrez peut-être pas\npour les changer.\nLes variables spéciales utilisent des noms en majuscules ou des caractères de ponctuation.\nCertaines variables sont définies par le processus de connexion et héritées par le shell (par exemple, $ USER),\ntandis que d&#39;autres ne sont utilisés que par le shell.  Essayez de courir ensemble    ou env Voici quelques-uns des plus couramment utilisés:\nEnvironnement de connexion\n\n$ USER, $ LOGNAME\n\nPrédéfini sur le nom d&#39;utilisateur actuellement connecté.\n\n$ PATH\n\nLa liste des répertoires qui seront recherchés pour les commandes externes. Vous pouvez changer cela dans un script\npour vous assurer que vous obtenez les programmes que vous avez l&#39;intention, et ne pas obtenir accidentellement d&#39;autres versions qui pourraient avoir été\ninstallée.\n\n$ TERM\n\nLe type de terminal dans lequel la session shell est en cours d&#39;exécution. Habituellement, &quot;xterm&quot; ou &quot;vt100&quot;. Beaucoup de programmes\nVous devez savoir cela pour savoir quelles séquences de caractères spéciaux envoyer pour obtenir des effets spéciaux.\n\n$ PAGER\n\nS&#39;il est défini, il contient le nom du programme que l&#39;utilisateur préfère utiliser pour afficher les fichiers texte. habituellement\nrégler sur &quot;plus&quot; ou &quot;moins&quot; ou quelque chose de similaire. De nombreux programmes devant présenter des informations sur plusieurs pages\nl&#39;utilisateur respectera ce paramètre (par exemple, homme). Ce n&#39;est pas réellement utilisé par le shell lui-même, mais\nLes scripts shell doivent l’honorer s’ils doivent émettre une page vers l’utilisateur.\n\n$ EDITEUR\n\nSi défini, ceci contient le nom du programme que l&#39;utilisateur préfère utiliser pour l&#39;édition de fichier texte. Un programme\nqui doit obliger l’utilisateur à éditer manuellement un fichier peut choisir de démarrer ce programme au lieu de\npar défaut intégré (par exemple &quot;crontab -e&quot;. Ceci détermine également la modification de la ligne de commande par défaut.\ncomportement dans des coquilles interactives.\n\n\nParamètres internes du shell\n\n$ PWD\n\nToujours définir le répertoire de travail actuel (en lecture seule)\n\n$ OLDPWD\n\nLe répertoire précédent (avant le plus récent CD    commander). Cependant, changer de répertoire\ndans un script est souvent dangereux.\n\n$?    (lecture seulement)\n\nDéfinissez le statut de sortie de la dernière commande exécutée afin de pouvoir tester le succès ou l&#39;échec. Chaque commande réinitialise cette\nil faut donc le sauvegarder immédiatement si vous voulez l’utiliser plus tard.\n\n$ -\n\nDéfinissez les options actuellement définies.\n\n$ IFS\n\nSéparateurs de champs internes: ensemble de caractères (normalement des espaces et des tabulations) utilisés pour analyser\nune ligne de commande en arguments séparés. Ceci peut être défini par l&#39;utilisateur à des fins spéciales, mais\nles choses deviennent très déroutantes si rien n&#39;est changé.\n\n\nVariables d&#39;ID de processus\n\n$$    (lecture seulement)\n\nDéfini sur l&#39;ID de processus du shell actuel &#8211; utile pour créer des fichiers temporaires uniques, par exemple. /tmp/$0.$$\n\n$ PPID    (lecture seulement)\n\nDéfini sur l&#39;ID de processus du processus parent de ce shell &#8211; utile pour découvrir comment le script a été appelé.\n\n$!    (lecture seulement)\n\nDéfini sur l&#39;ID de processus de la dernière commande démarrée en arrière-plan &#8211; utile pour vérifier les processus en arrière-plan.\n\n\nksh / bash fonctionnalités supplémentaires\n\n$ SECONDES    (lecture seulement)\n\nNombre entier de secondes depuis le démarrage de ce shell. Peut être utilisé pour les commandes de chronométrage.\n\n$ RANDOM\n\nChaque fois qu&#39;il est valorisé, $ RANDOM    renvoie un entier aléatoire compris entre 0 et 32k.  AU HASARD\npeut être réglé sur &quot;semer&quot; le générateur de nombres aléatoires.\n\n$ LINENO    (lecture seulement)\n\nEvalue toujours le numéro de ligne actuel du script en cours d&#39;exécution &#8211; utile pour le débogage.\n\n\n(11)\n\nPour personnaliser le comportement d&#39;un script au moment de l&#39;exécution,\nvous pouvez lui donner un nombre quelconque d&#39;arguments sur la commande\nligne.\n\nCe sont souvent des noms de fichiers, mais peuvent être interprétés par le script de quelque manière que ce soit. Les options\nsont souvent spécifiés en utilisant la convention &quot;-flag&quot; utilisée par la plupart des programmes Unix, et une commande ksh\ngetopts    est disponible pour aider à les analyser.\n\n        Le shell développe les caractères génériques et rend variable et\nsubstitutions de commandes comme d&#39;habitude, puis analyse les mots obtenus par des espaces (en réalité\nvariable spéciale $ IFS) et place les chaînes de texte résultantes dans\nvariables de position\ncomme suit:\n\n0 $, 1 $, 2 $, ... 9 $\n\nLes 9 premiers arguments sont disponibles directement sous forme de $ 1-9 $. Pour accéder à plus de 9, utilisez\ndécalage, ou $ *, $ @. La variable 0 $    contient le nom du\nscript lui-même.\n\n$ 10, $ 11, ...\n\nLes arguments positionnels supérieurs à 9 sont définis par ksh et bash. N&#39;oubliez pas d&#39;utiliser des accolades pour vous y référer.\n\ndécalage\n\nignore $ 1 et renumérote toutes les autres variables. &quot;décalage N&quot;déplacera N arguments à la fois.\n\n$ #\n\ncontient le nombre d&#39;arguments définis (non compris $ 0).\n\n$ *\n\ncontient tous les arguments dans une seule chaîne, avec un espace les séparant.\n\n$ @\n\nsemblable à $ *, mais s&#39;il est utilisé entre guillemets, il cite efficacement chaque argument et les maintient séparés.\nSi un argument contient des espaces, la distinction est importante.\n\n\npar exemple. si la liste d&#39;arguments est:  a1 a2 &quot;a3 qui contient des espaces&quot; a4alors: $ 1 = a1, $ 2 = a2, $ 3 = a3 qui contient des espaces, $ 4 = a4et: $ * = a1 a2 a3 qui contient des espaces a4et: &quot;$ @&quot; = &quot;a1&quot; &quot;a2&quot; &quot;a3 qui contient des espaces&quot; &quot;a4&quot;\nUtiliser uniquement le formulaire &quot;$ @&quot; préserve les arguments cités. Si les arguments sont passés du script\ndirectement à un autre programme, cela peut faire une grande différence quant à la signification.\n\n\nExemple: affichage ex7, texte\n\n\n\n            1: #! / bin / sh\n            2: #\n            3: # Vérifier la gestion des arguments de position\n            4: écho &quot;Nombre d&#39;arguments: $ #&quot;\n   5: écho &quot;0 $ = 0 $&quot;\n   6: \n            7: écho &quot;Boucle sur $ *&quot;\n   8: pour un dans $ *; faire\n            9:    écho  &quot;$ a &quot;\n  dix: terminé\n        11: \n        12: écho &quot;Boucle sur &quot; $ @ &quot;&quot;\n  13: pour un dans &quot;$ @&quot;; faire\n        14:    écho  &quot;$ a &quot;\n  15: terminé\n\n\nDéfinir de nouveaux arguments de position\nle ensemble    commande, suivie d&#39;un ensemble d&#39;arguments, crée un nouvel ensemble de\narguments de position. Ceci est souvent utilisé, en supposant que les arguments originaux ne sont plus nécessaires, pour analyser\nun ensemble de mots (en utilisant éventuellement des séparateurs de champs différents). Les arguments peuvent être réinitialisés autant de fois que nécessaire.\n\nExemple: affichage ex2, texte\n\n\n\n            1: #! / bin / sh\n            2: # Trouver une entrée dans le fichier de mots de passe\n            3: pwent =`grep &#39;^ root:&#39; / etc / passwd`\n   4: # Turn off globbing - les lignes de mot de passe contiennent souvent &#39;*&#39;\n            5: set -o noglob\n   6: # Le &quot;nom complet&quot; et les autres commentaires sont en\n            7: # champ 5, délimité par deux points. Obtenir ce champ en utilisant le fractionnement des mots de passe\n            8: OIFS =$ IFS; IFS =:; ensemble $ pwent; IFS =$ OIFS\n            9: écho 5 $\n\n\n\nExemple: affichage pickrandom, texteSélectionne un fichier aléatoire dans un répertoire.\nUtilise la fonctionnalité ksh RANDOM.\n\n\n\n            1: #! / bin / ksh\n            2: \n            3: # Sélectionnez une image aléatoire dans la collection de logos en arrière-plan.\n            4: # Ceci pourrait être utilisé pour configurer un économiseur d&#39;écran, par exemple.\n            5: #\n            6: # Cela fonctionne même si les noms de fichiers contiennent des espaces.\n            7: \n            8: # passer au répertoire des logos pour éviter les longs chemins\n            9: logos =/ afs / northstar / commun / usr / lib / X11 / logos / arrière-plans\n  dix: CD logos $\n        11: \n        12: # &#39;*&#39; est un joker de nom de fichier qui correspond à tous les fichiers du répertoire en cours.\n        13: ensemble *\n  14: \n        15: # Utilisez la syntaxe pour les expressions arithmétiques. &quot;%&quot; est l&#39;opérateur modulo\n        16: # Décale les arguments d&#39;un nombre aléatoire entre 0 et le nombre de fichiers\n        17: décalage $ (($ RANDOM % $ #))\n        18: \n        19: # Affiche le premier argument résultant\n        20: écho &quot;logos $/1 $&quot;\n\n\n(12)\n\nOptions de démarrage. ksh -options scriptname \n\n-X\n\necho ligne stderr avant de l&#39;exécuter\n\n-n\n\nlit les commandes et vérifie les erreurs de syntaxe, mais ne les exécute pas.\n\n-une\n\ntoutes les variables sont automatiquement exportées\n\n-F\n\ndésactiver l&#39;expansion des noms de fichiers génériques (globbing)\n\nset -x\n\nDéfinir une option dans un script shell\n\n$ -\n\ncontient les lettres d&#39;option actuellement définies\n\n\nIl y a beaucoup d&#39;autres options, pas souvent nécessaires. Les options en ksh et bash peuvent aussi être\ndéfinir en utilisant des noms longs (par exemple -o noglob    au lieu de -F). De nombreuses options\nsont uniques à ksh ou bash.\n(13)\n\nsyntaxe sh\n\n`commande`\n\nUne commande (plus des arguments optionnels) entourés de backticks est exécutée et la sortie standard\nde cette commande est substitué. Si la commande produit une sortie multiligne, les nouvelles lignes sont conservées.\nSi la chaîne résultante est affichée, sans guillemets, en utilisant écho, les nouvelles lignes et les espaces multiples seront supprimés.\n\n\nsyntaxe ksh / bash\n\n$ (commande)\n\nCette syntaxe est fonctionnellement identique à celle des backticks, mais les commandes peuvent être plus facilement imbriquées.\n\n$ (&lt;fichier)\n\nCeci est équivalent à `cat file`, mais mis en œuvre en interne pour plus d&#39;efficacité.\n\n\n\nExemple: affichage ex3, texte\n\n\n\n            1: #! / bin / ksh\n            2: \n            3: écho Aujourd&#39;hui c&#39;est `rendez-vous amoureux`\n   4: \n            5: fichier =/ etc / hosts\n   6: écho Le fichier fichier $ a $ (wc -l &lt; fichier $) lignes\n   7: \n            8: nom_hôte -s&gt; nom_hôte\n   9: écho Ce système a le nom d’hôte $ (&lt;monhôte)\n\n\n(14)\n\nToute commande simple (ou fonction shell, ou commande composée) peut avoir son entrée et sa sortie\nredirigé à l&#39;aide des opérateurs suivants. Ceci est effectué par le shell avant\nla commande est exécutée.\nRedirection de sortie\n\n&gt; nom de fichier\n\nLa sortie standard (descripteur de fichier 1) est redirigée vers le fichier nommé. Le fichier est écrasé\nà moins que le noclobber    l&#39;option est définie. Le fichier est créé s&#39;il n&#39;existe pas.\n\nLe fichier de périphérique spécial / dev / null    peut être utilisé pour ignorer explicitement les sorties indésirables.\nLa lecture de / dev / null entraîne un statut de fin de fichier.\n\n\n&gt;&gt; nom de fichier\n\nLa sortie standard est ajoutée au fichier nommé. Le fichier est créé s&#39;il n&#39;existe pas.\n\n&gt; | nom de fichier\n\nSortie redirection, et remplacer le noclobber option, si définie.\n\n\nRedirection d&#39;entrée\n\n&lt; nom de fichier\n\nL&#39;entrée standard (descripteur de fichier 0) est redirigée vers le fichier nommé. Le fichier doit déjà\nexister.\n\n\nPipelines de commande\n\ncommande | commander [ | command ...]\n\nPipe plusieurs commandes ensemble. La sortie standard de la première commande devient la norme\nentrée de la deuxième commande. Toutes les commandes sont exécutées simultanément et le transfert de données s&#39;effectue via la mémoire.\ndes tampons. C&#39;est l&#39;une des constructions les plus puissantes d&#39;Unix. Composé les commandes peuvent aussi être\nutilisé avec des tuyaux. Les pipes jouent très bien avec les systèmes multiprocesseurs.\n\nUn seul pipeline dans un pipeline doit être interactif (tentative de lecture depuis\nle terminal). Cette construction est beaucoup plus efficace que l’utilisation de fichiers temporaires, et la plupart des\nLes utilitaires Unix sont conçus pour fonctionner correctement dans les pipelines.\n\nL&#39;état de sortie d&#39;un pipeline est l&#39;état de sortie de la dernière commande. Dans les commandes composées, un pipeline\npeut être utilisé n&#39;importe où une simple commande pourrait être utilisée.\n\n\n\n\n(15)\n\nLes scripts shell peuvent générer directement des sorties ou lire des entrées dans des variables à l&#39;aide des commandes suivantes:\nSortie de script\n\nécho\n\nImprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nUtilisez des guillemets pour préserver l’espacement. Echo comprend également les conventions d’échappement de type C.\n\nAttention ça\nle shell peut traiter les barres obliques inverses avant écho    les voit (peut avoir besoin de doubler la barre oblique inverse).\nInterne dans la plupart des coquilles, mais était à l&#39;origine externe.\n\n\n     b \n        retour arrière \n     c \n        ligne d&#39;impression sans nouvelle ligne (certaines versions)\n\n\n    F \n        formulaire d&#39;alimentation \n n \n        nouvelle ligne \n\n\n     r \n        retour chariot\n     t \n        languette \n\n\n     v \n        onglet vertical \n\\  \n    barre oblique inverse \n\n\n 0n où n est le caractère de 8 bits dont le code ASCII\n      code est le nombre octal à 1, 2 ou 3 chiffres\n      représentant ce personnage.\n\n\n-n \nsupprimer newline\n\n\n\nimpression    (ksh interne)\n\nImprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nPrint observe les mêmes conventions d&#39;échappement que l&#39;écho.\n\n-n\n\nsupprimer newline\n\n-r\n\nmode brut &#8211; ignore les conventions  -escape\n\n-R\n\nmode brut &#8211; ignore les conventions et les options  -escape sauf -n.\n\n\n\n\nEntrée de script\n\nlis var1 var2 reste\n\nlit une ligne de stdin, analyse de $ IFS et place les mots dans les variables nommées.\nTous les mots restants entrent tous dans la dernière variable. Un &#39;&#39; comme dernier caractère d&#39;une ligne\nsupprime l’importance de la nouvelle ligne et l’entrée continue avec la ligne suivante.\n\n-r\n\nmode brut &#8211; ignore les conventions  -escape\n\n\n\n\n\nExemple: affichage ex4a, texte\n\n\n\n            1: #! / bin / sh\n            2: écho &quot;Test de la saisie utilisateur interactive: saisissez quelques touches et appuyez sur la touche Retour&quot;\n   3: lis x plus\n   4: écho &quot;Le premier mot était &quot;$ x &quot;&quot;\n   5: écho &quot;Le reste de la ligne (le cas échéant) était &quot;$ plus &quot;&quot;\n\n\n(16)\n\nLa plupart des opérateurs de contrôle de flux utiles impliquent de faire des tests conditionnels et\nbranchement sur le résultat (vrai / faux). Le test peut être soit le tester\ncommande, ou son alias, [[[[, ou le ksh / bash intégré [[[[[ ... ]]\ncommande, qui a des options légèrement différentes, ou il peut être toute commande qui retourne\nun statut de sortie approprié. Zéro est considéré comme &quot;vrai&quot;, tandis que toute valeur autre que zéro est &quot;faux&quot;.\nNotez que ceci est inversé par rapport à la convention du langage C.\nTests de fichiers\n\n-e fichier\n\nVrai si fichier existe (peut être de tout type).\n\n-F fichier\n\nVrai si fichier existe et est un fichier ordinaire.\n\n-ré fichier\n\nVrai si fichier existe et est un répertoire.\n\n-r fichier\n\nVrai si fichier existe et est lisibleDe même, -w    = accessible en écriture, -X    = exécutable, -L    = est un lien symbolique.\n\n-s fichier\n\nVrai si fichier existe et a une taille supérieure à zéro\n\n-t archiveur de notes\n\nVrai si l&#39;ouvert archiveur de notes est associé à un terminal. Par exemple. c&#39;est\nutilisé pour déterminer si la sortie standard a été redirigée vers un fichier.\n\n\nTests de chaînes de caractères\n\n    -n &quot;chaîne&quot;\n\nvrai si chaîne a une longueur non nulle\n\n    -z &quot;chaîne&quot;\n\nvrai si chaîne a une longueur nulle\n\nAvec [[[[, l&#39;argument doit être cité, car s&#39;il s&#39;agit d&#39;une variable\na une valeur nulle, l&#39;expansion résultante ( [ -z ] ) est une erreur de syntaxe. Un\nles extensions générant &quot;&quot; comptent comme une chaîne nulle.  Pour [[[[    seulement, un cité\nla chaîne seule est équivalente au test -n, par ex. [ « $var » ]. Dans les coquilles plus anciennes pour lesquelles\n[[[[    est un programme externe, le seul moyen de tester une chaîne nulle est:si [ \"X€var\" = \"X\" ]C&#39;est rarement nécessaire maintenant, mais on le trouve encore souvent.\n\n\n$ variable = texte\n\nVrai si $ variable allumettes texte.\n\n$ variable &lt; texte\n\nVrai si $ variable vient avant (lexicalement) texteDe même, &gt;    = vient après\n\n\n(17)\n\nArithmetic tests\n\n$variable -eq  nombre\n\nTrue if $variable, interpreted as a number, is equal to nombre.\n\n$variable -ne  nombre\n\nTrue if $variable, interpreted as a number, is ne pas égal à nombre.De même, -lt    = less than, -le    = less than or equal,\n-gt    = greater than, -ge    = greater than or equal\n\n\nAdditional tests for [[&#8230;]](ksh and bash)\n\n$variable = modèle\n\nTrue if $variable allumettes modèle. Si modèle contains no wildcards,\nthen this is just an exact text match.  The same wildcards as used for filename matching are used.  \n\nle modèle must not be quoted. Puisque [[&#8230;]]is internal to the shell, the pattern in this case is\ntreated differently and not filename-expanded as an external command would require.\n\n\nfile1 -nt file2\n\nTrue if file1 is newer than file2.  De même -ot    = older than\n\nfile1 -ef file2\n\ntrue if file1 is effectively the same as file2, after following\nsymlinks and hard links.\n\n\nNegating and Combining tests\nTests may be negated by prepending the !    operator, and combined with boolean\nET et OU operators using the syntax:\n\nconditionnel -a conditionnel, conditionnel -o conditionnel \n\nET et OU syntax for tester    et [[[[\n\nconditionnel &amp;&amp; conditionnel, conditionnel || conditionnel \n\nET et OU syntax for [[[[[ ... ]]\n\n\nParentheses may be inserted to resolve ambiguities or override the default operator precedence rules.\n\nExemples:\n\n\n\n\n\nsi [[  -x /usr/local/bin/lserve && \n       -w /var/logs/lserve.log ]]; puis\n   /usr/local/bin/lserve &gt;&gt; /var/logs/lserve.log &amp;\nfi\n\npwent=`grep &#39;^richard:&#39; /etc/passwd`\nsi [ -z \"$pwent\" ]; puis\n   echo richard not found\nfi\n\n(18)\n\nUNE liste in these descriptions is a simple command, or a pipeline.\nThe value of the liste is the value of the last simple command run in it. \n\nUNE liste can also be a set of simple commands or\npipelines separated by &quot;;,&amp;,&amp;&amp;,||,|&amp;&quot;.\nFor the compound commands which branch on the success or failure\nde certaines liste,  it is usually [[[[    ou [[[[[[[[, but can be anything.\n\nConditional execution: if/else\n\nliste &amp;&amp; liste\n\nExecute the first liste. If true (success), execute the second one.\n\nliste || liste\n\nExecute the first liste. If false (failure), execute the second one.\n\nExemple:\n\n\n\n\n\nmkdir tempdir &amp;&amp; cp workfile tempdir\n\nsshd || echo &quot;sshd failed to start&quot;\n\n\nYou can use both forms together (with care) &#8211; they are processed left to right, and &amp;&amp; must come first.\nExemple:\n\n\n\n\nmkdir tempdir &amp;&amp; cp workfile tempdir || \n echo &quot;Failed to create tempdir&quot;\n\n\n\nsi liste; puis liste ; elif liste; puis liste; autre liste; fi\n\nExecute the first liste, and if true (success), execute the &quot;then&quot; list, otherwise\nexecute the &quot;else&quot; list.  The &quot;elif&quot;  and &quot;else&quot; lists are optional.\n\nExemple:\n\n\n\n\n\nsi [ -r $myfile ]\npuis\n   cat $myfile\nautre\n   echo $myfile not readable\nfi\n\n\n\nLooping: &#39;while&#39; and &#39;for&#39; loops\n\ntandis que liste; faire liste; terminé\njusqu&#39;à ce que liste; faire liste; terminé\n\n\nExecute the first liste and if true (success), execute the second liste. Repeat as\nlong as the first liste est vrai. le jusqu&#39;à ce que    form just negates the test.\n\nExemple: ex4 display, text\n\n\n\n            1: #!/bin/ksh\n            2: count=0\n   3: max=dix\n   4: tandis que [[[[[[[[$count -lt $max ]]\n   5: faire \n            6:   écho $count\n            7:   count=$((count + 1))\n            8: terminé\n            9: écho &quot;Value of count after loop is: $count&quot;\n\n\n\npour identifiant [in[in[in[inmots ]; do; liste; terminé\n\nEnsemble identifiant in turn to each word in  mots and execute the liste.\nOmitting the &quot;in mots&quot; clause implies using $@, i.e. the identifiant est mis en\nturn to each positional argument.\n\nExemple:\n\n\n\n\n\nfor file in *.dat\nfaire\n    echo Processing $file\nterminé\n\n\n\nAs with most programming languages, there are often several ways to express the same action.\nRunning a command and then explicitly examining $?    can be used instead of some of the above.\n\nCompound commands can be thought of as running in an implicit subshell. Ils\ncan have I/O redirection independant of the rest of the script.  Setting of variables in a real subshell does not\nleave them set in the parent script.  Setting variables in implicit subshells varies in behaviour among shells.\nOlder sh    could not set variables in an implicit subshell and then use them later,\nbut current ksh    can do this (mostly).\n\n\nExemple: ex11 display, textReading a file line by line.  The book by Randal Michael contains 12 example ways to read a file line by line,\nwhich vary tremendously in efficiency.  This example shows the simplest and fastest way.\n\n\n\n            1: #!/bin/sh\n            2: \n            3: # Demonstrate reading a file line-by-line, using I/O\n            4: # redirection in a compound command\n            5: # Also test variable setting inside an implicit subshell.\n            6: # Test this under sh and ksh and compare the output.\n            7: \n            8: line=&quot;TEST&quot;\n   9: save=\n        10: \n        11: si [-z&quot;[-z&quot;[-z\"[-z\"$1&quot; ]; puis\n        12:    écho &quot;Usage: 0 $ filename&quot;\n  13: autre\n        14:    si [-r[-r[-r[-r$1 ]; puis\n        15:       tandis que read line; faire\n        16:          écho &quot;$line&quot;\n  17:          save=$line\n        18:       terminé &lt; $1\n        19:    fi\n        20: fi\n        21: écho &quot;End value of $line est $line&quot;\n  22: écho &quot;End value of $save est $save&quot;\n\n\n(19)\n\nCase statement: pattern matching\n\nCas mot dans modèle) liste;; esac\n\nComparer mot avec chaque modèle) in turn, and executes the first liste\npour lequel le mot allumettes. le les patrons follow the same rules as for filename\nwildcards.\n\n(ksh and bash only)\nA pattern-list is a list of one or more  patterns  separated\nfrom  each  other with a |. Composite patterns can be formed\nwith one or more of the following:\n\n ?(pattern-list)\n\n    Optionally matches any one of the given patterns.\n\n *(pattern-list)\n\n    Matches  zero  or  more  occurrences  of   the   given  patterns.\n\n +(pattern-list)\n\n    Matches one or more occurrences of the given patterns.\n\n @(pattern-list)\n\n    Matches exactly one of the given patterns.\n\n !(pattern-list)\n\n    Matches anything, except one of the given patterns.\n\n\n\n\nExemple:\n\n\n    \n    \n    \n    case $filename in\n    *.dat)\n        echo Processing a .dat file\n        ;;\n    *.sas)\n        echo Processing a .sas file\n        ;;\n    *)\n        # catch anything else that doesn&#39;t match patterns\n        echo &quot;Don&#39;t know how to deal with $filename&quot;\n        ;;\n    esac\n\n\n\nMiscellaneous flow control and subshells\nPause [n]\n\nBreak out of the current (or n&#39;th) enclosing loop.  Control jumps to the next statement\nafter the loop\n\ncontinuer [n];\n\nResume iteration of the current (or n&#39;th) enclosing loop.  Control jumps to the top of the loop,\nwhich generally causes re-evaluation of a tandis que    or processing the next element of a\npour.\n\n. nom de fichier\n\nRead the contents of the named file into the current shell and execute as if in line.  Uses $PATH\nto locate the file, and can be passed positional parameters.  This is often used to read in shell\nfunctions that are common to multiple scripts.  There are security implications if the pathname is not\nfully specified.\n\n( ... )    Command grouping\n\nCommands grouped in &quot;( )&quot; are executed in a subshell, with a separate environment\n(can not affect the variables in the rest of the script).  \n(20)\n\nAs with most aspects of shell scripting, there are usually several possible ways to accomplish\na task.  Certain idioms show up commonly.  These are five ways to examine and branch on the\ninitial character of a string.\n\nUtilisation Cas    with a pattern:\n\ncase $var in/*) echo &quot;starts with /&quot; ;; \nWorks in all shells, and uses no extra processes\n\nUtilisation `cut`:\n\nsi [ \"`echo $var | cut -c1`\" = \"/\" ] ; puis .\nWorks in all shells, but inefficiently uses a pipe and external process for a trivial task.\n\nUse POSIX variable truncation:\n\nsi [ \"$var%$var#?\" = \"/\" ]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Not obvious if you have not seen\nthis one before.  Fails on old Bourne shells.\nDave Taylor in &quot;Wicked Cool Shell Scripts&quot; likes this one.\n\nUse POSIX  pattern match inside of [[&#8230;]]:\n\nsi [[ $var = /* ]]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Note that you must use [[&#8230;]]and no quotes around the pattern.\n\nle [[&#8230;]]syntax is handled internally by the shell and can therefore interpret &quot;wildcard&quot; patterns\ndifferently than an external command.  An unquoted wildcard is interpreted as a pattern to be matched,\nwhile a quoted wildcard is taken literally. le [&#8230;] syntax, even if handled internally, is treated\nas though it were external for backward compatability.  This requires that wildcard patterns be expanded\nto matching filenames.\n\n\nUse ksh (93 and later) and bash variable substrings:\n\nsi [ \"$var:0:1\" = \"/\" ]; puis\nksh93 and later versions, and bash, have a syntax for directly extracting substrings by character\nposition. $varname:start:length\n\n\n\nExemple: ex17 display, text\n(21)\n\nThe shells (ksh in particular) have many more internal commands.  Some are used more in interactive\nshells.  The commands listed here are used in scripts, but don&#39;t conveniently fit elsewhere in the\nclasse.\n\neval args\n\nThe args are read as input to the shell and the resulting command executed.  Allows &quot;double&quot; expansion\nof some constructs.  For example, constructing a variable name out of pieces, and then obtaining the value\nof that variable.  \n\nnetdev=NETDEV_ \nNETDEV_1=hme0         # As part of an initialization step defining multiple devices\n\ndevnum=1              # As part of a loop over those devices\nifname=$netdev€devnum # construct a variable name NETDEV_1\neval device=$$ifname # evaluate it - device is set to hme0\n\n\nexec command args\n\nThe command is executed au lieu de the current shell.  There is no return from an exec.\nI/O redirection may be used.  This is also used to change the I/O for the current shell.\n\n:\n\nThe line is variable-expanded, but otherwise treated as a comment. parfois\nused as a synonym for &quot;true&quot; in a loop.\n\nwhile :; faire\n  # this loop will go forever until broken by \n  # a conditional test inside, or a signal\nterminé\n\n\nunset var ...\n\nRemove the named variables.  This is not the same as setting their values to null.\n\ncomposer [+/- options]    [[[[prénom[=[=[=[=valeur]]...    (ksh only,\nbash uses déclarer    for similar functions)\n\nSet attributes and values for shell variables and functions.  When used inside a function, a local\nvariable is created.  Some of the options are:\n\n-L[n]\n\nLeft justify and remove leading blanks.  The variable always has length n if specified.\n\n-R[n]\n\nRight justify and fill with leading blanks. The variable always has length n if specified.\n\n-l\n\nThe named variable is always treated as an integer.  This makes arithmetic faster.  The reserved word\n entier    is an alias for typeset -i.\n\n\n\n\n-Z[n]\n\nAs for -R, but fill with zeroes if the value is a number\n\n-je\n\nLower-case convert the named variables\n\n-u\n\nUpper-case convert the named variables\n\n-r\n\nMark the variables as readonly\n\n-x\n\nExport the named variables to the enviroment\n\n-ft\n\nThe variables are taken as function names.  Turn on execution tracing.\n\n\n\n\n\n(22)\n\nText variables\nle modèle in the following uses the same wildcards as for filename matching.\n\n$#var\n\nreturns the length of $var in characters\n\n$var%pattern\n\nremoves the shortest suffix of $var patching modèle\n\n$var%%pattern\n\nremoves the longest suffix of $var patching modèle\n\n$var#pattern\n\nremoves the shortest prefix of $var patching modèle\n\n$var##pattern\n\nremoves the longest prefix of $var patching modèle\n\n\nNumeric variables\n\n$((  integer expression  ))\n\nThe $(( &#8230; )) construction interprets the contents as an arithmetic\nexpression (integer only).  Variables are referenced by name without the &quot;$&quot;.  Most of the arithmetic\nsyntax of the &#39;C&#39; language is supported, including bit manipulations\n (*,/,+,-,|,&amp;,&lt;&gt;. Use parentheses for changing precedence).\n\n\nExemples\ndatapath=/data/public/project/trials/set1/datafile.dat\n\nfilename=$datapath##*/\n\nnom de fichier    is set to &quot;datafile.dat&quot; since the longest préfixe\npattern matching &quot;*/&quot; is the\nleading directory path (compare basename)\n\npath=$datapath%/*\n\nchemin    is set to &quot;/data/public/project/trials/set1&quot; since the shortest suffixe\npattern matching &quot;/*&quot; is the\nfilename in the last directory (compare dirname)\n\ni=$((i+1))\n\noften used in tandis que    boucles\n\n\n(23)\n\nAll but the earliest versions of sh    allow you define shell functions, which are visible only\nto the shell script and can be used like any other command.  Shell functions take precedence over\nexternal commands if the same name is used.  Functions execute in the same process as the caller,\nand must be defined before use (appear earlier in the file).  They allow a script to be broken\ninto maintainable chunks, and encourage code reuse between scripts.\nDefining functions\n\nidentifiant()  liste; \n\nPOSIX syntax for shell functions.  Such functions do not restrict scope of variables\nor signal traps.\nThe identifier follows the rules for variable names,\nbut uses a separate namespace.\n\nune fonction identifiant  liste; \n\nKsh and bash optional syntax for defining a function.  These functions may define local\nvariables and local signal\ntraps and so can more easily avoid side effects and be reused by multiple scripts.\n\n\nA function may read or modify any shell variable that exists in the calling script.  Such variables\nsont global.\n\n(ksh and bash only) Functions may also declare local variables in the function using composer    ou\ndéclarer.\nLocal variables are visible to the current function and any functions called by it.\n\n\nrevenir [n], sortie [n]\n\nReturn from a function with the given value, or exit the whole script with the given value.\n\n\nSans un revenir, the function returns when it reaches the end, and the value is the\nexit status of the last command it ran.\n\nExemple:\n\n\n\n\n\ndie()\n\n   # Print an error message and exit with given status\n   # call as: die status &quot;message&quot; [\"message\" ...]\n   exitstat=$1; décalage\n   for i in &quot;$@&quot;; faire\n      print -R &quot;$i&quot;\n   terminé\n   exit $exitstat\n\n\nCalling functions.\nFunctions are called like any other command.  The output may be redirected independantly of the\nscript, and arguments passed to the function.  Shell option flags like -x are unset in a function &#8211; you\nmust explicitly set them in each function to trace the execution.  Shell functions may even be backgrounded\nand run asynchronously, or run as coprocesses (ksh).\n\nExemple:\n\n\n[ -w $filename ]    || \n  die 1 &quot;$file not writeable&quot; &quot;check permissions&quot;\n\n\nExemple: Backgrounded function call. ex12 display, text\n\n\n            1: #!/bin/sh\n            2: \n            3: background()\n   4: \n   5:    sleep 10\n   6:    écho &quot;Background&quot;\n   7:    sleep 10\n   8:    # Function will return here - if backgrounded, the subprocess will exit.\n            9: \n  10: \n        11: écho &quot;ps before background function&quot;\n  12: ps\n  13: background &amp;\n  14: écho &quot;My PID=$$&quot;\n  15: écho &quot;Background function PID=$!&quot;\n  16: écho &quot;ps after background function&quot;\n  17: ps\n  18: sortie 0\n\n\n\nExemple:\n\n\n\n\n\nvprint()\n\n   # Print or not depending on global &quot;$verbosity&quot;\n   # Change the verbosity with a single variable.\n   # Arg. 1 is the level for this message.\n   level=$1; décalage\n   si [[ $level -le $verbosity ]]; puis\n      print -R $*\n   fi\n\n\nverbosity=2\nvprint 1 This message will appear\nvprint 3 This only appears if verbosity is 3 or higher\n\nReuseable functions\nBy using only command line arguments, not global variables, and taking care to minimise the side\neffects of functions, they can be made reusable by multiple scripts.  Typically they would be\nplaced in a separate file and read with the &quot;.&quot; operator.\n\nFunctions may generate output to stdout, stderr, or any other file or filehandle.  Messages to stdout\nmay be captured by command substitution (`myfunction`, which provides another way for a function to\nreturn information to the calling script.  Beware of side-effects (and reducing reusability)\nin functions which perform I/O.\n(24)\n\nUnix I/O is performed by assigning file descriptors to files or devices, and then\nusing those descriptors for reading and writing.  Descriptors 0, 1, and 2 are always\nused for stdin, stdout and stderr respectively.  Stdin defaults to the keyboard,\nwhile stdout and stderr both default to the current terminal window.\nRedirecting for the whole script\nRedirecting stdout, stderr and other file descriptors for the whole script\ncan be done with the exec    commander.\n\nexec     &gt; outfile &lt; infile \n \nwith no command, the exec    just reassigns the I/O of the current shell.\n \nexec n&gt;outfile\n \nThe form n opens file descriptor n instead of the default stdin/stdout.\nThis can then be used with read -u    ou print -u.\n\n\nExplicitly opening or duplicating file descriptors\nOne reason to do this is to save the current\nstate of stdin/stdout, temporarily reassign them, then restore them.\n\n&gt;&amp;n\n \nstandard output is moved to whatever file descriptor n is currently pointing to\n \n&lt;&amp;n\n \nstandard input is moved to whatever file descriptor n is currently pointing to\n \nn&gt;fichier\n \nfile descriptor n is opened for writing on the named fichier.\n \nn&gt;&amp;1\n \nfile descriptor n is set to whatever file descriptor 1 is currently pointing to.\n\n\nExemple Sending messages to stderr (2) instead of stdout (1)\n\necho &quot;Error: program failed&quot; &gt;&amp;2 \n\nEcho always writes to stdout, but stdout can be temporarily reassigned to duplicate stderr (or other file\ndescriptors).\nConventionally Unix programs send error messages to stderr to keep them separated from stdout.\nInput and output to open file descriptors (ksh)\nPrinting to file descriptors (usually more efficient than open/append/close):\n\nimpression     -u n args\n \nprint to file descriptor n.\n \n-p\n \nwrite to the pipe to a coprocess (opened by |&amp;)\n\n\nReading from file descriptors other than stdin:\n\n\nlis     -u n var1 var2 rest\n \nread a line from file descriptor n, parsing by $IFS, and placing the words into\nthe named variables.  Any left over words all go into the last variable.\n \n-p\n \nread from the pipe to a coprocess (opened by |&amp;)\n\n\nClosing file handles\n\n&lt;&amp;-\n \nstandard input is explicitly closed\n \n&gt;&amp;-\n \nstandard output is explicitly closed\n\n\nFor example, to indicate to another program downstream in a pipeline that no more\ndata will be coming.  All file descriptors are closed when a script exits.\n\nI/O redirection operators are evaluated left-to-right.  This makes a difference in a\nstatement like:\n&quot;&gt;filename 2&gt;&amp;1&quot;.  (Many books with example scripts get this wrong)\n&quot;Here&quot; documents\n\n&lt;&amp;lt [-]chaîne\n\nredirect input to the temporary file formed by everything up the matching chaîne\nat the start of a line.  Allows for placing file content inline in a script.\n\n\nExemple: ex5 display, text\n\n\n            1: #!/bin/sh\n            2: écho &quot;Example of unquoted here document, with variable and command substitution&quot;\n   3: \n            4: cat &lt;&lt;EOF\n   5:  This text will be fed to the &quot;cat&quot; program as \n   6:  standard input.  It will also have variable\n   7:  and command substitutions performed.\n   8:  I am logged in as $USER and today is `rendez-vous amoureux`\n   9: EOF\n  10: écho\n        11: écho &quot;Example of quoted here document, with no variable or command substitution&quot;\n  12: # The terminating string must be at the start of a line.\n        13: cat &lt;&lt;&quot;EndOfInput&quot;\n  14:  This text will be fed to the &quot;cat&quot; program as standard\n  15:  input.  Since the text string marking the end was quoted, it does not get \n  16:  variable and command subsitutions.\n  17:  I am logged in as $USER and today is `rendez-vous amoureux`\n  18: EndOfInput\n\n\n\nExemple: duplex display, text\n\n\n\n            1: #!/bin/sh\n            2: # Add in the magic postscript preface to perform\n            3: # duplex printer control for Xerox docuprint.\n            4: \n            5: # To have this script send the files directly to the printer, use \n            6: # a subshell to collect the output of the two &#39;cat&#39; commands.\n            7: \n            8: ## (\n            9: cat &lt;&lt; EOP\n  10: %!PS\n  11: %%BeginFeature: *Duplex DuplexTumble\n  12: &lt;&gt; setpagedevice\n  13: %%EndFeature\n  14: EOP\n  15: cat &quot;$@&quot;\n  16: ## ) | lpr\n\n\n(25)\n\nMore complicated manipulations of file descriptors can be arranged.\nTwo such examples are shown here:\n\nThis short test script can be used to generate suitable output.ex13: display, text\n\n\n\n\n\n\necho &quot;This goes to stdout&quot;\necho &quot;This goes to stdout and has foo in the line&quot;\necho &quot;This goes to stderr&quot; &gt;&amp;2\nexit 99\n\n\nPass stderr of a command into a pipeline for further processing\nExemple: ex14 display, text\n\nexec 3&gt;&amp;1 ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#39;s/stderr/STDERR/&#39; 1&gt;&amp;2\n\nWe duplicate stdout to another file descriptor (3), then run the first command with stderr redirected\nto stdout and stdout redirected to the saved descriptor (3). The result is piped into other commands\ncomme requis. The output of the pipeline is redirected back to stderr, so that stdout and stderr of the script\nas a whole are what we expect.\n\n\n\n            1: #!/bin/sh\n            2: # Example 14\n            3: # Take stderr from a command and pass it into a pipe\n            4: # for further processing.\n            5: \n            6: # Uses ex13.sh to generate some output to stderr\n            7: # stdout of ex13 is processed normally\n            8: \n            9: # Save a copy of original stdout\n        10: exec 3&gt;&amp;1\n  11: \n        12: # stdout from ex13.sh is directed to the original stdout (3)\n        13: # stderr is passed into the pipe for further processing.\n        14: # stdout from the pipe is redirected back to stderr\n        15: ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#39;s/stderr/STDERR/&#39; 1&gt;&amp;2\n  16: \n        17: # 3 is closed before running the command, just in case it cares\n        18: # about inheriting open file descriptors.\n\n\nCapture the exit status of a command in the middle of a pipeline\nExemple: ex15 display, text\n\n    exec 3&gt;&amp;1     ex13stat=`((./ex13.sh; echo $? &gt;&amp;4) | grep &#39;foo&#39; 1&gt;&amp;3) 4&gt;&amp;1` \nThis script uses nested subshells captured in backtics.\nAgain we first duplicate stdout to another file descriptor (3).\nThe inner subshell runs the first command, then writes the exit status\nto fd 4.  The outer subshell redirects 4 to stdout so that it is\ncaptured by the backtics.  Standard output from the first command\n(inner subshell) is passed into the pipeline as normal, but the final output\nof the pipeline is redirected to 3 so that it appears on the original stdout\nand is not captured by the backtics.\n\nIf any of the commands really care about inheriting open file\ndescriptors that they don&#39;t need then a more correct command line\ncloses the descriptors before running the commands.\n\n\n            1: #!/bin/sh\n            2: # Example 15\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into $ex13stat.  \n            8: # stdout of ex13 is processed normally\n            9: \n        10: # Save a copy of stdout\n        11: exec 3&gt;&amp;1\n  12: # Run a subshell, with 4 duplicated to 1 so we get it in stdout.  \n        13: # Capture the output in ``\n        14: # ex13stat=`( ...  ) 4&gt;&amp;1`\n        15: # Inside the subshell, run another subshell to execute ex13, \n        16: # and echo the status code to 4\n        17: # (./ex13.sh; écho $? &gt;&amp;4)\n        18: # stdout from the inner subshell is processed normally, but the \n        19: # subsequent output must be directed to 3 so it goes to the \n        20: # original stdout and not be captured by the ``\n        21: ex13stat=`((./ex13.sh; écho $? &gt;&amp;4) | grep &#39;foo&#39; 1&gt;&amp;3) 4&gt;&amp;1`\n  22: \n        23: écho Last command status=$?\n  24: écho ex13stat=$ex13stat\n        25: \n        26: # If any of the commands really care about inheriting open file \n        27: # descriptors that they don&#39;t need then a more correct command line \n        28: # closes the descriptors before running the commands\n        29: exec 3&gt;&amp;1\n  30: ex13stat=`((./ex13.sh 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  31:    grep &#39;foo&#39;  1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  32: écho Last command status=$?\n  33: écho ex13stat=$ex13stat\n\n\nCombine the above two techniques:\n\n\nExemple: ex16 display, text\n\n\nexec 3&gt;&amp;1 ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; echo $? &gt;&amp;4) |          sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1` \n\n\n            1: #!/bin/sh\n            2: # Example 16\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into ex13stat. \n            8: # stderr of ex13 is processed by the pipe, stdout\n            9: # is left alone.\n        10: \n        11: # Save a copy of stdout\n        12: exec 3&gt;&amp;1\n  13: \n        14: # Run a subshell, with 4 copied to 1 so we get it in stdout.  \n        15: # Capture the output in backtics`\n        16: # ex13stat=`(    ) 4&gt;&amp;1`\n        17: \n        18: # In the subshell, run another subshell to execute ex13, and \n        19: # echo the status code to 4\n        20: # (./ex13.sh; écho $? &gt;&amp;4)\n        21: \n        22: # stdout from the inner subshell is directed to the original stdout (3)\n        23: # stderr is passed into the pipe for further processing.\n        24: # stdout from the pipe is redirected back to stderr\n        25: \n        26: # Close the extra descriptors before running the commands\n        27: exec 3&gt;&amp;1\n  28: ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  29:   sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  30: \n        31: écho Last command status=$?\n  32: écho ex13stat=$ex13stat\n        33: \n\n\nA practical application of this would be running a utility such as dd\nwhere the exit status is important to capture, but the error output is overly chatty and\nmay need to be filtered before delivering to other parts of a script.\n(26)\n\nScripts can start any number of background jobs (any external command),\nwhich run in parallel with the\nparent script, and asynchronously.  Processes which require no further interaction\nor synchronization (fire and forget) are easy.\nInteraction with background jobs is tricky. Vous pouvez\nuse signals, pipes, named pipes, or disk files for communication.\n\ncommander Et\n\nDébut commander as a background process.  Control returns immediately to the shell.\n\nbgpid=$!\n\nThe special variable $!    contains the process ID of the last background job\nthat was started.  You can save that and examine the process later\n(ps -p $bgpid) or send it a signal (kill -HUP $bgpid).\n\n\nksh coprocesses\nCoprocesses are a way of starting a separate process which\nruns asychronously, but has stdin/stdout connected to the parent script via pipes.\n\ncommander |&amp; \n\nStart a coprocess with a 2-way pipe to it\n\nlis -p var\n\nRead from the pipe to the coprocess, instead of standard input\n\nimpression -p args\n\nWrite to the pipe connected to the coprocess, instead of standard output\n\n\nMultiple coprocesses can be handled by moving the special file descriptors connected\nto the pipes onto standard input and output, and or to explicitly specified file descriptors.\n\nexec &lt;&amp;p\n\nThe input from the coprocess is moved to standard input\n\nexec &gt;&amp;p\n\nThe output from the coprocess is moved to standard output\n\n\n\nExemple: ex9 display, textA script wants to save a copy of all output in a file, but also wants a copy\nà l&#39;écran. This is equivalent to always running the script asscénario | tee outfile\n\n\n            1: #!/bin/ksh\n            2: \n            3: # If we have not redirected standard output, save a copy of\n            4: # the output of this script into a file, but still send a\n            5: # copy to the screen.\n            6: \n            7: si [[ -t 1 ]]; puis\n            8:   # Only do this if fd 1 (stdout) is still connected\n            9:   # to a terminal\n        10: \n        11:   # We want the standard output of the &quot;tee&quot; process\n        12:   # to go explicitly to the screen (/dev/tty)\n        13:   # and the second copy goes into a logfile named $0.out\n        14: \n        15:   tee 0 $.out &gt;/dev/tty |&amp;\n  16: \n        17:   # Our stdout all goes into this coprocess\n        18:   exec 1&gt;&amp;p\n  19: fi\n        20: \n        21: # Now generate some output\n        22: impression &quot;User activity snapshot on $(hostname) at $(date)&quot;\n  23: impression\n        24: qui\n\n\n\nExemple: ex10 display, textStart a coprocess to look up usernames in some database.\nIt is faster to run a single process than to run a separate\nlookup for each user.\n\n\n            1: #!/bin/ksh\n            2: # This example uses a locally written tool for Dartmouth Name Directory lookups\n            3: \n            4: # Start the dndlookup program as a coprocess\n            5: # Tell it to output only the canonical full name, and to not print multiple matches\n            6: dndlookup -fname -u |&amp;\n   7: \n            8: # move the input/output streams so we \n            9: # can use other coprocesses too\n        10: exec 4&gt;&amp;p\n  11: exec 5&lt;&amp;p\n  12: \n        13: écho &quot;Name file contents:&quot;\n  14: cat namefile\n  15: écho\n        16: \n        17: # read the names from a file &quot;namefile&quot;\n        18: tandis que read uname; faire\n        19:   impression -u4 $uname\n        20:   lis  -u5 dndname\n  21:   Cas $dndname dans\n  22:   *many matches*)\n  23:     # handle case where the name wasn&#39;t unique\n        24:     impression &quot;Multiple matches to &quot;$uname&quot; in DND&quot;\n  25:     ;;\n  26:   *no match*)\n  27:     # handle case where the name wasn&#39;t found\n        28:     impression &quot;No matches to &quot;$uname&quot; in DND&quot;\n  29:     ;;\n  30:   *)\n  31:     # we seem to have a hit - process the\n        32:     # canonical named retrieved from dndlookup\n        33:     impression &quot;Unique DND match: full name for &quot;$uname&quot; is &quot;$dndname&quot;&quot;\n  34:     ;; \n  35:   esac\n        36:   sleep 2\n  37: terminé &lt; namefile\n  38: \n        39: # We&#39;ve read all the names, but the coprocess\n        40: # is still running.  Close the pipe to tell it\n        41: # we have finished.\n        42: exec 4&gt;&amp;-\n\n\n(27)\n\nBoth ksh and bash implement arrays of variables, but in somewhat different ways.\n\nksh distinguishes between numerically indexed (small) arrays, and string indexed (associative) arrays.\nbash uses integers for all array indexing, but the integers need not be consecutive and unassigned array elements\ndo not exist.  Arrays must be declared before use, e,g. typeset -A myarray    (ksh associative array), or\ntypeset -a myarray    (bash).\n\nArray elements are set with the syntax:\nmyarray[index]=value\nand referenced with the syntax $myarray[index]\n\nThis example shows use of an array indexed by IP addresses, as strings in ksh or as non-consecutive numbers in bash.\nIt also demonstrates use of getopt for options processing\n\nExemple: getauthlogs display, text\n\n\n            1: #! / bin / bash\n            2: # $Header: $\n            3: # First attempt at a consolidated auth log collection from kaserver\n            4: # Timestamps in the raw files are NOT designed for easy sorting.\n            5: #\n            6: # Options:\n            7: #  -i  -- translate hex IP addresses to dotted-decimal (relatively quick)\n            8: #  -h  -- translate hex IP addresses to DNS names (somewhat slower - DNS lookups)\n            9: #  -u user -- filter for the named user before translating addresses\n        10: \n        11: hextodec()\n  12: \n  13:    # convert the IP address in reverse-hex to dotted-decimal\n        14:    écho $((0x$1:6:2)).$((0x$1:4:2)).$((0x$1:2:2)).$((0x$1:0:2))\n        15: \n  16: \n        17: hostlookup()\n  18:  tr &#39;A-Z&#39; &#39;a-z&#39;\n  30:       ;;\n  31:    esac\n        32: \n  33: \n        34: # Options\n        35: iptranslate=0\n  36: gethostnames=0\n  37: filter=chat\n  38: tandis que getopts ihu: o ; faire\n        39:    Cas $o dans\n  40:    i) iptranslate=1 ;;\n  41:    h) gethostnames=1; iptranslate=1 ;;\n  42:    u) filter=&quot;grep $OPTARG&quot; ;;\n  43:    esac\n        44: terminé\n        45: décalage $(($OPTIND-1))\n        46: \n        47: # We could get the DB server names from &#39;fs checkservers&#39;, but it isn&#39;t obvious what is from our cell. nous\n        48: # could also grep CellServDB.  I cop out and hard code one known DB server and get the others from it.\n        49: masterserver=halley.dartmouth.edu\n  50: serverlist=$(bos listhosts -server $masterserver| grep &#39;Host .* is &#39; | awk &#39;print 4 $&#39;)\n  51: \n        52: # If we want to filter usernames, it is more efficient to do it inline, before sorting, translation and hostname lookups\n        53: \n        54: # Array to hold IP address/name conversions (associative array, ksh only)\n        55: # ksh - use -A for associative array.  bash - use -a and numeric array\n        56: composer -a hostnames\n  57: \n        58: (\n  59: pour dbserver in $serverlist; faire\n        60:    bos getlog -server $dbserver -file /usr/afs/logs/AuthLog\n  61: terminé\n        62: ) | grep -v &#39;Fetching log file&#39; | $filter | sed -e &#39;s/^... //&#39; -e &#39;s/  ([1-9]) / 01 /&#39; | sort --month-sort | \n  63:     sed &#39;-e s/ ([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])$/ 01/&#39; |\n  64:     tandis que read line; faire\n        65:    si [[[[[[[[$iptranslate == 1 ]]; puis\n        66:       # Ugly!\n        67:       # Sometimes we get a 7-digit hex code in the log - the kaserver apparently drops leading zeros.\n        68:       # The second &#39;sed&#39; in the pipe catches these are fixes them.\n        69:       Cas $line dans\n  70:       * from [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])\n  71:          # translate the reverse-hex address\n        72:          iphex=$line##* from \n        73:          # bash version - index by numeric value only, but can be sparse array -- use the raw IP \n        74:          ipdec=$((0x$iphex))\n        75:          frontpart=$line% from *\n        76:          si [[[[[[[[$gethostnames == 1 ]]; puis\n        77:             # ksh - index on hex value as a string (iphex)\n        78:             # bash - index on numeric value (ipdec)\n        79:             index=$ipdec\n        80:             si [[-z&quot;[[-z&quot;[[-z\"[[-z\"$hostnames[[[[$index]&quot; ]]; puis\n        81:                hostnames[[[[$index]=&quot;$(hostlookup $(hextodec $iphex))&quot; \n  82:             fi\n        83:             écho &quot;$frontpart de $hostnames[[[[$index]&quot;\n  84:          autre\n        85:             écho &quot;$frontpart from $(hextodec $iphex)&quot;\n  86:          fi\n        87:          ;;\n  88:       *)\n  89:          écho &quot;$line&quot;\n  90:          ;;\n  91:       esac\n        92:    autre\n        93:       # No ip translation, just echo the whole line\n        94:       écho &quot;$line&quot;\n  95:    fi   \n        96: terminé\n        97: \n\n\n(28)\n\nUnix signals (software interrupts) can be sent as asynchronous events to shell scripts, just\nas they can to any other program.  The default behaviour is to ignore some signals and immediately\nexit on others.  Scripts may detect signals and divert control to a handler function or external\nprogramme. This is often used to perform clean-up actions before exiting, or restart certain\nprocedures.  Execution resumes where it left off, if the signal handler returns.  Signal traps\nmust be set separately inside of shell functions.  Signals can be sent to a process with\ntuer.\n\npiège gestionnaire sig ...\n\ngestionnaire is a command to be read (evaluated first) and executed on receipt of\nle spécifié sigs. Signals can be specified by name or number (see kill(1))\npar exemple. HUP, INT, QUIT, TERM. A Ctrl-C at the terminal generates a INT.\n\n\n\nA handler of -    resets the signals to their default values\n\nA handler of &#39;&#39;    (null) ignores the signals\n\nSpecial signal values are as follows:\n\nEXIT\n\nthe handler is called when the function exits, or when the whole script exits. le\nexit signal has value 0.\n\nERR    (ksh)\n\nthe handler is called when any command has a non-zero exit status\n\nDEBUG    (ksh)\n\nthe handler is called after chaque commander.\n\n\n\n\n\nExemple: ex8 display, text\n\n\n\n            1: #! / bin / bash\n            2: # Try this under bash, ksh and sh\n            3: \n            4: piège huphandler  HUP\n   5: piège &#39;&#39;          QUIT\n   6: piège exithandler TERM INT\n   7: \n            8: huphandler()\n   9: \n  10:    écho &#39;Received SIGHUP&#39;\n  11:    écho &quot;continuing&quot;\n  12: \n  13: \n        14: exithandler()\n  15: \n  16:    écho &#39;Received SIGTERM or SIGINT&#39;\n  17:    sortie 1\n  18: \n  19: ## Execution starts here - infinite loop until interrupted\n        20: # Use &quot;:&quot; or &quot;true&quot; for infinite loop\n        21: # SECONDS is built-in to bash and ksh.  It is number of seconds since script started\n        22: : is like a comment, but it is evaluated for side effects and evaluates to true\n  23: seconds=0\n  24: tandis que : ; faire\n        25: # while true; faire\n        26:    sleep 5\n  27:    seconds=$((seconds + 5))\n        28:    écho -n &quot;$SECONDS $seconds - &quot;\n  29: terminé\n\n\nExit handlers can be defined to clean up temporary files or reset the state of devices. Ce\ncan be useful if the script has multiple possible exit points.\n(29)\n\nShell scripts are often used by system administrators and are run as a priviledged user.\n\nDon&#39;t use set-UID scripts.\n\nMost systems don&#39;t even allow a script to be made set-UID.  It is\nimpossible (due to inherent race conditions) to ensure that a set-uid script cannot be compromised.\nUse wrapper programs like sudo    instead.\n\n\nAlways explicitly set $PATH    at the start of a script, so that you know exactly\nwhich external programs will be used.\n\nIf possible, don&#39;t use temporary files.  If they cannot be avoided, use $TMPDIR,\nand create files safely (e.g. mktemp).\n\nOften scripts will write to a fixed, or trivially generated temporary filename in /tmp.  If the\nfile already exists and you don&#39;t have permission to overwrite it, the script will fail. Si vous\ndo have permission to overwrite it, you will delete the previous contents.  Since /tmp is public write,\nanother user may create files in it, or possibly fill it completely.\nExemple:\n\nA link is created by an unprivileged user in /tmp:     /tmp/scratch  -&gt; /vmunix\n\nA root user runs a script that blindly writes a scratch file to /tmp/scratch, and overwrites the\noperating system.\n\n\nEnvironment variable $TMPDIR    is often used to indicate a preferred location for\ntemporary files (e.g., a per-user directory).  Some systems may use $TMP    ou $TEMP.\nSafe scratch files can be made by creating a new directory, owned\nand writeable only by you, then creating files in there.\nExemple:\n\n\n\n\n(umask 077 &amp;&amp; mkdir /tmp/tempdir.$$) || exit 1\n\nor (deluxe version)\n\ntmp=$TMPDIR:-/tmp\ntmp=$tmp/tempdir.$RANDOM.$RANDOM.$RANDOM.$$\n(umask 077 &amp;&amp; mkdir $tmp) || \n    echo &quot;Could not create temporary directory&quot; 1&gt;&amp;2\n    exit 1\n\n\nAlternatively, many systems have mktemp    to safely create a temporary file and return\nthe filename, which can be used by the script and then deleted.\n\n\nCheck exit status of everything you do.\n\nDon&#39;t trust user input\n\ncontents of files\n  \ndata piped from other programs\n  \nfichier des noms. Output of filename generation with wildcards, or directly from\n     ls    ou trouver\n\n\n\n\n\nExemple:\nConsider the effects of a file named &quot;myfile;cd /;rm *&quot; if processed,\nunquoted, by your script.\n\n\nOne possible way to protect against weirdo characters in file names:\n\n# A function to massage a list of filenames \n# to protect weirdo characters\n# e.g. find ... | protect_filenames | xargs command\n#\n# We are backslash-protecting the characters &#39;&quot; ?*;\nprotect_filenames()\n\n   sed -es/\\\\/\\\\\\\\/g \n       -es/\\&#39;/\\\\&#39;/g   \n       -es/\\&quot;/\\\\&quot;/g   \n       -es/\\;/\\\\;/g   \n       -es/\\?/\\\\?/g   \n       -es/\\*/\\\\*/g   \n       -es/\\ /\\\\ /g\n\n\nIf using GNU trouver    et xargs, there is a much cleaner option\nto null-terminate generated pathnames.\n\n(30)\n\nShell scripts are very frequently written quickly for a single purpose, used once and discarded.\nThey are also as frequently kept and used many times, and migrate into other uses, but often\ndo not receive the same level of testing and debugging that other software would be given\nin the same situation. Il est possible to apply general principles of good software\nengineering to shell scripts.\n\nPreface scripts with a statement of purpose, author, date and revision notes\n\nUse a revision control system for complex scripts with a long lifetime\n\nAssume your script volonté have a long lifetime unless you are certain it won&#39;t\n\nDocument any non-standard external utilities which your script needs\n\nDocument your scripts with inline comments &#8211; you&#39;ll need them in a few months when you edit it.\n\nTreat standard input and output in the normal way, so that your script can be used\nin combination with other programs (the Unix toolkit philosophy)\n\nBe consistent in the format of your output, so that other programs can rely on it\n\nUse options to control behaviour such as verbosity of output.  Overly chatty programs are\nvery hard to combine with other utilities\n\nUse interactive features (prompting the user for information) très parcimonieusement.\nDoing so renders the script unuseable in pipeline combinations with other programs, or in unattended\noperations.\n\nTest (a lot)\n\n\nWhen not to use shell scripts\n\nIf an existing tool already does what you need &#8211; use it.\n\nIf the script is more than a few hundred lines, you are probably using the wrong tool.\n\nIf performance is horrible, and the script is used a lot, you might want to consider another language.\n\n\n(31)\n\nThe class accounts have directories with all of the examples from the books by Blinn,\nMichael, Rosenblatt, and Taylor.  These can also be downloaded (see the References page).\nSome of these are linked below (but not included in the printed notes), with additional comments.\n\nDownload a compressed tar file of all example scripts used in these notes.\n\n\npostprint display, textA wrapper script for printing a mix of text and postscript files\n\ncheckpath display,\ntexteCheck all the directories in the $PATH    for possibly conflicting programs.\n\nrun-with-timeout display,\ntexteRun a command with a timeout.  Kill the command if it hasn&#39;t finished when the timeout expires.\n\nMailPkg display, textTar, compress, split and uuendcode a set of files for mailing. (Blinn)\n\nPtree (original) display, text\nPtree (ksh version) display, textRuns &quot;ps&quot; to get a process listing and then\nreformats to show the process family hierarchies.  The original example is pure Bourne shell\nand inefficient.  The ksh version is a fairly simple translation to use ksh internal commands\nwhere possible, and avoid writing scratch files,  and runs very much faster.  (Blinn).\n\n\nThis entire tutorial was created from individual HTML pages using a content management system written\nas ksh scripts (heavily using sed to edit the pages), coordinated by faire.\n&lt;! &#8211;\n\n\nbuildhtml afficher, texte\nTurns a stand-alone HTML file into a component of the tutorial, with navigation links and frames.\nbuildslidelist afficher, texte\nCreates the slide list which appears as the left frame of the tutorial.\nbuildframeset afficher, texte\nCreates a top level frameset to call the slide list and content pages.\nksh2html afficher, texte\nCreates the colourized HTML page of a shell script.\nMakefile texte\nMakefile used to build the site using the above tools\n\n-&gt;\n\nYou can even write an entire web server as a shell script.  This one is part of the\nLEAF\n(Linux Embedded Appliance Firewall) project.  This wouldn&#39;t be suitable for much load, but handles occasional queries on\nstatic HTML and CGI scripts.\n(www.nisi.ab.ca/lrp/Packages/weblet.htm)\n\n(32)\n\nThe following commands are very frequently used in shell scripts.  Many of them are used\nin the examples in these notes.  This is just a brief recap &#8212; see the man pages for details on usage.\nThe most useful are flagged with *.\n\nMost of these commands will operate on a one or more named files, or will operate on a stream of\ndata from standard input if no files are named.\nListing, copying and moving files and directories\n\nls *\n\nlist contents of a directory, or list details of files and directories.\n\n mkdir; rmdir *\n\nMake and Remove directories.\n\n rm; cp; mv *\n\nRemove (delete), Copy and Move (rename) files and directories\n\ntoucher *\n\nUpdate the last modifed timestamp on a file, to make it appear to have just been written.\n\nIf the file does not exist, a new zero-byte file is created, which is often useful to signify that\nan event has occurred.\n\n\ntee\n\nMake a duplicate copy of a data stream &#8211; used in pipelines to send one copy to a log file\nand a second copy on to another program.  (Think plumbing).\n\n\nDisplaying text, files or parts of files\n\nécho *\n\nEcho the arguments to standard output &#8212; used for messages from scripts.\nSome versions of &quot;sh&quot;, and all csh/ksh/bash shells internalized &quot;echo&quot;.\n\nConflicts\nsometimes arise over the syntax for echoing a line with no trailing CR/LF.\nSome use &quot;c&quot; and some use option &quot;-n&quot;.  To avoid these problems, ksh also provides the &quot;print&quot;\ncommand for output.\n\n\nchat *\n\nCopy and concatenate files; display contents of a file\n\ntête, queue *\n\nDisplay the beginning of a file, or the end of it.\n\nCouper\n\nExtract selected fields from each line of a file.  Often awk is easier to use, even though it is\na more complex program.\n\ntoilettes\n\nCount lines, words and characters in the input.\n\n\nCompression and archiving\n\ncompresse; gzip, Zip *: français; le goudron *\n\nVarious utilities to compress/uncompress individual files, combine multiple files into a single archive, or\ndo both.\n\n\nSorting and searching for patterns\n\nTrier *\n\nSort data alphabetically or numerically.\n\ngrep *\n\nSearch a file for lines containing character patterns.  The patterns can be simple fixed text, or very complex\nregular expressions.\n\nThe name comes from &quot;Global Regular Expression and Print&quot; &#8212; a function from\nthe Unix editors which was used frequently enough to warrant getting its own program.\n\n\nuniq *\n\nRemove duplicate lines, and generate a count of repeated lines.\n\ntoilettes *\n\nCount lines, words and characters in a file.\n\n\nSystem information (users, processes, time)\n\nrendez-vous amoureux *\n\nDisplay the current date and time (flexible format).  Useful for conditional execution based on\ntime, and for timestamping output.\n\nps *\n\nList the to a running processes.\n\ntuer *\n\nSend a signal (interrupt) to a running process.\n\nidentifiant\n\nPrint the user name and UID and group of the current user (e.g. to distinguish priviledged users before\nattempting to run programs which may fail with permission errors)\n\nqui\n\nDisplay who is logged on the system, and from where they logged in.\n\nuname *\n\nDisplay information about the system, OS version, hardware architecture etc.\n\ncourrier *\n\nSend mail, from a file or standard input, to named recipients.  Since scripts are often used to automate\nlong-running background jobs, sending notification of completion by mail is a common trick.\n\nenregistreur\n\nPlace a message in the central system logging facility.  Scripts can submit messages\nwith all the facilities available to compiled programs.\n\nnom d&#39;hôte\n\nDisplay the hostname of the current host &#8211; usful to keep track of where your programs are running\n\n\nConditional tests\n\ntester; [[[[ *\n\nThe conditional test, used extensively in scripts, is also an external program which evaluates\nthe expression given as an argument and returns true (0) or false (1) exit status.  The name &quot;[&quot; is a\nlink to the &quot;test&quot; program, so a line like:si [ -w logfile ] actually runs a program &quot;[« , with arguments « -w logfile ]&quot;, and returns a true/false value to the &quot;if&quot;\ncommander.\n\nIn ksh and most newer versions of sh, &quot;[&quot; is replaced with a compatible internal command, but the\nargument parsing is performed as if it were an external command.\nKsh also provides the internal &quot;[[&quot; operator, with simplified syntax.\n\n\n\nStream Editing\n\nawk *\n\nA pattern matching and data manipulation utility, which has its own scripting language.  It also duplicates\nmuch functionality from &#39;sed&#39;,&#39;grep&#39;,&#39;cut&#39;,&#39;wc&#39;, etc.\n\nComplex scripts can be written entirely using awk, but it is\nfrequently used just to extract fields from lines of a file (similar to &#39;cut&#39;).\n\n\nsed *\n\nStream Editor.  A flexible editor which operates by applying editing rules to every line in a data stream\nin turn.\n\nSince it makes a single pass through the file, keeping only a few lines in memory at once,\nit can be used with infinitely large data sets.  It is mostly used for global search and replace operations.\nIt is a superset of &#39;tr&#39;, &#39;grep&#39;, and &#39;cut&#39;, but is more complicated to use.\n\n\ntr\n\nTransliterate &#8211; perform very simple single-character edits on a file.\n\n\nFinding and comparing files\n\ntrouver *\n\nSearch the filesystem and find files matching certain criteria (name pattern, age, owner, size,\nlast modified etc.)\n\nxargs *\n\nApply multiple filename arguments to a named command and run it.\n\nXargs is often used in combination\nwith &quot;find&quot; to apply some command to all the files matching certain criteria.  Since &quot;find&quot; may result in a very\nlarge list of pathnames, using the results directly may overflow command line buffers.  Xargs avoids this problem,\nand is much more efficient than running a command on every pathname individually.\n\n\ndiff *\n\nCompare two files and list the differences between them.\n\nbasename pathname\n\nReturns the base filename portion of the named pathname, stripping off all the directories\n\ndirname pathname\n\nReturns the directory portion of the named pathname, stripping off the filename\n\n\nArithmetic and String Manipulation\n\nexpr *\n\nThe &quot;expr&quot; command takes an numeric or text pattern expression as an argument, evaluates it, and\nreturns a result to stdout.  The original Bourne shell had no built-in arithmetic operators.\nPar exemple.    expr 2 + 1      expr 2 &#39;*&#39; &#39;(&#39; 21 + 3 &#39;)&#39;  Used with text strings, &quot;expr&quot; can match regular expressions and extract sub expressions.  Similar functionality\ncan be achived with sed.\npar exemple.    expr SP99302L.Z00 : &#39;[A-Z0-9]4\\([0-9]3\\)L.*&#39;\n\ndc\n\nDesk Calculator &#8211; an RPN calculator, using arbitrary precision arithmetic and\nuser-specified bases.  Useful for more complex arithmetic expressions than can be performed\ninternally or using expr\n\navant JC\n\nA preprocessor for dc    which provides infix notation and a C-like syntax for\nexpressions and functions.\n\n\nMerging files\n\ncoller\n\nMerge lines from multiple files into tab-delimited columns.\n\njoindre\n\nPerform a join (in the relational database sense) of lines in two sorted input files.\n\n\n(33)\n\nThe standard man pages for sh    et ksh    are quite complete, but not easy to\nlearn from.  The following is a sampling of the many available books on the subject.  The Bolsky and Korn\nbook might be viewed as the standard &quot;reference&quot;.  The Blinn book is Bourne shell, but everything in it should\nwork for either shell.The links are to publisher&#39;s web sites, or Amazon.com. Some links are also given to the example\nscripts provided with the books.\nLivres\n\nThe New KornShell Command And Programming Language, by Morris I. Bolsky, David G. Korn (Contributor).\n\nPlus d&#39;informations\nLearning the Korn Shell, 2nd Edn. by Bill Rosenblatt and Arnold Robbins.\n\nPlus d&#39;informations\nKorn Shell Programming by Example, by Dennis O&#39;Brien, David Pitts (Contributor).\n\nPlus d&#39;informations\nThe Korn Shell Linux and Unix Programming Manual (2nd Edn) by Anatole Olczak.\n\nPlus d&#39;informations\nPortable Shell Programming: An Extensive Collection of Bourne Shell Examples by Bruce Blinn.\n\nPlus d&#39;informationsExamples from this book can be downloaded for study.\nLinux Shell Scripting with Bash by Ken O. Burtch.\n\nPlus d&#39;informations\nUnix Shell Programming by Stephen Kochan and Patrick Wood (third Edition).\n\nPlus d&#39;informations\nTeach yourself Shell Programming in 24 Hours,\nby S. Veeraraghavan. SAMS 2nd Edn. (2002)\nPlus d&#39;informations\n\nMastering Unix Shell Scripting\nby Randal K. Michael, Wiley (2003)\nPlus d&#39;informations\nLight on basics, but develops scripting through examples. Ksh only.\nExamples can be\ntéléchargé\nfrom the Wiley site (www.wiley.com/legacy/compbooks/michael/).\n\nWicked Cool Shell Scripts\nby Dave Taylor, No Starch Press (2004)\nPlus d&#39;informations\nDevelops scripting entirely through examples, drawn from Linux and OSX in addition to traditional Unix.\nRecommended, but not for beginners.\nExamples can be\ntéléchargé\nfrom the Intuitive site (www.intuitive.com/wicked/wicked-cool-shell-script-library.shtml).\n\nUnix Power Tools, by S. Powers, J. Peek, T. O&#39;Reilly, M. Loudikes et al.\n\nPlus d&#39;informations\n\n\nOnline Resources\n\nShelldorado (http://www.shelldorado.com)Lots of links to scripting resources\n\nKornshell (http://www.kornshell.com)The official Korn shell home page, with download links.\n\nMac OSX Unix tutorial (http://www.osxfaq.com/Tutorials/LearningCenter/)Good resource on advanced use of OSX and Unix shell scripting in general\n\n\nUnix-like shells and utilities for Microsoft Windows\n\nU/Win (http://www.research.att.com/sw/tools/uwin/)\nA free port of ksh and Unix command line utilities, plus Windows DLL for Unix compatability. Developed by AT&amp;T Research.\n\n\nCygwin (http://www.cygwin.com/)\nA free Linux-like environment for Windows. Provides bash, command line utilities and DLLs. Developed by RedHat. Un\nX server is also available.\n\n\nMKS Toolkit (http://www.mkssoftware.com/)\nA commercial ksh clone and command line utilities, plus DLL for Unix compatability.  An X server is also available.\n\n\nMicrosoft Services for UNIX (http://www.microsoft.com/windows/sfu/)\nA POSIX environment for Windows, with ksh, csh, command line tools, libraries and software development tools.\nDeveloped by Interix and bought by Microsoft.  Free download.\n\n\n\n\nUnix shell scripting with ksh/bash: Course Handout[an error occurred while processing this directive]\n\n(last update   22 March 2012)  ©Dartmouth College\n    http://www.dartmouth.edu/~rc/classes/ksh\n\n\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Script shell Unix avec ksh / bash\n    Document du cours: (dernière mise à jour le 22 mars 2012) \nCes notes sont disponibles sur http://www.dartmouth.edu/~rc/classes/ksh. La version en ligne contient de nombreux liens vers des informations supplémentaires et peut être plus à jour que les notes imprimées.","Les objectifs de cette classe sont de vous permettre de:","Découvrez quels types de problèmes conviennent aux scripts shell","Passez en revue les commandes Unix les plus couramment utilisées et utiles dans les scripts de shell.","Écrire des scripts shell simples en utilisant les shells Bourne, Korn ou Bash","Ces notes sont destinées à être utilisées dans un cours en deux parties, d’une durée totale de 3 heures.","Hypothèses:On suppose que vous savez déjà comment:","connectez-vous et obtenez une fenêtre de ligne de commande (n&#39;importe quel shell)","exécuter des commandes de base, naviguer dans les répertoires","utiliser une redirection simple d&#39;E / S et des tubes","utiliser un éditeur de texte (n&#39;importe lequel)","recherche des détails sur l&#39;utilisation des commandes dans les pages de manuel","Des exemples de commandes sont affichés comme ça. Beaucoup de commandes\nsont affichés avec des liens vers leurs pages de manuel complètes\n(sh)La sortie des commandes est affichée comme ça;\nles éléments optionnels sont [ in brackets ].","Certaines descriptions dans ces notes ont plus de détails disponibles,\net sont notés comme ceci:","Plus de détails sur cet article apparaissent ici. Les notes imprimées\ninclure toutes les informations supplémentaires","La permission est donnée de télécharger et d’utiliser ces notes et exemples de scripts, à condition que\ntous les avis de droits d&#39;auteur sont conservés intacts. Certains exemples sont tirés de textes\nou des ressources en ligne qui ont autorisé la redistribution.","Ces notes sont mises à jour de temps en temps. Le développement&quot;\nensemble de notes sont\n http://northstar-www.dartmouth.edu/~richard/classes/ksh\n(Dartmouth seulement)","Richard Brittain, Services informatiques du Dartmouth College.\n© 2003,2004,2010 Dartmouth College.\nCommentaires et questions, contactez Richard.Brittain @ dartmouth.edu","Table des matières\n(1)","Un fichier texte contenant des commandes qui auraient pu être saisies directement dans le shell.","Il n&#39;y a pas de différence de syntaxe entre l&#39;utilisation interactive de la ligne de commande et le placement des commandes\ndans un fichier. Certaines commandes ne sont utiles que lorsqu&#39;elles sont utilisées de manière interactive (par exemple, rappel de l&#39;historique en ligne de commande).\net les autres commandes sont trop complexes pour pouvoir être utilisées de manière interactive.","Le shell lui-même a des capacités limitées &#8211; le pouvoir provient de son utilisation comme &quot;colle&quot;\nlangue pour combiner les utilitaires Unix standard et un logiciel personnalisé, pour produire un outil\nplus utile que les composants seuls.","Tout shell peut être utilisé pour écrire un script shell. Pour permettre cela, la première ligne de chaque script\nest:#! / chemin / vers / shell        (par exemple. #! / bin / ksh).","le #!    les caractères indiquent au système de localiser le chemin suivant, de le démarrer et de\nalimentez le reste du fichier en entrée.\nTout programme capable de lire les commandes d’un fichier peut être démarré de cette manière, à condition que\nreconnaît le #    convention de commentaires. Le programme est lancé, puis le fichier de script\nest donné comme argument. Pour cette raison, le script doit être lisible et exécutable.\nLes exemples sont perl, awk, tcl et python.","Tout fichier peut être utilisé comme entrée dans un shell en utilisant la syntaxe suivante:ksh myscript","Si le fichier est rendu exécutable avec chmod, cela devient une nouvelle commande\net disponible pour utilisation (sujet à la recherche habituelle de $ PATH).chmod + x myscript","Un script shell peut être aussi simple qu&#39;une séquence de commandes que vous tapez régulièrement. En mettant\nles dans un script, vous les réduisez à une seule commande.","Exemple: ex0 affichage, texte","1: #! / bin / sh\n            2: rendez-vous amoureux\n   3: pwd\n            4: du -k","(2)","Combinez des séquences de commandes longues et répétitives en une seule commande simple.","Généraliser une séquence d&#39;opérations sur un ensemble de données, en une procédure pouvant être\nappliqué à tout ensemble similaire de données.\n  \n(par exemple.\nappliquer la même analyse à chaque fichier de données sur un CD, sans avoir à répéter les commandes)","Créer de nouvelles commandes en utilisant des combinaisons d’utilitaires comme les auteurs originaux\njamais pensé à.","Des scripts shell simples peuvent être écrits sous la forme d&#39;alias shell, mais le script peut être mis à la disposition de tous les utilisateurs.\net tous les processus. Les alias de shell s&#39;appliquent uniquement au shell actuel.","Enveloppez les programmes sur lesquels vous n&#39;avez aucun contrôle dans un environnement que vous pouvez contrôler.","par exemple. définir des variables d&#39;environnement, basculer vers un répertoire spécial, créer ou sélectionner un fichier de configuration,\nredirigez la sortie, enregistrez l’utilisation, puis exécutez le programme.","Créez des jeux de données personnalisés à la volée et appelez des applications (par exemple, matlab, sas, idl, gnuplot) pour fonctionner\nsur eux, ou créer des commandes / procédures d’application personnalisées.","Prototypage rapide (mais évitez de laisser les prototypes devenir production)","Utilisations typiques","Scripts de démarrage du système (/etc/init.d)","Administrateurs système, pour automatiser de nombreux aspects de la maintenance informatique, compte utilisateur\ncréation etc.","Outils d&#39;installation du package d&#39;application\n \nD&#39;autres outils peuvent créer des installateurs plus sophistiqués (par exemple, tcl / tk), mais ne peuvent pas être considérés comme déjà installés. Les scripts shell sont utilisés car ils sont très portables. Certains logiciels sont livrés avec une installation complète de l&#39;outil qu&#39;il veut utiliser\n(tcl / tk / python) pour être autonome, mais cela conduit à un gonflement logiciel.","Scripts de démarrage d&#39;application, en particulier\napplications sans surveillance (par exemple, à partir de cron    ou à)","Tout utilisateur ayant besoin d&#39;automatiser le processus de configuration et d&#39;exécution d&#39;applications commerciales,\nou leur propre code.","AUTOMATISER, AUTOMATISER, AUTOMATISER\n(3)","sh","&quot;Bourne&quot;, écrit par Steve Bourne chez AT &amp; T Bell Labs pour Unix V7 (1979).\nPetit, simple et (à l&#39;origine) très peu de commandes internes, donc il a appelé des programmes externes pour même le plus simple\ndes tâches. Il est toujours disponible sur tout ce qui ressemble vaguement à Unix.","csh\nLa coquille &quot;C&quot;. (Bill Joy, à Berkeley).\nBeaucoup de choses en commun\navec le shell Bourne, mais de nombreuses améliorations pour améliorer l’utilisation interactive. L&#39;interne\nles commandes utilisées uniquement dans les scripts sont très différent de &quot;sh&quot;, et\nsimilaire (par conception) à la syntaxe du langage &quot;C&quot;.","tcsh\nLe shell &quot;TC&quot;. Librement disponible et basé sur &quot;csh&quot;.\nIl comporte de nombreuses fonctionnalités supplémentaires pour rendre l&#39;utilisation interactive plus pratique.","Nous l&#39;utilisons comme shell interactif par défaut pour les nouveaux comptes sur tous nos systèmes publics.\nPeu de gens écrivent des scripts dans\nVoir la programmation de Csh considérée comme nuisible par\nTom Christiansen pour une discussion sur les problèmes de programmation des scripts csh.","ksh","Le &quot;Korn&quot; shell, écrit par David Korn de AT &amp; T Bell Labs (maintenant AT &amp; T Research).\nÉcrit comme une mise à niveau majeure vers &quot;sh&quot; et une compatibilité ascendante avec celui-ci, mais possède de nombreuses commandes internes pour le\nfonctions les plus fréquemment utilisées. Il intègre également de nombreuses fonctionnalités de tcsh qui améliorent\nutilisation interactive (rappel de l&#39;historique de ligne de commande, etc.).","L’acceptation a été lente, car les versions précédentes étaient grevées de licences AT &amp; T.\nCe shell est maintenant disponible gratuitement sur tous les systèmes, mais n&#39;est parfois pas installé par défaut sur Unix &quot;libre&quot;.\nIl existe deux versions principales. ksh88 était la version intégrée à AT &amp; T SVR4 Unix, et peut encore être installé\npar certains des vendeurs Unix commerciaux. ksh93 a ajouté plus de fonctionnalités, principalement pour la programmation, et une meilleure conformité POSIX.","POSIX 1003.2 Standard Shell.","Les comités de normalisation ont travaillé sur le shell Bourne et ont ajouté de nombreuses fonctionnalités au shell Korn (ksh88).\nC shell pour définir un ensemble standard de fonctionnalités que doivent posséder tous les shells conformes.","Sur la plupart des systèmes, / bin / sh est maintenant un shell compatible POSIX.\nKorn shell et Bash sont compatibles POSIX, mais possèdent de nombreuses fonctionnalités qui vont au-delà de la norme.\nSous Solaris, les commandes POSIX / XPG4 qui diffèrent\nlégèrement dans le comportement des commandes SunOS traditionnelles se trouvent dans / usr / xpg4 / bin","frapper","La coquille &quot;Bourne again&quot;. Ecrit dans le cadre de l’effort Open Source GNU / Linux et du shell par défaut pour Linux et\nMac OS X. C&#39;est un clone fonctionnel de sh, avec des fonctionnalités supplémentaires pour améliorer l&#39;utilisation interactive,\najouter la conformité POSIX et la compatibilité partielle de ksh.","zsh","Un clone fonctionnel gratuit de sh, avec des éléments de ksh, bash et une conformité POSIX complète, et\nnombreuses nouvelles fonctionnalités d&#39;édition en ligne de commande interactives.\nIl a été installé en tant que shell par défaut sur les anciens systèmes MacOSX.","(4)","Tous les shells énumérés ci-dessus partagent certaines caractéristiques communes et les différences majeures de syntaxe.\ngénéralement, n&#39;affectent que les scénaristes. Ce n&#39;est pas inhabituel\nutiliser un shell (par exemple, tcsh) pour une utilisation interactive, mais un autre (sh ou ksh)\npour écrire des scripts.\nPrincipales similitudes (et récapitulation de l&#39;utilisation de base de la ligne de commande)\nChacun de ces éléments est traité plus en détail ultérieurement.","Analyser les lignes par des espaces, rechercher des commandes externes à l&#39;aide de $ PATH.","Peut exécuter un script shell en utilisant shellname scriptfile, ou exécuter un seul\n    commande en utilisant shellname -c &quot;commande&quot;","Transmettez les arguments de ligne de commande développés aux programmes; récupérer le statut de sortie.","Passer des variables d&#39;environnement aux programmes.","Développez les jokers de nom de fichier en utilisant []*?. Chaque coquille a quelques autres\nmétacaractères génériques, mais ceux-ci sont communs à tous les shells.","Redirection I / O standard et tuyauterie avec , &gt;&gt;, |","Quelques fonctions internes (CD)","Commandes d&#39;arrière-plan avec Et","Règles de cotation: les &quot;guillemets&quot; protègent la plupart des choses, mais permettent $ var    interprétation;\nLes &quot;guillemets simples&quot; protègent tous les métacaractères de l&#39;interprétation.","Extension du répertoire personnel à l&#39;aide de ~ utilisateur    (à l&#39;exception de sh)","#    commentaires","Substitution de commande en utilisant `commande`    (backtics)","Développez les variables en utilisant $ varname    syntaxe","Exécution conditionnelle utilisant &amp;&amp;    et ||","Suite de ligne avec &quot;&quot;","Principales différences\nentre sh (+ dérivés) et csh (+ dérivés).","Syntaxe de toutes les constructions de contrôle de flux et des tests conditionnels.","Syntaxe de manipulation des chaînes dans les scripts","Syntaxe pour la manipulation arithmétique à l&#39;intérieur des scripts","Syntaxe de définition des variables locales (utilisées uniquement dans le script) et des variables d’environnement\npassé aux processus enfants). setenv    contre exportation","Syntaxe de redirection des flux d&#39;E / S autres que stdin / stdout","Fichiers de démarrage de connexion (.cshrc    et .s&#39;identifier, contre .profil) et les options par défaut","Lecture d’autres scripts shell dans le shell actuel (nom de fichier source, contre . nom de fichier)","Traitement des signaux (interruptions)","(5)","Il existe de nombreux autres programmes qui lisent un fichier de commandes et exécutent\nune séquence d&#39;actions. le &quot;#! / chemin / à / programme&quot;    convention\npermet à n&#39;importe lequel d&#39;entre eux d&#39;être utilisé comme langage de script pour créer de nouvelles commandes.\nCertains sont hautement spécialisés, et certains sont beaucoup plus efficaces que leurs équivalents\nscripts shell à certaines tâches. Il n&#39;y a jamais qu&#39;un seul moyen d&#39;effectuer une fonction,\net souvent, le choix dépend de facteurs tels que:","ce qui est déjà installé &#8211; beaucoup d&#39;autres langages de script ne sont pas disponibles par défaut","quel code similaire existe déjà","ce que vous connaissez et pouvez utiliser de la manière la plus efficace.\nVotre temps est toujours plus coûteux que les cycles informatiques.","Certains des principaux acteurs (tous disponibles gratuitement) dans les langages de script à usage général sont:","awk","Un outil de correspondance de modèle et de manipulation de données (texte et numérique). Prédate perl. Installé sur\ntous les systèmes Unix. Souvent utilisé en combinaison avec des scripts shell.","perl","Le langage de script le plus utilisé pour les applications Web CGI et les tâches d&#39;administration système. Perl\nest plus difficile à apprendre et est généralement installé par défaut maintenant.\nIl est plus efficace et dispose d’une énorme bibliothèque de fonctions. Vous pouvez utiliser Perl pour\npresque toutes les tâches de script, mais la syntaxe est très différente de la ligne de commande du shell","python","Un langage de script orienté objet. Communément installé par défaut sur les systèmes modernes.","tcl/tk","Langage de commande de l&#39;outil. Un autre langage de script à usage général. Le composant &quot;tk&quot; est un\ninterface scriptée vers les composants graphiques X-windows standard, la combinaison est donc souvent utilisée\ncréer des interfaces utilisateur graphiques.","Ksh93 peut être étendu en se connectant à des bibliothèques partagées fournissant des commandes internes supplémentaires. Un exemple\nd&#39;une coquille étendue est\ntksh\nqui intègre Tcl / Tk avec ksh et permet la génération de\nscripts utilisant les deux langues. Il peut être utilisé pour le prototypage d&#39;applications d&#39;interface graphique.","(6)","Ksh et bash sont les deux super-ensembles de sh. Pour une portabilité maximale, même très ancienne\nordinateurs, vous devriez vous en tenir aux commandes trouvées dans sh. Si possible, fonctionnalités spécifiques à ksh ou bash\nsera noté dans les pages suivantes. En général, les nouveaux obus courent un peu plus vite\net les scripts sont souvent plus lisibles, car la logique peut être exprimée plus proprement au plus récent\nsyntaxe. De nombreuses commandes et tests conditionnels sont maintenant internes.","La philosophie des outils Unix séparés effectuant chacun un seul\nopération a été suivie de près par les concepteurs de la coque d&#39;origine, de sorte qu&#39;il\navait très peu de commandes internes et\nutilisé des outils externes pour des opérations très triviales\n(comme écho    et [[[[). Ksh et bash en interne\neffectue un grand nombre de manipulations numériques et de chaînes de base et de tests conditionnels. Problèmes occasionnels\nse pose parce que les versions internes de certaines commandes comme écho    ne sont pas entièrement compatibles avec\nl&#39;utilitaire externe ils ont remplacé.","L&#39;action entreprise chaque fois qu&#39;un shell doit exécuter un programme externe consiste à localiser le programme.\n(via $ PATH), fourchette(), qui crée une deuxième copie du shell,\najustez l&#39;entrée / sortie standard pour le\nprogramme externe, et exec (), qui remplace le second shell par le programme externe.\nCe processus est onéreux en termes de calcul (relativement), donc lorsque le script fait quelque chose de trivial\nplusieurs fois dans une boucle, cela fait gagner beaucoup de temps si la fonction est gérée en interne.","Si vous suivez des manuels sur la programmation du shell Bourne, tous les conseils doivent être valables\nlequel des coquillages dérivés de Bourne que vous utilisez. Malheureusement, de nombreux fournisseurs ont ajouté des fonctionnalités au fil des ans\net atteindre la portabilité complète peut être un défi. Écrire explicitement pour ksh (ou bash) et insister\nsur ce shell en cours d&#39;installation, peut souvent être plus simple.","Le sh et le ksh homme les pages utilisent le terme commande spéciale    pour les commandes internes &#8211; gérées par le shell\nlui-même.\n(7)","Le script shell le plus élémentaire est une liste de commandes exactement telles qu’elles pourraient être.\ndactylographié de manière interactive, préfacé par le #!    en-tête magique.\nToutes les règles d&#39;analyse, les caractères génériques de nom de fichier, les recherches $ PATH, etc., qui ont été résumés\nci-dessus, appliquer.\nEn outre:","#    en tant que premier caractère non blanc sur une ligne","marque la ligne en tant que commentaire et le reste de la ligne est complètement ignoré. Utilisation\ncommente librement dans vos scripts, comme dans toutes les autres formes de programmation.","comme dernier caractère d&#39;une ligne","provoque la jointure logique de la ligne suivante avant interprétation. Ceci permet\ncommandes très longues à saisir dans le script de manière plus lisible. Tu peux continuer\nla ligne autant de fois que nécessaire.","Ceci est en fait juste un cas particulier de     Être à échapperou supprimer\nla signification spéciale de, le caractère suivant.",";    comme séparateur entre les mots d&#39;une ligne","est interprété comme une nouvelle ligne. Il vous permet de placer plusieurs commandes sur une seule ligne. Il y a\nquelques occasions où vous doit faire cela, mais souvent il est utilisé pour améliorer la mise en page\ndes commandes composées.","Exemple: affichage ex1, texte","1: #! / bin / ksh\n            2: # Aux fins d’affichage, certaines parties du script ont \n            3: # été rendu en technicolor glorieux.\n            4: ## Certains commentaires sont en gras pour signaler les sections spéciales\n            5: \n            6: # Les numéros de ligne à gauche ne font pas partie du script.\n            7: # Ils sont simplement ajoutés au HTML pour référence.\n            8: \n            9: # Les commandes intégrées et les mots-clés (par exemple, print) sont en bleu\n        dix: # Les substitutions de commandes sont violettes. Les variables sont noires\n        11: impression &quot;Résumé de l&#39;utilisation du disque pour $ USER sur `rendez-vous amoureux`&quot;\n  12: \n        13: # Tout le reste est rouge - ce qui est principalement externe \n        14: # commandes et les arguments de toutes les commandes.\n        15: impression Ce sont mes fichiers       # commentaire de fin de ligne pour impression\n        16: # Liste les fichiers en colonnes\n        17: ls -C\n  18: # Résumer l&#39;utilisation du disque\n        19: impression\n        20: impression Utilisation de l&#39;espace disque\n  21: du -k \n  22: sortie 0","Statut de sortie\nChaque commande (programme) a un valeur ou statut de sortie\nqu&#39;il retourne au programme appelant. Ce\nest séparé de toute sortie générée. Le statut de sortie d&#39;un script shell peut être défini explicitement à l&#39;aide de\nsortie Nou la valeur par défaut de la dernière commande exécutée.","Le statut de sortie est un entier compris entre 0 et 255. Conventionnellement 0 = succès et\ntoute autre valeur indique un problème. Pensez-y comme à un seul moyen pour que tout\ntravailler, mais de nombreuses façons d’échouer. Si la commande s&#39;est terminée par un signal, la valeur est 128 plus\nla valeur du signal.","(8)","Le shell interprète les caractères suivants comme des caractères génériques de nom de fichier, et\ntout mot les contenant est remplacé par une liste triée de tous les fichiers correspondants.","Les caractères génériques peuvent être utilisés dans les parties de répertoire d&#39;un chemin ainsi que dans la partie de nom de fichier.\nSi aucun fichier ne correspond au caractère générique, celui-ci reste inchangé.\nLes caractères génériques ne sont pas des expressions régulières complètes. Sed, grep, awk etc. fonctionnent avec plus de souplesse (et plus\ncomplexes) opérateurs de correspondance de chaînes.","*","Correspond à zéro ou plusieurs caractères.","?","Correspondre à n&#39;importe quel personnage","[...]","Faites correspondre n&#39;importe quel caractère de l&#39;ensemble entre crochets. Une plage de caractères peut être spécifiée\navec [  -  ]","[!...]","Associez n&#39;importe quel caractère non inclus dans l&#39;ensemble entre crochets.","Une initiale &quot;.&quot; dans un nom de fichier ne correspond pas à un caractère générique, sauf si explicitement\ndonné dans le motif. En ce sens, les noms de fichiers commençant par &quot;.&quot; sont cachés.\nUNE &quot;.&quot; ailleurs dans le nom de fichier n&#39;est pas spécial.","Les opérateurs de modèle peuvent être combinés","Exemple:chapitre[1-5]. *    pourrait correspondre chapitre1.tex, chapitre4.tex, chapitre5.tex.old.\nCela ne correspond pas chapitre10.tex    ou chapitre 1\n(9)","Les scripts ne sont pas très utiles si toutes les commandes, options et noms de fichiers sont explicitement\ncodé. En utilisant des variables, vous pouvez créer un script générique et l’appliquer à différents\ndes situations. Les noms de variables sont composés de lettres, de chiffres et de traits de soulignement\n ([a-zA-Z0-9_], ne peut pas commencer par un nombre, et sont des cas\nsensible. Plusieurs variables spéciales (toujours des noms en majuscule) sont utilisées par le système &#8211; en les réinitialisant.\npeut provoquer un comportement inattendu. Certaines variables spéciales peuvent être en lecture seule.\nL&#39;utilisation de noms minuscules pour vos propres variables est la plus sûre.\nDéfinition et exportation de variables","srcfile = dataset1","Crée (si elle n’existait pas) une variable nommée &quot;srcfile&quot; et lui attribue la valeur &quot;dataset1&quot;. Si la\nLa variable existait déjà, elle est écrasée. Les variables sont traitées comme des chaînes de texte, sauf si le contexte\nimplique une interprétation numérique. Vous pouvez faire en sorte qu&#39;une variable soit toujours traitée comme un nombre. Notez ici\ndoit être sans espaces autour du &quot;=&quot;.","ensemble","Afficher toutes les variables actuellement définies dans le shell","non fixé srcfile","Supprimer la variable &quot;srcfile&quot;","srcfile =","Donnez à la variable une valeur nulle (ce n&#39;est pas la même chose que de la supprimer).","exportation srcfile","Ajout de srcfile à la liste des variables qui seront mises à la disposition du programme externe via\nl&#39;environnement. Si vous ne le faites pas, la variable est locale pour cette instance de shell.","exportation","Répertorie toutes les variables en cours d’exportation &#8211; c’est l’environnement qui sera transmis.\naux programmes externes.","En utilisant des variables","$ srcfile","Préfacer le nom de la variable avec $ provoque la valeur de la variable à\nêtre substitué à la place du nom.","$ srcfile","Si la variable n&#39;est pas entourée d&#39;espaces (ou d&#39;autres caractères qui ne peuvent pas être dans un nom),\nle nom doit être entouré d&#39;accolades &quot;&quot;\nafin que le shell sache quels caractères vous voulez faire partie du nom.","Exemple:","fichier de données = recensement2000\n# Essaie de trouver $ datafile_part1, qui n&#39;existe pas\necho $ datafile_part1.sas\n# C&#39;est ce que nous voulions\necho $ datafile _part1.sas","Modificateurs conditionnels\nIl existe différentes manières d’utiliser conditionnellement une variable dans une commande.","$ datafile-default","Substituez la valeur de $ fichier de données, s’il a été défini, sinon utilisez la chaîne &quot;default&quot;. C&#39;est facile\nmoyen de permettre des variables optionnelles, et avoir des valeurs par défaut raisonnables si elles n’ont pas été définies. Si fichier de données    était\nindéfini, il en reste ainsi.","$ datafile = default","Similaire à ce qui précède, sauf si fichier de données    n&#39;a pas été défini, définissez-le sur la chaîne &quot;default&quot;.","$ datafile + default","Si variable fichier de données    a été défini, utilisez la chaîne &quot;default&quot;, sinon utilisez null. Dans ce cas, le\nvaleur actuelle $ fichier de données    N&#39;est pas utilisé.","$ datafile? &quot;message d&#39;erreur&quot;","Substituez la valeur de $ fichier de données, s&#39;il a été défini, sinon affichez datafile: message d&#39;erreur.\nCeci est utilisé pour les diagnostics lorsqu&#39;une variable aurait dû être définie et qu&#39;il n&#39;y a pas de valeur par défaut raisonnable à utiliser.","Placer un colon (:) avant que le caractère opérateur dans ces constructions ait pour effet de compter un\nnul valeur identique à une variable non définie. Les variables peuvent recevoir une valeur nulle en les définissant\nen une chaîne vide, par exemple fichier de données = .\nExemple:\necho $ datafile: -mydata.datÉcho de la valeur de variable fichier de données    s&#39;il a été défini et est non nul, sinon\necho &quot;mydata.dat&quot;.","Préfixe de commande d&#39;attribution de variable\nIl est possible d’exporter une variable pour la durée d’une seule commande en utilisant le\nsyntaxe:\nvar = valeur commande args\n(dix)","Le système utilise plusieurs variables spéciales. Vous pouvez les utiliser, mais vous ne pourrez peut-être pas\npour les changer.\nLes variables spéciales utilisent des noms en majuscules ou des caractères de ponctuation.\nCertaines variables sont définies par le processus de connexion et héritées par le shell (par exemple, $ USER),\ntandis que d&#39;autres ne sont utilisés que par le shell.  Essayez de courir ensemble    ou env Voici quelques-uns des plus couramment utilisés:\nEnvironnement de connexion","$ USER, $ LOGNAME","Prédéfini sur le nom d&#39;utilisateur actuellement connecté.","$ PATH","La liste des répertoires qui seront recherchés pour les commandes externes. Vous pouvez changer cela dans un script\npour vous assurer que vous obtenez les programmes que vous avez l&#39;intention, et ne pas obtenir accidentellement d&#39;autres versions qui pourraient avoir été\ninstallée.","$ TERM","Le type de terminal dans lequel la session shell est en cours d&#39;exécution. Habituellement, &quot;xterm&quot; ou &quot;vt100&quot;. Beaucoup de programmes\nVous devez savoir cela pour savoir quelles séquences de caractères spéciaux envoyer pour obtenir des effets spéciaux.","$ PAGER","S&#39;il est défini, il contient le nom du programme que l&#39;utilisateur préfère utiliser pour afficher les fichiers texte. habituellement\nrégler sur &quot;plus&quot; ou &quot;moins&quot; ou quelque chose de similaire. De nombreux programmes devant présenter des informations sur plusieurs pages\nl&#39;utilisateur respectera ce paramètre (par exemple, homme). Ce n&#39;est pas réellement utilisé par le shell lui-même, mais\nLes scripts shell doivent l’honorer s’ils doivent émettre une page vers l’utilisateur.","$ EDITEUR","Si défini, ceci contient le nom du programme que l&#39;utilisateur préfère utiliser pour l&#39;édition de fichier texte. Un programme\nqui doit obliger l’utilisateur à éditer manuellement un fichier peut choisir de démarrer ce programme au lieu de\npar défaut intégré (par exemple &quot;crontab -e&quot;. Ceci détermine également la modification de la ligne de commande par défaut.\ncomportement dans des coquilles interactives.","Paramètres internes du shell","$ PWD","Toujours définir le répertoire de travail actuel (en lecture seule)","$ OLDPWD","Le répertoire précédent (avant le plus récent CD    commander). Cependant, changer de répertoire\ndans un script est souvent dangereux.","$?    (lecture seulement)","Définissez le statut de sortie de la dernière commande exécutée afin de pouvoir tester le succès ou l&#39;échec. Chaque commande réinitialise cette\nil faut donc le sauvegarder immédiatement si vous voulez l’utiliser plus tard.","$ -","Définissez les options actuellement définies.","$ IFS","Séparateurs de champs internes: ensemble de caractères (normalement des espaces et des tabulations) utilisés pour analyser\nune ligne de commande en arguments séparés. Ceci peut être défini par l&#39;utilisateur à des fins spéciales, mais\nles choses deviennent très déroutantes si rien n&#39;est changé.","Variables d&#39;ID de processus","$$    (lecture seulement)","Défini sur l&#39;ID de processus du shell actuel &#8211; utile pour créer des fichiers temporaires uniques, par exemple. /tmp/$0.$$","$ PPID    (lecture seulement)","Défini sur l&#39;ID de processus du processus parent de ce shell &#8211; utile pour découvrir comment le script a été appelé.","$!    (lecture seulement)","Défini sur l&#39;ID de processus de la dernière commande démarrée en arrière-plan &#8211; utile pour vérifier les processus en arrière-plan.","ksh / bash fonctionnalités supplémentaires","$ SECONDES    (lecture seulement)","Nombre entier de secondes depuis le démarrage de ce shell. Peut être utilisé pour les commandes de chronométrage.","$ RANDOM","Chaque fois qu&#39;il est valorisé, $ RANDOM    renvoie un entier aléatoire compris entre 0 et 32k.  AU HASARD\npeut être réglé sur &quot;semer&quot; le générateur de nombres aléatoires.","$ LINENO    (lecture seulement)","Evalue toujours le numéro de ligne actuel du script en cours d&#39;exécution &#8211; utile pour le débogage.","(11)","Pour personnaliser le comportement d&#39;un script au moment de l&#39;exécution,\nvous pouvez lui donner un nombre quelconque d&#39;arguments sur la commande\nligne.","Ce sont souvent des noms de fichiers, mais peuvent être interprétés par le script de quelque manière que ce soit. Les options\nsont souvent spécifiés en utilisant la convention &quot;-flag&quot; utilisée par la plupart des programmes Unix, et une commande ksh\ngetopts    est disponible pour aider à les analyser.","Le shell développe les caractères génériques et rend variable et\nsubstitutions de commandes comme d&#39;habitude, puis analyse les mots obtenus par des espaces (en réalité\nvariable spéciale $ IFS) et place les chaînes de texte résultantes dans\nvariables de position\ncomme suit:","0 $, 1 $, 2 $, ... 9 $","Les 9 premiers arguments sont disponibles directement sous forme de $ 1-9 $. Pour accéder à plus de 9, utilisez\ndécalage, ou $ *, $ @. La variable 0 $    contient le nom du\nscript lui-même.","$ 10, $ 11, ...","Les arguments positionnels supérieurs à 9 sont définis par ksh et bash. N&#39;oubliez pas d&#39;utiliser des accolades pour vous y référer.","décalage","ignore $ 1 et renumérote toutes les autres variables. &quot;décalage N&quot;déplacera N arguments à la fois.","$ #","contient le nombre d&#39;arguments définis (non compris $ 0).","$ *","contient tous les arguments dans une seule chaîne, avec un espace les séparant.","$ @","semblable à $ *, mais s&#39;il est utilisé entre guillemets, il cite efficacement chaque argument et les maintient séparés.\nSi un argument contient des espaces, la distinction est importante.","par exemple. si la liste d&#39;arguments est:  a1 a2 &quot;a3 qui contient des espaces&quot; a4alors: $ 1 = a1, $ 2 = a2, $ 3 = a3 qui contient des espaces, $ 4 = a4et: $ * = a1 a2 a3 qui contient des espaces a4et: &quot;$ @&quot; = &quot;a1&quot; &quot;a2&quot; &quot;a3 qui contient des espaces&quot; &quot;a4&quot;\nUtiliser uniquement le formulaire &quot;$ @&quot; préserve les arguments cités. Si les arguments sont passés du script\ndirectement à un autre programme, cela peut faire une grande différence quant à la signification.","Exemple: affichage ex7, texte","1: #! / bin / sh\n            2: #\n            3: # Vérifier la gestion des arguments de position\n            4: écho &quot;Nombre d&#39;arguments: $ #&quot;\n   5: écho &quot;0 $ = 0 $&quot;\n   6: \n            7: écho &quot;Boucle sur $ *&quot;\n   8: pour un dans $ *; faire\n            9:    écho  &quot;$ a &quot;\n  dix: terminé\n        11: \n        12: écho &quot;Boucle sur &quot; $ @ &quot;&quot;\n  13: pour un dans &quot;$ @&quot;; faire\n        14:    écho  &quot;$ a &quot;\n  15: terminé","Définir de nouveaux arguments de position\nle ensemble    commande, suivie d&#39;un ensemble d&#39;arguments, crée un nouvel ensemble de\narguments de position. Ceci est souvent utilisé, en supposant que les arguments originaux ne sont plus nécessaires, pour analyser\nun ensemble de mots (en utilisant éventuellement des séparateurs de champs différents). Les arguments peuvent être réinitialisés autant de fois que nécessaire.","Exemple: affichage ex2, texte","1: #! / bin / sh\n            2: # Trouver une entrée dans le fichier de mots de passe\n            3: pwent =`grep &#39;^ root:&#39; / etc / passwd`\n   4: # Turn off globbing - les lignes de mot de passe contiennent souvent &#39;*&#39;\n            5: set -o noglob\n   6: # Le &quot;nom complet&quot; et les autres commentaires sont en\n            7: # champ 5, délimité par deux points. Obtenir ce champ en utilisant le fractionnement des mots de passe\n            8: OIFS =$ IFS; IFS =:; ensemble $ pwent; IFS =$ OIFS\n            9: écho 5 $","Exemple: affichage pickrandom, texteSélectionne un fichier aléatoire dans un répertoire.\nUtilise la fonctionnalité ksh RANDOM.","1: #! / bin / ksh\n            2: \n            3: # Sélectionnez une image aléatoire dans la collection de logos en arrière-plan.\n            4: # Ceci pourrait être utilisé pour configurer un économiseur d&#39;écran, par exemple.\n            5: #\n            6: # Cela fonctionne même si les noms de fichiers contiennent des espaces.\n            7: \n            8: # passer au répertoire des logos pour éviter les longs chemins\n            9: logos =/ afs / northstar / commun / usr / lib / X11 / logos / arrière-plans\n  dix: CD logos $\n        11: \n        12: # &#39;*&#39; est un joker de nom de fichier qui correspond à tous les fichiers du répertoire en cours.\n        13: ensemble *\n  14: \n        15: # Utilisez la syntaxe pour les expressions arithmétiques. &quot;%&quot; est l&#39;opérateur modulo\n        16: # Décale les arguments d&#39;un nombre aléatoire entre 0 et le nombre de fichiers\n        17: décalage $ (($ RANDOM % $ #))\n        18: \n        19: # Affiche le premier argument résultant\n        20: écho &quot;logos $/1 $&quot;","(12)","Options de démarrage. ksh -options scriptname","-X","echo ligne stderr avant de l&#39;exécuter","-n","lit les commandes et vérifie les erreurs de syntaxe, mais ne les exécute pas.","-une","toutes les variables sont automatiquement exportées","-F","désactiver l&#39;expansion des noms de fichiers génériques (globbing)","set -x","Définir une option dans un script shell","$ -","contient les lettres d&#39;option actuellement définies","Il y a beaucoup d&#39;autres options, pas souvent nécessaires. Les options en ksh et bash peuvent aussi être\ndéfinir en utilisant des noms longs (par exemple -o noglob    au lieu de -F). De nombreuses options\nsont uniques à ksh ou bash.\n(13)","syntaxe sh","`commande`","Une commande (plus des arguments optionnels) entourés de backticks est exécutée et la sortie standard\nde cette commande est substitué. Si la commande produit une sortie multiligne, les nouvelles lignes sont conservées.\nSi la chaîne résultante est affichée, sans guillemets, en utilisant écho, les nouvelles lignes et les espaces multiples seront supprimés.","syntaxe ksh / bash","$ (commande)","Cette syntaxe est fonctionnellement identique à celle des backticks, mais les commandes peuvent être plus facilement imbriquées.","$ (&lt;fichier)","Ceci est équivalent à `cat file`, mais mis en œuvre en interne pour plus d&#39;efficacité.","Exemple: affichage ex3, texte","1: #! / bin / ksh\n            2: \n            3: écho Aujourd&#39;hui c&#39;est `rendez-vous amoureux`\n   4: \n            5: fichier =/ etc / hosts\n   6: écho Le fichier fichier $ a $ (wc -l &lt; fichier $) lignes\n   7: \n            8: nom_hôte -s&gt; nom_hôte\n   9: écho Ce système a le nom d’hôte $ (&lt;monhôte)","(14)","Toute commande simple (ou fonction shell, ou commande composée) peut avoir son entrée et sa sortie\nredirigé à l&#39;aide des opérateurs suivants. Ceci est effectué par le shell avant\nla commande est exécutée.\nRedirection de sortie","&gt; nom de fichier","La sortie standard (descripteur de fichier 1) est redirigée vers le fichier nommé. Le fichier est écrasé\nà moins que le noclobber    l&#39;option est définie. Le fichier est créé s&#39;il n&#39;existe pas.","Le fichier de périphérique spécial / dev / null    peut être utilisé pour ignorer explicitement les sorties indésirables.\nLa lecture de / dev / null entraîne un statut de fin de fichier.","&gt;&gt; nom de fichier","La sortie standard est ajoutée au fichier nommé. Le fichier est créé s&#39;il n&#39;existe pas.","&gt; | nom de fichier","Sortie redirection, et remplacer le noclobber option, si définie.","Redirection d&#39;entrée","&lt; nom de fichier","L&#39;entrée standard (descripteur de fichier 0) est redirigée vers le fichier nommé. Le fichier doit déjà\nexister.","Pipelines de commande","commande | commander [ | command ...]","Pipe plusieurs commandes ensemble. La sortie standard de la première commande devient la norme\nentrée de la deuxième commande. Toutes les commandes sont exécutées simultanément et le transfert de données s&#39;effectue via la mémoire.\ndes tampons. C&#39;est l&#39;une des constructions les plus puissantes d&#39;Unix. Composé les commandes peuvent aussi être\nutilisé avec des tuyaux. Les pipes jouent très bien avec les systèmes multiprocesseurs.","Un seul pipeline dans un pipeline doit être interactif (tentative de lecture depuis\nle terminal). Cette construction est beaucoup plus efficace que l’utilisation de fichiers temporaires, et la plupart des\nLes utilitaires Unix sont conçus pour fonctionner correctement dans les pipelines.","L&#39;état de sortie d&#39;un pipeline est l&#39;état de sortie de la dernière commande. Dans les commandes composées, un pipeline\npeut être utilisé n&#39;importe où une simple commande pourrait être utilisée.","(15)","Les scripts shell peuvent générer directement des sorties ou lire des entrées dans des variables à l&#39;aide des commandes suivantes:\nSortie de script","écho","Imprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nUtilisez des guillemets pour préserver l’espacement. Echo comprend également les conventions d’échappement de type C.","Attention ça\nle shell peut traiter les barres obliques inverses avant écho    les voit (peut avoir besoin de doubler la barre oblique inverse).\nInterne dans la plupart des coquilles, mais était à l&#39;origine externe.","b \n        retour arrière \n     c \n        ligne d&#39;impression sans nouvelle ligne (certaines versions)","F \n        formulaire d&#39;alimentation \n n \n        nouvelle ligne","r \n        retour chariot\n     t \n        languette","v \n        onglet vertical \n\\  \n    barre oblique inverse","0n où n est le caractère de 8 bits dont le code ASCII\n      code est le nombre octal à 1, 2 ou 3 chiffres\n      représentant ce personnage.","-n \nsupprimer newline","impression    (ksh interne)","Imprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nPrint observe les mêmes conventions d&#39;échappement que l&#39;écho.","-n","supprimer newline","-r","mode brut &#8211; ignore les conventions  -escape","-R","mode brut &#8211; ignore les conventions et les options  -escape sauf -n.","Entrée de script","lis var1 var2 reste","lit une ligne de stdin, analyse de $ IFS et place les mots dans les variables nommées.\nTous les mots restants entrent tous dans la dernière variable. Un &#39;&#39; comme dernier caractère d&#39;une ligne\nsupprime l’importance de la nouvelle ligne et l’entrée continue avec la ligne suivante.","-r","mode brut &#8211; ignore les conventions  -escape","Exemple: affichage ex4a, texte","1: #! / bin / sh\n            2: écho &quot;Test de la saisie utilisateur interactive: saisissez quelques touches et appuyez sur la touche Retour&quot;\n   3: lis x plus\n   4: écho &quot;Le premier mot était &quot;$ x &quot;&quot;\n   5: écho &quot;Le reste de la ligne (le cas échéant) était &quot;$ plus &quot;&quot;","(16)","La plupart des opérateurs de contrôle de flux utiles impliquent de faire des tests conditionnels et\nbranchement sur le résultat (vrai / faux). Le test peut être soit le tester\ncommande, ou son alias, [[[[, ou le ksh / bash intégré [[[[[ ... ]]\ncommande, qui a des options légèrement différentes, ou il peut être toute commande qui retourne\nun statut de sortie approprié. Zéro est considéré comme &quot;vrai&quot;, tandis que toute valeur autre que zéro est &quot;faux&quot;.\nNotez que ceci est inversé par rapport à la convention du langage C.\nTests de fichiers","-e fichier","Vrai si fichier existe (peut être de tout type).","-F fichier","Vrai si fichier existe et est un fichier ordinaire.","-ré fichier","Vrai si fichier existe et est un répertoire.","-r fichier","Vrai si fichier existe et est lisibleDe même, -w    = accessible en écriture, -X    = exécutable, -L    = est un lien symbolique.","-s fichier","Vrai si fichier existe et a une taille supérieure à zéro","-t archiveur de notes","Vrai si l&#39;ouvert archiveur de notes est associé à un terminal. Par exemple. c&#39;est\nutilisé pour déterminer si la sortie standard a été redirigée vers un fichier.","Tests de chaînes de caractères","-n &quot;chaîne&quot;","vrai si chaîne a une longueur non nulle","-z &quot;chaîne&quot;","vrai si chaîne a une longueur nulle","Avec [[[[, l&#39;argument doit être cité, car s&#39;il s&#39;agit d&#39;une variable\na une valeur nulle, l&#39;expansion résultante ( [ -z ] ) est une erreur de syntaxe. Un\nles extensions générant &quot;&quot; comptent comme une chaîne nulle.  Pour [[[[    seulement, un cité\nla chaîne seule est équivalente au test -n, par ex. [ « $var » ]. Dans les coquilles plus anciennes pour lesquelles\n[[[[    est un programme externe, le seul moyen de tester une chaîne nulle est:si [ \"X€var\" = \"X\" ]C&#39;est rarement nécessaire maintenant, mais on le trouve encore souvent.","$ variable = texte","Vrai si $ variable allumettes texte.","$ variable &lt; texte","Vrai si $ variable vient avant (lexicalement) texteDe même, &gt;    = vient après","(17)","Arithmetic tests","$variable -eq  nombre","True if $variable, interpreted as a number, is equal to nombre.","$variable -ne  nombre","True if $variable, interpreted as a number, is ne pas égal à nombre.De même, -lt    = less than, -le    = less than or equal,\n-gt    = greater than, -ge    = greater than or equal","Additional tests for [[&#8230;]](ksh and bash)","$variable = modèle","True if $variable allumettes modèle. Si modèle contains no wildcards,\nthen this is just an exact text match.  The same wildcards as used for filename matching are used.","le modèle must not be quoted. Puisque [[&#8230;]]is internal to the shell, the pattern in this case is\ntreated differently and not filename-expanded as an external command would require.","file1 -nt file2","True if file1 is newer than file2.  De même -ot    = older than","file1 -ef file2","true if file1 is effectively the same as file2, after following\nsymlinks and hard links.","Negating and Combining tests\nTests may be negated by prepending the !    operator, and combined with boolean\nET et OU operators using the syntax:","conditionnel -a conditionnel, conditionnel -o conditionnel","ET et OU syntax for tester    et [[[[","conditionnel &amp;&amp; conditionnel, conditionnel || conditionnel","ET et OU syntax for [[[[[ ... ]]","Parentheses may be inserted to resolve ambiguities or override the default operator precedence rules.","Exemples:","si [[  -x /usr/local/bin/lserve && \n       -w /var/logs/lserve.log ]]; puis\n   /usr/local/bin/lserve &gt;&gt; /var/logs/lserve.log &amp;\nfi","pwent=`grep &#39;^richard:&#39; /etc/passwd`\nsi [ -z \"$pwent\" ]; puis\n   echo richard not found\nfi","(18)","UNE liste in these descriptions is a simple command, or a pipeline.\nThe value of the liste is the value of the last simple command run in it.","UNE liste can also be a set of simple commands or\npipelines separated by &quot;;,&amp;,&amp;&amp;,||,|&amp;&quot;.\nFor the compound commands which branch on the success or failure\nde certaines liste,  it is usually [[[[    ou [[[[[[[[, but can be anything.","Conditional execution: if/else","liste &amp;&amp; liste","Execute the first liste. If true (success), execute the second one.","liste || liste","Execute the first liste. If false (failure), execute the second one.","Exemple:","mkdir tempdir &amp;&amp; cp workfile tempdir","sshd || echo &quot;sshd failed to start&quot;","You can use both forms together (with care) &#8211; they are processed left to right, and &amp;&amp; must come first.\nExemple:","mkdir tempdir &amp;&amp; cp workfile tempdir || \n echo &quot;Failed to create tempdir&quot;","si liste; puis liste ; elif liste; puis liste; autre liste; fi","Execute the first liste, and if true (success), execute the &quot;then&quot; list, otherwise\nexecute the &quot;else&quot; list.  The &quot;elif&quot;  and &quot;else&quot; lists are optional.","Exemple:","si [ -r $myfile ]\npuis\n   cat $myfile\nautre\n   echo $myfile not readable\nfi","Looping: &#39;while&#39; and &#39;for&#39; loops","tandis que liste; faire liste; terminé\njusqu&#39;à ce que liste; faire liste; terminé","Execute the first liste and if true (success), execute the second liste. Repeat as\nlong as the first liste est vrai. le jusqu&#39;à ce que    form just negates the test.","Exemple: ex4 display, text","1: #!/bin/ksh\n            2: count=0\n   3: max=dix\n   4: tandis que [[[[[[[[$count -lt $max ]]\n   5: faire \n            6:   écho $count\n            7:   count=$((count + 1))\n            8: terminé\n            9: écho &quot;Value of count after loop is: $count&quot;","pour identifiant [in[in[in[inmots ]; do; liste; terminé","Ensemble identifiant in turn to each word in  mots and execute the liste.\nOmitting the &quot;in mots&quot; clause implies using $@, i.e. the identifiant est mis en\nturn to each positional argument.","Exemple:","for file in *.dat\nfaire\n    echo Processing $file\nterminé","As with most programming languages, there are often several ways to express the same action.\nRunning a command and then explicitly examining $?    can be used instead of some of the above.","Compound commands can be thought of as running in an implicit subshell. Ils\ncan have I/O redirection independant of the rest of the script.  Setting of variables in a real subshell does not\nleave them set in the parent script.  Setting variables in implicit subshells varies in behaviour among shells.\nOlder sh    could not set variables in an implicit subshell and then use them later,\nbut current ksh    can do this (mostly).","Exemple: ex11 display, textReading a file line by line.  The book by Randal Michael contains 12 example ways to read a file line by line,\nwhich vary tremendously in efficiency.  This example shows the simplest and fastest way.","1: #!/bin/sh\n            2: \n            3: # Demonstrate reading a file line-by-line, using I/O\n            4: # redirection in a compound command\n            5: # Also test variable setting inside an implicit subshell.\n            6: # Test this under sh and ksh and compare the output.\n            7: \n            8: line=&quot;TEST&quot;\n   9: save=\n        10: \n        11: si [-z&quot;[-z&quot;[-z\"[-z\"$1&quot; ]; puis\n        12:    écho &quot;Usage: 0 $ filename&quot;\n  13: autre\n        14:    si [-r[-r[-r[-r$1 ]; puis\n        15:       tandis que read line; faire\n        16:          écho &quot;$line&quot;\n  17:          save=$line\n        18:       terminé &lt; $1\n        19:    fi\n        20: fi\n        21: écho &quot;End value of $line est $line&quot;\n  22: écho &quot;End value of $save est $save&quot;","(19)","Case statement: pattern matching","Cas mot dans modèle) liste;; esac","Comparer mot avec chaque modèle) in turn, and executes the first liste\npour lequel le mot allumettes. le les patrons follow the same rules as for filename\nwildcards.","(ksh and bash only)\nA pattern-list is a list of one or more  patterns  separated\nfrom  each  other with a |. Composite patterns can be formed\nwith one or more of the following:","?(pattern-list)","Optionally matches any one of the given patterns.","*(pattern-list)","Matches  zero  or  more  occurrences  of   the   given  patterns.","+(pattern-list)","Matches one or more occurrences of the given patterns.","@(pattern-list)","Matches exactly one of the given patterns.","!(pattern-list)","Matches anything, except one of the given patterns.","Exemple:","case $filename in\n    *.dat)\n        echo Processing a .dat file\n        ;;\n    *.sas)\n        echo Processing a .sas file\n        ;;\n    *)\n        # catch anything else that doesn&#39;t match patterns\n        echo &quot;Don&#39;t know how to deal with $filename&quot;\n        ;;\n    esac","Miscellaneous flow control and subshells\nPause [n]","Break out of the current (or n&#39;th) enclosing loop.  Control jumps to the next statement\nafter the loop","continuer [n];","Resume iteration of the current (or n&#39;th) enclosing loop.  Control jumps to the top of the loop,\nwhich generally causes re-evaluation of a tandis que    or processing the next element of a\npour.",". nom de fichier","Read the contents of the named file into the current shell and execute as if in line.  Uses $PATH\nto locate the file, and can be passed positional parameters.  This is often used to read in shell\nfunctions that are common to multiple scripts.  There are security implications if the pathname is not\nfully specified.","( ... )    Command grouping","Commands grouped in &quot;( )&quot; are executed in a subshell, with a separate environment\n(can not affect the variables in the rest of the script).  \n(20)","As with most aspects of shell scripting, there are usually several possible ways to accomplish\na task.  Certain idioms show up commonly.  These are five ways to examine and branch on the\ninitial character of a string.","Utilisation Cas    with a pattern:","case $var in/*) echo &quot;starts with /&quot; ;; \nWorks in all shells, and uses no extra processes","Utilisation `cut`:","si [ \"`echo $var | cut -c1`\" = \"/\" ] ; puis .\nWorks in all shells, but inefficiently uses a pipe and external process for a trivial task.","Use POSIX variable truncation:","si [ \"$var%$var#?\" = \"/\" ]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Not obvious if you have not seen\nthis one before.  Fails on old Bourne shells.\nDave Taylor in &quot;Wicked Cool Shell Scripts&quot; likes this one.","Use POSIX  pattern match inside of [[&#8230;]]:","si [[ $var = /* ]]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Note that you must use [[&#8230;]]and no quotes around the pattern.","le [[&#8230;]]syntax is handled internally by the shell and can therefore interpret &quot;wildcard&quot; patterns\ndifferently than an external command.  An unquoted wildcard is interpreted as a pattern to be matched,\nwhile a quoted wildcard is taken literally. le [&#8230;] syntax, even if handled internally, is treated\nas though it were external for backward compatability.  This requires that wildcard patterns be expanded\nto matching filenames.","Use ksh (93 and later) and bash variable substrings:","si [ \"$var:0:1\" = \"/\" ]; puis\nksh93 and later versions, and bash, have a syntax for directly extracting substrings by character\nposition. $varname:start:length","Exemple: ex17 display, text\n(21)","The shells (ksh in particular) have many more internal commands.  Some are used more in interactive\nshells.  The commands listed here are used in scripts, but don&#39;t conveniently fit elsewhere in the\nclasse.","eval args","The args are read as input to the shell and the resulting command executed.  Allows &quot;double&quot; expansion\nof some constructs.  For example, constructing a variable name out of pieces, and then obtaining the value\nof that variable.","netdev=NETDEV_ \nNETDEV_1=hme0         # As part of an initialization step defining multiple devices","devnum=1              # As part of a loop over those devices\nifname=$netdev€devnum # construct a variable name NETDEV_1\neval device=$$ifname # evaluate it - device is set to hme0","exec command args","The command is executed au lieu de the current shell.  There is no return from an exec.\nI/O redirection may be used.  This is also used to change the I/O for the current shell.",":","The line is variable-expanded, but otherwise treated as a comment. parfois\nused as a synonym for &quot;true&quot; in a loop.","while :; faire\n  # this loop will go forever until broken by \n  # a conditional test inside, or a signal\nterminé","unset var ...","Remove the named variables.  This is not the same as setting their values to null.","composer [+/- options]    [[[[prénom[=[=[=[=valeur]]...    (ksh only,\nbash uses déclarer    for similar functions)","Set attributes and values for shell variables and functions.  When used inside a function, a local\nvariable is created.  Some of the options are:","-L[n]","Left justify and remove leading blanks.  The variable always has length n if specified.","-R[n]","Right justify and fill with leading blanks. The variable always has length n if specified.","-l","The named variable is always treated as an integer.  This makes arithmetic faster.  The reserved word\n entier    is an alias for typeset -i.","-Z[n]","As for -R, but fill with zeroes if the value is a number","-je","Lower-case convert the named variables","-u","Upper-case convert the named variables","-r","Mark the variables as readonly","-x","Export the named variables to the enviroment","-ft","The variables are taken as function names.  Turn on execution tracing.","(22)","Text variables\nle modèle in the following uses the same wildcards as for filename matching.","$#var","returns the length of $var in characters","$var%pattern","removes the shortest suffix of $var patching modèle","$var%%pattern","removes the longest suffix of $var patching modèle","$var#pattern","removes the shortest prefix of $var patching modèle","$var##pattern","removes the longest prefix of $var patching modèle","Numeric variables","$((  integer expression  ))","The $(( &#8230; )) construction interprets the contents as an arithmetic\nexpression (integer only).  Variables are referenced by name without the &quot;$&quot;.  Most of the arithmetic\nsyntax of the &#39;C&#39; language is supported, including bit manipulations\n (*,/,+,-,|,&amp;,&lt;&gt;. Use parentheses for changing precedence).","Exemples\ndatapath=/data/public/project/trials/set1/datafile.dat","filename=$datapath##*/","nom de fichier    is set to &quot;datafile.dat&quot; since the longest préfixe\npattern matching &quot;*/&quot; is the\nleading directory path (compare basename)","path=$datapath%/*","chemin    is set to &quot;/data/public/project/trials/set1&quot; since the shortest suffixe\npattern matching &quot;/*&quot; is the\nfilename in the last directory (compare dirname)","i=$((i+1))","often used in tandis que    boucles","(23)","All but the earliest versions of sh    allow you define shell functions, which are visible only\nto the shell script and can be used like any other command.  Shell functions take precedence over\nexternal commands if the same name is used.  Functions execute in the same process as the caller,\nand must be defined before use (appear earlier in the file).  They allow a script to be broken\ninto maintainable chunks, and encourage code reuse between scripts.\nDefining functions","identifiant()  liste;","POSIX syntax for shell functions.  Such functions do not restrict scope of variables\nor signal traps.\nThe identifier follows the rules for variable names,\nbut uses a separate namespace.","une fonction identifiant  liste;","Ksh and bash optional syntax for defining a function.  These functions may define local\nvariables and local signal\ntraps and so can more easily avoid side effects and be reused by multiple scripts.","A function may read or modify any shell variable that exists in the calling script.  Such variables\nsont global.","(ksh and bash only) Functions may also declare local variables in the function using composer    ou\ndéclarer.\nLocal variables are visible to the current function and any functions called by it.","revenir [n], sortie [n]","Return from a function with the given value, or exit the whole script with the given value.","Sans un revenir, the function returns when it reaches the end, and the value is the\nexit status of the last command it ran.","Exemple:","die()","   # Print an error message and exit with given status\n   # call as: die status &quot;message&quot; [\"message\" ...]\n   exitstat=$1; décalage\n   for i in &quot;$@&quot;; faire\n      print -R &quot;$i&quot;\n   terminé\n   exit $exitstat","Calling functions.\nFunctions are called like any other command.  The output may be redirected independantly of the\nscript, and arguments passed to the function.  Shell option flags like -x are unset in a function &#8211; you\nmust explicitly set them in each function to trace the execution.  Shell functions may even be backgrounded\nand run asynchronously, or run as coprocesses (ksh).","Exemple:","[ -w $filename ]    || \n  die 1 &quot;$file not writeable&quot; &quot;check permissions&quot;","Exemple: Backgrounded function call. ex12 display, text","1: #!/bin/sh\n            2: \n            3: background()\n   4: \n   5:    sleep 10\n   6:    écho &quot;Background&quot;\n   7:    sleep 10\n   8:    # Function will return here - if backgrounded, the subprocess will exit.\n            9: \n  10: \n        11: écho &quot;ps before background function&quot;\n  12: ps\n  13: background &amp;\n  14: écho &quot;My PID=$$&quot;\n  15: écho &quot;Background function PID=$!&quot;\n  16: écho &quot;ps after background function&quot;\n  17: ps\n  18: sortie 0","Exemple:","vprint()","   # Print or not depending on global &quot;$verbosity&quot;\n   # Change the verbosity with a single variable.\n   # Arg. 1 is the level for this message.\n   level=$1; décalage\n   si [[ $level -le $verbosity ]]; puis\n      print -R $*\n   fi","verbosity=2\nvprint 1 This message will appear\nvprint 3 This only appears if verbosity is 3 or higher","Reuseable functions\nBy using only command line arguments, not global variables, and taking care to minimise the side\neffects of functions, they can be made reusable by multiple scripts.  Typically they would be\nplaced in a separate file and read with the &quot;.&quot; operator.","Functions may generate output to stdout, stderr, or any other file or filehandle.  Messages to stdout\nmay be captured by command substitution (`myfunction`, which provides another way for a function to\nreturn information to the calling script.  Beware of side-effects (and reducing reusability)\nin functions which perform I/O.\n(24)","Unix I/O is performed by assigning file descriptors to files or devices, and then\nusing those descriptors for reading and writing.  Descriptors 0, 1, and 2 are always\nused for stdin, stdout and stderr respectively.  Stdin defaults to the keyboard,\nwhile stdout and stderr both default to the current terminal window.\nRedirecting for the whole script\nRedirecting stdout, stderr and other file descriptors for the whole script\ncan be done with the exec    commander.","exec     &gt; outfile &lt; infile \n \nwith no command, the exec    just reassigns the I/O of the current shell.\n \nexec n&gt;outfile\n \nThe form n opens file descriptor n instead of the default stdin/stdout.\nThis can then be used with read -u    ou print -u.","Explicitly opening or duplicating file descriptors\nOne reason to do this is to save the current\nstate of stdin/stdout, temporarily reassign them, then restore them.","&gt;&amp;n\n \nstandard output is moved to whatever file descriptor n is currently pointing to\n \n&lt;&amp;n\n \nstandard input is moved to whatever file descriptor n is currently pointing to\n \nn&gt;fichier\n \nfile descriptor n is opened for writing on the named fichier.\n \nn&gt;&amp;1\n \nfile descriptor n is set to whatever file descriptor 1 is currently pointing to.","Exemple Sending messages to stderr (2) instead of stdout (1)","echo &quot;Error: program failed&quot; &gt;&amp;2","Echo always writes to stdout, but stdout can be temporarily reassigned to duplicate stderr (or other file\ndescriptors).\nConventionally Unix programs send error messages to stderr to keep them separated from stdout.\nInput and output to open file descriptors (ksh)\nPrinting to file descriptors (usually more efficient than open/append/close):","impression     -u n args\n \nprint to file descriptor n.\n \n-p\n \nwrite to the pipe to a coprocess (opened by |&amp;)","Reading from file descriptors other than stdin:","lis     -u n var1 var2 rest\n \nread a line from file descriptor n, parsing by $IFS, and placing the words into\nthe named variables.  Any left over words all go into the last variable.\n \n-p\n \nread from the pipe to a coprocess (opened by |&amp;)","Closing file handles","&lt;&amp;-\n \nstandard input is explicitly closed\n \n&gt;&amp;-\n \nstandard output is explicitly closed","For example, to indicate to another program downstream in a pipeline that no more\ndata will be coming.  All file descriptors are closed when a script exits.","I/O redirection operators are evaluated left-to-right.  This makes a difference in a\nstatement like:\n&quot;&gt;filename 2&gt;&amp;1&quot;.  (Many books with example scripts get this wrong)\n&quot;Here&quot; documents","&lt;&amp;lt [-]chaîne","redirect input to the temporary file formed by everything up the matching chaîne\nat the start of a line.  Allows for placing file content inline in a script.","Exemple: ex5 display, text","1: #!/bin/sh\n            2: écho &quot;Example of unquoted here document, with variable and command substitution&quot;\n   3: \n            4: cat &lt;&lt;EOF\n   5:  This text will be fed to the &quot;cat&quot; program as \n   6:  standard input.  It will also have variable\n   7:  and command substitutions performed.\n   8:  I am logged in as $USER and today is `rendez-vous amoureux`\n   9: EOF\n  10: écho\n        11: écho &quot;Example of quoted here document, with no variable or command substitution&quot;\n  12: # The terminating string must be at the start of a line.\n        13: cat &lt;&lt;&quot;EndOfInput&quot;\n  14:  This text will be fed to the &quot;cat&quot; program as standard\n  15:  input.  Since the text string marking the end was quoted, it does not get \n  16:  variable and command subsitutions.\n  17:  I am logged in as $USER and today is `rendez-vous amoureux`\n  18: EndOfInput","Exemple: duplex display, text","1: #!/bin/sh\n            2: # Add in the magic postscript preface to perform\n            3: # duplex printer control for Xerox docuprint.\n            4: \n            5: # To have this script send the files directly to the printer, use \n            6: # a subshell to collect the output of the two &#39;cat&#39; commands.\n            7: \n            8: ## (\n            9: cat &lt;&lt; EOP\n  10: %!PS\n  11: %%BeginFeature: *Duplex DuplexTumble\n  12: &lt;&gt; setpagedevice\n  13: %%EndFeature\n  14: EOP\n  15: cat &quot;$@&quot;\n  16: ## ) | lpr","(25)","More complicated manipulations of file descriptors can be arranged.\nTwo such examples are shown here:","This short test script can be used to generate suitable output.ex13: display, text","echo &quot;This goes to stdout&quot;\necho &quot;This goes to stdout and has foo in the line&quot;\necho &quot;This goes to stderr&quot; &gt;&amp;2\nexit 99","Pass stderr of a command into a pipeline for further processing\nExemple: ex14 display, text","exec 3&gt;&amp;1 ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#39;s/stderr/STDERR/&#39; 1&gt;&amp;2","We duplicate stdout to another file descriptor (3), then run the first command with stderr redirected\nto stdout and stdout redirected to the saved descriptor (3). The result is piped into other commands\ncomme requis. The output of the pipeline is redirected back to stderr, so that stdout and stderr of the script\nas a whole are what we expect.","1: #!/bin/sh\n            2: # Example 14\n            3: # Take stderr from a command and pass it into a pipe\n            4: # for further processing.\n            5: \n            6: # Uses ex13.sh to generate some output to stderr\n            7: # stdout of ex13 is processed normally\n            8: \n            9: # Save a copy of original stdout\n        10: exec 3&gt;&amp;1\n  11: \n        12: # stdout from ex13.sh is directed to the original stdout (3)\n        13: # stderr is passed into the pipe for further processing.\n        14: # stdout from the pipe is redirected back to stderr\n        15: ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#39;s/stderr/STDERR/&#39; 1&gt;&amp;2\n  16: \n        17: # 3 is closed before running the command, just in case it cares\n        18: # about inheriting open file descriptors.","Capture the exit status of a command in the middle of a pipeline\nExemple: ex15 display, text","exec 3&gt;&amp;1     ex13stat=`((./ex13.sh; echo $? &gt;&amp;4) | grep &#39;foo&#39; 1&gt;&amp;3) 4&gt;&amp;1` \nThis script uses nested subshells captured in backtics.\nAgain we first duplicate stdout to another file descriptor (3).\nThe inner subshell runs the first command, then writes the exit status\nto fd 4.  The outer subshell redirects 4 to stdout so that it is\ncaptured by the backtics.  Standard output from the first command\n(inner subshell) is passed into the pipeline as normal, but the final output\nof the pipeline is redirected to 3 so that it appears on the original stdout\nand is not captured by the backtics.","If any of the commands really care about inheriting open file\ndescriptors that they don&#39;t need then a more correct command line\ncloses the descriptors before running the commands.","1: #!/bin/sh\n            2: # Example 15\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into $ex13stat.  \n            8: # stdout of ex13 is processed normally\n            9: \n        10: # Save a copy of stdout\n        11: exec 3&gt;&amp;1\n  12: # Run a subshell, with 4 duplicated to 1 so we get it in stdout.  \n        13: # Capture the output in ``\n        14: # ex13stat=`( ...  ) 4&gt;&amp;1`\n        15: # Inside the subshell, run another subshell to execute ex13, \n        16: # and echo the status code to 4\n        17: # (./ex13.sh; écho $? &gt;&amp;4)\n        18: # stdout from the inner subshell is processed normally, but the \n        19: # subsequent output must be directed to 3 so it goes to the \n        20: # original stdout and not be captured by the ``\n        21: ex13stat=`((./ex13.sh; écho $? &gt;&amp;4) | grep &#39;foo&#39; 1&gt;&amp;3) 4&gt;&amp;1`\n  22: \n        23: écho Last command status=$?\n  24: écho ex13stat=$ex13stat\n        25: \n        26: # If any of the commands really care about inheriting open file \n        27: # descriptors that they don&#39;t need then a more correct command line \n        28: # closes the descriptors before running the commands\n        29: exec 3&gt;&amp;1\n  30: ex13stat=`((./ex13.sh 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  31:    grep &#39;foo&#39;  1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  32: écho Last command status=$?\n  33: écho ex13stat=$ex13stat","Combine the above two techniques:","Exemple: ex16 display, text","exec 3&gt;&amp;1 ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; echo $? &gt;&amp;4) |          sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`","1: #!/bin/sh\n            2: # Example 16\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into ex13stat. \n            8: # stderr of ex13 is processed by the pipe, stdout\n            9: # is left alone.\n        10: \n        11: # Save a copy of stdout\n        12: exec 3&gt;&amp;1\n  13: \n        14: # Run a subshell, with 4 copied to 1 so we get it in stdout.  \n        15: # Capture the output in backtics`\n        16: # ex13stat=`(    ) 4&gt;&amp;1`\n        17: \n        18: # In the subshell, run another subshell to execute ex13, and \n        19: # echo the status code to 4\n        20: # (./ex13.sh; écho $? &gt;&amp;4)\n        21: \n        22: # stdout from the inner subshell is directed to the original stdout (3)\n        23: # stderr is passed into the pipe for further processing.\n        24: # stdout from the pipe is redirected back to stderr\n        25: \n        26: # Close the extra descriptors before running the commands\n        27: exec 3&gt;&amp;1\n  28: ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  29:   sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  30: \n        31: écho Last command status=$?\n  32: écho ex13stat=$ex13stat\n        33:","A practical application of this would be running a utility such as dd\nwhere the exit status is important to capture, but the error output is overly chatty and\nmay need to be filtered before delivering to other parts of a script.\n(26)","Scripts can start any number of background jobs (any external command),\nwhich run in parallel with the\nparent script, and asynchronously.  Processes which require no further interaction\nor synchronization (fire and forget) are easy.\nInteraction with background jobs is tricky. Vous pouvez\nuse signals, pipes, named pipes, or disk files for communication.","commander Et","Début commander as a background process.  Control returns immediately to the shell.","bgpid=$!","The special variable $!    contains the process ID of the last background job\nthat was started.  You can save that and examine the process later\n(ps -p $bgpid) or send it a signal (kill -HUP $bgpid).","ksh coprocesses\nCoprocesses are a way of starting a separate process which\nruns asychronously, but has stdin/stdout connected to the parent script via pipes.","commander |&amp;","Start a coprocess with a 2-way pipe to it","lis -p var","Read from the pipe to the coprocess, instead of standard input","impression -p args","Write to the pipe connected to the coprocess, instead of standard output","Multiple coprocesses can be handled by moving the special file descriptors connected\nto the pipes onto standard input and output, and or to explicitly specified file descriptors.","exec &lt;&amp;p","The input from the coprocess is moved to standard input","exec &gt;&amp;p","The output from the coprocess is moved to standard output","Exemple: ex9 display, textA script wants to save a copy of all output in a file, but also wants a copy\nà l&#39;écran. This is equivalent to always running the script asscénario | tee outfile","1: #!/bin/ksh\n            2: \n            3: # If we have not redirected standard output, save a copy of\n            4: # the output of this script into a file, but still send a\n            5: # copy to the screen.\n            6: \n            7: si [[ -t 1 ]]; puis\n            8:   # Only do this if fd 1 (stdout) is still connected\n            9:   # to a terminal\n        10: \n        11:   # We want the standard output of the &quot;tee&quot; process\n        12:   # to go explicitly to the screen (/dev/tty)\n        13:   # and the second copy goes into a logfile named $0.out\n        14: \n        15:   tee 0 $.out &gt;/dev/tty |&amp;\n  16: \n        17:   # Our stdout all goes into this coprocess\n        18:   exec 1&gt;&amp;p\n  19: fi\n        20: \n        21: # Now generate some output\n        22: impression &quot;User activity snapshot on $(hostname) at $(date)&quot;\n  23: impression\n        24: qui","Exemple: ex10 display, textStart a coprocess to look up usernames in some database.\nIt is faster to run a single process than to run a separate\nlookup for each user.","1: #!/bin/ksh\n            2: # This example uses a locally written tool for Dartmouth Name Directory lookups\n            3: \n            4: # Start the dndlookup program as a coprocess\n            5: # Tell it to output only the canonical full name, and to not print multiple matches\n            6: dndlookup -fname -u |&amp;\n   7: \n            8: # move the input/output streams so we \n            9: # can use other coprocesses too\n        10: exec 4&gt;&amp;p\n  11: exec 5&lt;&amp;p\n  12: \n        13: écho &quot;Name file contents:&quot;\n  14: cat namefile\n  15: écho\n        16: \n        17: # read the names from a file &quot;namefile&quot;\n        18: tandis que read uname; faire\n        19:   impression -u4 $uname\n        20:   lis  -u5 dndname\n  21:   Cas $dndname dans\n  22:   *many matches*)\n  23:     # handle case where the name wasn&#39;t unique\n        24:     impression &quot;Multiple matches to &quot;$uname&quot; in DND&quot;\n  25:     ;;\n  26:   *no match*)\n  27:     # handle case where the name wasn&#39;t found\n        28:     impression &quot;No matches to &quot;$uname&quot; in DND&quot;\n  29:     ;;\n  30:   *)\n  31:     # we seem to have a hit - process the\n        32:     # canonical named retrieved from dndlookup\n        33:     impression &quot;Unique DND match: full name for &quot;$uname&quot; is &quot;$dndname&quot;&quot;\n  34:     ;; \n  35:   esac\n        36:   sleep 2\n  37: terminé &lt; namefile\n  38: \n        39: # We&#39;ve read all the names, but the coprocess\n        40: # is still running.  Close the pipe to tell it\n        41: # we have finished.\n        42: exec 4&gt;&amp;-","(27)","Both ksh and bash implement arrays of variables, but in somewhat different ways.","ksh distinguishes between numerically indexed (small) arrays, and string indexed (associative) arrays.\nbash uses integers for all array indexing, but the integers need not be consecutive and unassigned array elements\ndo not exist.  Arrays must be declared before use, e,g. typeset -A myarray    (ksh associative array), or\ntypeset -a myarray    (bash).","Array elements are set with the syntax:\nmyarray[index]=value\nand referenced with the syntax $myarray[index]","This example shows use of an array indexed by IP addresses, as strings in ksh or as non-consecutive numbers in bash.\nIt also demonstrates use of getopt for options processing","Exemple: getauthlogs display, text","1: #! / bin / bash\n            2: # $Header: $\n            3: # First attempt at a consolidated auth log collection from kaserver\n            4: # Timestamps in the raw files are NOT designed for easy sorting.\n            5: #\n            6: # Options:\n            7: #  -i  -- translate hex IP addresses to dotted-decimal (relatively quick)\n            8: #  -h  -- translate hex IP addresses to DNS names (somewhat slower - DNS lookups)\n            9: #  -u user -- filter for the named user before translating addresses\n        10: \n        11: hextodec()\n  12: \n  13:    # convert the IP address in reverse-hex to dotted-decimal\n        14:    écho $((0x$1:6:2)).$((0x$1:4:2)).$((0x$1:2:2)).$((0x$1:0:2))\n        15: \n  16: \n        17: hostlookup()\n  18:  tr &#39;A-Z&#39; &#39;a-z&#39;\n  30:       ;;\n  31:    esac\n        32: \n  33: \n        34: # Options\n        35: iptranslate=0\n  36: gethostnames=0\n  37: filter=chat\n  38: tandis que getopts ihu: o ; faire\n        39:    Cas $o dans\n  40:    i) iptranslate=1 ;;\n  41:    h) gethostnames=1; iptranslate=1 ;;\n  42:    u) filter=&quot;grep $OPTARG&quot; ;;\n  43:    esac\n        44: terminé\n        45: décalage $(($OPTIND-1))\n        46: \n        47: # We could get the DB server names from &#39;fs checkservers&#39;, but it isn&#39;t obvious what is from our cell. nous\n        48: # could also grep CellServDB.  I cop out and hard code one known DB server and get the others from it.\n        49: masterserver=halley.dartmouth.edu\n  50: serverlist=$(bos listhosts -server $masterserver| grep &#39;Host .* is &#39; | awk &#39;print 4 $&#39;)\n  51: \n        52: # If we want to filter usernames, it is more efficient to do it inline, before sorting, translation and hostname lookups\n        53: \n        54: # Array to hold IP address/name conversions (associative array, ksh only)\n        55: # ksh - use -A for associative array.  bash - use -a and numeric array\n        56: composer -a hostnames\n  57: \n        58: (\n  59: pour dbserver in $serverlist; faire\n        60:    bos getlog -server $dbserver -file /usr/afs/logs/AuthLog\n  61: terminé\n        62: ) | grep -v &#39;Fetching log file&#39; | $filter | sed -e &#39;s/^... //&#39; -e &#39;s/  ([1-9]) / 01 /&#39; | sort --month-sort | \n  63:     sed &#39;-e s/ ([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])$/ 01/&#39; |\n  64:     tandis que read line; faire\n        65:    si [[[[[[[[$iptranslate == 1 ]]; puis\n        66:       # Ugly!\n        67:       # Sometimes we get a 7-digit hex code in the log - the kaserver apparently drops leading zeros.\n        68:       # The second &#39;sed&#39; in the pipe catches these are fixes them.\n        69:       Cas $line dans\n  70:       * from [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])\n  71:          # translate the reverse-hex address\n        72:          iphex=$line##* from \n        73:          # bash version - index by numeric value only, but can be sparse array -- use the raw IP \n        74:          ipdec=$((0x$iphex))\n        75:          frontpart=$line% from *\n        76:          si [[[[[[[[$gethostnames == 1 ]]; puis\n        77:             # ksh - index on hex value as a string (iphex)\n        78:             # bash - index on numeric value (ipdec)\n        79:             index=$ipdec\n        80:             si [[-z&quot;[[-z&quot;[[-z\"[[-z\"$hostnames[[[[$index]&quot; ]]; puis\n        81:                hostnames[[[[$index]=&quot;$(hostlookup $(hextodec $iphex))&quot; \n  82:             fi\n        83:             écho &quot;$frontpart de $hostnames[[[[$index]&quot;\n  84:          autre\n        85:             écho &quot;$frontpart from $(hextodec $iphex)&quot;\n  86:          fi\n        87:          ;;\n  88:       *)\n  89:          écho &quot;$line&quot;\n  90:          ;;\n  91:       esac\n        92:    autre\n        93:       # No ip translation, just echo the whole line\n        94:       écho &quot;$line&quot;\n  95:    fi   \n        96: terminé\n        97:","(28)","Unix signals (software interrupts) can be sent as asynchronous events to shell scripts, just\nas they can to any other program.  The default behaviour is to ignore some signals and immediately\nexit on others.  Scripts may detect signals and divert control to a handler function or external\nprogramme. This is often used to perform clean-up actions before exiting, or restart certain\nprocedures.  Execution resumes where it left off, if the signal handler returns.  Signal traps\nmust be set separately inside of shell functions.  Signals can be sent to a process with\ntuer.","piège gestionnaire sig ...","gestionnaire is a command to be read (evaluated first) and executed on receipt of\nle spécifié sigs. Signals can be specified by name or number (see kill(1))\npar exemple. HUP, INT, QUIT, TERM. A Ctrl-C at the terminal generates a INT.","A handler of -    resets the signals to their default values","A handler of &#39;&#39;    (null) ignores the signals","Special signal values are as follows:","EXIT","the handler is called when the function exits, or when the whole script exits. le\nexit signal has value 0.","ERR    (ksh)","the handler is called when any command has a non-zero exit status","DEBUG    (ksh)","the handler is called after chaque commander.","Exemple: ex8 display, text","1: #! / bin / bash\n            2: # Try this under bash, ksh and sh\n            3: \n            4: piège huphandler  HUP\n   5: piège &#39;&#39;          QUIT\n   6: piège exithandler TERM INT\n   7: \n            8: huphandler()\n   9: \n  10:    écho &#39;Received SIGHUP&#39;\n  11:    écho &quot;continuing&quot;\n  12: \n  13: \n        14: exithandler()\n  15: \n  16:    écho &#39;Received SIGTERM or SIGINT&#39;\n  17:    sortie 1\n  18: \n  19: ## Execution starts here - infinite loop until interrupted\n        20: # Use &quot;:&quot; or &quot;true&quot; for infinite loop\n        21: # SECONDS is built-in to bash and ksh.  It is number of seconds since script started\n        22: : is like a comment, but it is evaluated for side effects and evaluates to true\n  23: seconds=0\n  24: tandis que : ; faire\n        25: # while true; faire\n        26:    sleep 5\n  27:    seconds=$((seconds + 5))\n        28:    écho -n &quot;$SECONDS $seconds - &quot;\n  29: terminé","Exit handlers can be defined to clean up temporary files or reset the state of devices. Ce\ncan be useful if the script has multiple possible exit points.\n(29)","Shell scripts are often used by system administrators and are run as a priviledged user.","Don&#39;t use set-UID scripts.","Most systems don&#39;t even allow a script to be made set-UID.  It is\nimpossible (due to inherent race conditions) to ensure that a set-uid script cannot be compromised.\nUse wrapper programs like sudo    instead.","Always explicitly set $PATH    at the start of a script, so that you know exactly\nwhich external programs will be used.","If possible, don&#39;t use temporary files.  If they cannot be avoided, use $TMPDIR,\nand create files safely (e.g. mktemp).","Often scripts will write to a fixed, or trivially generated temporary filename in /tmp.  If the\nfile already exists and you don&#39;t have permission to overwrite it, the script will fail. Si vous\ndo have permission to overwrite it, you will delete the previous contents.  Since /tmp is public write,\nanother user may create files in it, or possibly fill it completely.\nExemple:","A link is created by an unprivileged user in /tmp:     /tmp/scratch  -&gt; /vmunix","A root user runs a script that blindly writes a scratch file to /tmp/scratch, and overwrites the\noperating system.","Environment variable $TMPDIR    is often used to indicate a preferred location for\ntemporary files (e.g., a per-user directory).  Some systems may use $TMP    ou $TEMP.\nSafe scratch files can be made by creating a new directory, owned\nand writeable only by you, then creating files in there.\nExemple:","(umask 077 &amp;&amp; mkdir /tmp/tempdir.$$) || exit 1","or (deluxe version)","tmp=$TMPDIR:-/tmp\ntmp=$tmp/tempdir.$RANDOM.$RANDOM.$RANDOM.$$\n(umask 077 &amp;&amp; mkdir $tmp) || \n    echo &quot;Could not create temporary directory&quot; 1&gt;&amp;2\n    exit 1","Alternatively, many systems have mktemp    to safely create a temporary file and return\nthe filename, which can be used by the script and then deleted.","Check exit status of everything you do.","Don&#39;t trust user input","contents of files\n  \ndata piped from other programs\n  \nfichier des noms. Output of filename generation with wildcards, or directly from\n     ls    ou trouver","Exemple:\nConsider the effects of a file named &quot;myfile;cd /;rm *&quot; if processed,\nunquoted, by your script.","One possible way to protect against weirdo characters in file names:","# A function to massage a list of filenames \n# to protect weirdo characters\n# e.g. find ... | protect_filenames | xargs command\n#\n# We are backslash-protecting the characters &#39;&quot; ?*;\nprotect_filenames()","   sed -es/\\\\/\\\\\\\\/g \n       -es/\\&#39;/\\\\&#39;/g   \n       -es/\\&quot;/\\\\&quot;/g   \n       -es/\\;/\\\\;/g   \n       -es/\\?/\\\\?/g   \n       -es/\\*/\\\\*/g   \n       -es/\\ /\\\\ /g","If using GNU trouver    et xargs, there is a much cleaner option\nto null-terminate generated pathnames.","(30)","Shell scripts are very frequently written quickly for a single purpose, used once and discarded.\nThey are also as frequently kept and used many times, and migrate into other uses, but often\ndo not receive the same level of testing and debugging that other software would be given\nin the same situation. Il est possible to apply general principles of good software\nengineering to shell scripts.","Preface scripts with a statement of purpose, author, date and revision notes","Use a revision control system for complex scripts with a long lifetime","Assume your script volonté have a long lifetime unless you are certain it won&#39;t","Document any non-standard external utilities which your script needs","Document your scripts with inline comments &#8211; you&#39;ll need them in a few months when you edit it.","Treat standard input and output in the normal way, so that your script can be used\nin combination with other programs (the Unix toolkit philosophy)","Be consistent in the format of your output, so that other programs can rely on it","Use options to control behaviour such as verbosity of output.  Overly chatty programs are\nvery hard to combine with other utilities","Use interactive features (prompting the user for information) très parcimonieusement.\nDoing so renders the script unuseable in pipeline combinations with other programs, or in unattended\noperations.","Test (a lot)","When not to use shell scripts","If an existing tool already does what you need &#8211; use it.","If the script is more than a few hundred lines, you are probably using the wrong tool.","If performance is horrible, and the script is used a lot, you might want to consider another language.","(31)","The class accounts have directories with all of the examples from the books by Blinn,\nMichael, Rosenblatt, and Taylor.  These can also be downloaded (see the References page).\nSome of these are linked below (but not included in the printed notes), with additional comments.","Download a compressed tar file of all example scripts used in these notes.","postprint display, textA wrapper script for printing a mix of text and postscript files","checkpath display,\ntexteCheck all the directories in the $PATH    for possibly conflicting programs.","run-with-timeout display,\ntexteRun a command with a timeout.  Kill the command if it hasn&#39;t finished when the timeout expires.","MailPkg display, textTar, compress, split and uuendcode a set of files for mailing. (Blinn)","Ptree (original) display, text\nPtree (ksh version) display, textRuns &quot;ps&quot; to get a process listing and then\nreformats to show the process family hierarchies.  The original example is pure Bourne shell\nand inefficient.  The ksh version is a fairly simple translation to use ksh internal commands\nwhere possible, and avoid writing scratch files,  and runs very much faster.  (Blinn).","This entire tutorial was created from individual HTML pages using a content management system written\nas ksh scripts (heavily using sed to edit the pages), coordinated by faire.\n&lt;! &#8211;","buildhtml afficher, texte\nTurns a stand-alone HTML file into a component of the tutorial, with navigation links and frames.\nbuildslidelist afficher, texte\nCreates the slide list which appears as the left frame of the tutorial.\nbuildframeset afficher, texte\nCreates a top level frameset to call the slide list and content pages.\nksh2html afficher, texte\nCreates the colourized HTML page of a shell script.\nMakefile texte\nMakefile used to build the site using the above tools","-&gt;","You can even write an entire web server as a shell script.  This one is part of the\nLEAF\n(Linux Embedded Appliance Firewall) project.  This wouldn&#39;t be suitable for much load, but handles occasional queries on\nstatic HTML and CGI scripts.\n(www.nisi.ab.ca/lrp/Packages/weblet.htm)","(32)","The following commands are very frequently used in shell scripts.  Many of them are used\nin the examples in these notes.  This is just a brief recap &#8212; see the man pages for details on usage.\nThe most useful are flagged with *.","Most of these commands will operate on a one or more named files, or will operate on a stream of\ndata from standard input if no files are named.\nListing, copying and moving files and directories","ls *","list contents of a directory, or list details of files and directories.","mkdir; rmdir *","Make and Remove directories.","rm; cp; mv *","Remove (delete), Copy and Move (rename) files and directories","toucher *","Update the last modifed timestamp on a file, to make it appear to have just been written.","If the file does not exist, a new zero-byte file is created, which is often useful to signify that\nan event has occurred.","tee","Make a duplicate copy of a data stream &#8211; used in pipelines to send one copy to a log file\nand a second copy on to another program.  (Think plumbing).","Displaying text, files or parts of files","écho *","Echo the arguments to standard output &#8212; used for messages from scripts.\nSome versions of &quot;sh&quot;, and all csh/ksh/bash shells internalized &quot;echo&quot;.","Conflicts\nsometimes arise over the syntax for echoing a line with no trailing CR/LF.\nSome use &quot;c&quot; and some use option &quot;-n&quot;.  To avoid these problems, ksh also provides the &quot;print&quot;\ncommand for output.","chat *","Copy and concatenate files; display contents of a file","tête, queue *","Display the beginning of a file, or the end of it.","Couper","Extract selected fields from each line of a file.  Often awk is easier to use, even though it is\na more complex program.","toilettes","Count lines, words and characters in the input.","Compression and archiving","compresse; gzip, Zip *: français; le goudron *","Various utilities to compress/uncompress individual files, combine multiple files into a single archive, or\ndo both.","Sorting and searching for patterns","Trier *","Sort data alphabetically or numerically.","grep *","Search a file for lines containing character patterns.  The patterns can be simple fixed text, or very complex\nregular expressions.","The name comes from &quot;Global Regular Expression and Print&quot; &#8212; a function from\nthe Unix editors which was used frequently enough to warrant getting its own program.","uniq *","Remove duplicate lines, and generate a count of repeated lines.","toilettes *","Count lines, words and characters in a file.","System information (users, processes, time)","rendez-vous amoureux *","Display the current date and time (flexible format).  Useful for conditional execution based on\ntime, and for timestamping output.","ps *","List the to a running processes.","tuer *","Send a signal (interrupt) to a running process.","identifiant","Print the user name and UID and group of the current user (e.g. to distinguish priviledged users before\nattempting to run programs which may fail with permission errors)","qui","Display who is logged on the system, and from where they logged in.","uname *","Display information about the system, OS version, hardware architecture etc.","courrier *","Send mail, from a file or standard input, to named recipients.  Since scripts are often used to automate\nlong-running background jobs, sending notification of completion by mail is a common trick.","enregistreur","Place a message in the central system logging facility.  Scripts can submit messages\nwith all the facilities available to compiled programs.","nom d&#39;hôte","Display the hostname of the current host &#8211; usful to keep track of where your programs are running","Conditional tests","tester; [[[[ *","The conditional test, used extensively in scripts, is also an external program which evaluates\nthe expression given as an argument and returns true (0) or false (1) exit status.  The name &quot;[&quot; is a\nlink to the &quot;test&quot; program, so a line like:si [ -w logfile ] actually runs a program &quot;[« , with arguments « -w logfile ]&quot;, and returns a true/false value to the &quot;if&quot;\ncommander.","In ksh and most newer versions of sh, &quot;[&quot; is replaced with a compatible internal command, but the\nargument parsing is performed as if it were an external command.\nKsh also provides the internal &quot;[[&quot; operator, with simplified syntax.","Stream Editing","awk *","A pattern matching and data manipulation utility, which has its own scripting language.  It also duplicates\nmuch functionality from &#39;sed&#39;,&#39;grep&#39;,&#39;cut&#39;,&#39;wc&#39;, etc.","Complex scripts can be written entirely using awk, but it is\nfrequently used just to extract fields from lines of a file (similar to &#39;cut&#39;).","sed *","Stream Editor.  A flexible editor which operates by applying editing rules to every line in a data stream\nin turn.","Since it makes a single pass through the file, keeping only a few lines in memory at once,\nit can be used with infinitely large data sets.  It is mostly used for global search and replace operations.\nIt is a superset of &#39;tr&#39;, &#39;grep&#39;, and &#39;cut&#39;, but is more complicated to use.","tr","Transliterate &#8211; perform very simple single-character edits on a file.","Finding and comparing files","trouver *","Search the filesystem and find files matching certain criteria (name pattern, age, owner, size,\nlast modified etc.)","xargs *","Apply multiple filename arguments to a named command and run it.","Xargs is often used in combination\nwith &quot;find&quot; to apply some command to all the files matching certain criteria.  Since &quot;find&quot; may result in a very\nlarge list of pathnames, using the results directly may overflow command line buffers.  Xargs avoids this problem,\nand is much more efficient than running a command on every pathname individually.","diff *","Compare two files and list the differences between them.","basename pathname","Returns the base filename portion of the named pathname, stripping off all the directories","dirname pathname","Returns the directory portion of the named pathname, stripping off the filename","Arithmetic and String Manipulation","expr *","The &quot;expr&quot; command takes an numeric or text pattern expression as an argument, evaluates it, and\nreturns a result to stdout.  The original Bourne shell had no built-in arithmetic operators.\nPar exemple.    expr 2 + 1      expr 2 &#39;*&#39; &#39;(&#39; 21 + 3 &#39;)&#39;  Used with text strings, &quot;expr&quot; can match regular expressions and extract sub expressions.  Similar functionality\ncan be achived with sed.\npar exemple.    expr SP99302L.Z00 : &#39;[A-Z0-9]4\\([0-9]3\\)L.*&#39;","dc","Desk Calculator &#8211; an RPN calculator, using arbitrary precision arithmetic and\nuser-specified bases.  Useful for more complex arithmetic expressions than can be performed\ninternally or using expr","avant JC","A preprocessor for dc    which provides infix notation and a C-like syntax for\nexpressions and functions.","Merging files","coller","Merge lines from multiple files into tab-delimited columns.","joindre","Perform a join (in the relational database sense) of lines in two sorted input files.","(33)","The standard man pages for sh    et ksh    are quite complete, but not easy to\nlearn from.  The following is a sampling of the many available books on the subject.  The Bolsky and Korn\nbook might be viewed as the standard &quot;reference&quot;.  The Blinn book is Bourne shell, but everything in it should\nwork for either shell.The links are to publisher&#39;s web sites, or Amazon.com. Some links are also given to the example\nscripts provided with the books.\nLivres","The New KornShell Command And Programming Language, by Morris I. Bolsky, David G. Korn (Contributor).","Plus d&#39;informations\nLearning the Korn Shell, 2nd Edn. by Bill Rosenblatt and Arnold Robbins.","Plus d&#39;informations\nKorn Shell Programming by Example, by Dennis O&#39;Brien, David Pitts (Contributor).","Plus d&#39;informations\nThe Korn Shell Linux and Unix Programming Manual (2nd Edn) by Anatole Olczak.","Plus d&#39;informations\nPortable Shell Programming: An Extensive Collection of Bourne Shell Examples by Bruce Blinn.","Plus d&#39;informationsExamples from this book can be downloaded for study.\nLinux Shell Scripting with Bash by Ken O. Burtch.","Plus d&#39;informations\nUnix Shell Programming by Stephen Kochan and Patrick Wood (third Edition).","Plus d&#39;informations\nTeach yourself Shell Programming in 24 Hours,\nby S. Veeraraghavan. SAMS 2nd Edn. (2002)\nPlus d&#39;informations","Mastering Unix Shell Scripting\nby Randal K. Michael, Wiley (2003)\nPlus d&#39;informations\nLight on basics, but develops scripting through examples. Ksh only.\nExamples can be\ntéléchargé\nfrom the Wiley site (www.wiley.com/legacy/compbooks/michael/).","Wicked Cool Shell Scripts\nby Dave Taylor, No Starch Press (2004)\nPlus d&#39;informations\nDevelops scripting entirely through examples, drawn from Linux and OSX in addition to traditional Unix.\nRecommended, but not for beginners.\nExamples can be\ntéléchargé\nfrom the Intuitive site (www.intuitive.com/wicked/wicked-cool-shell-script-library.shtml).","Unix Power Tools, by S. Powers, J. Peek, T. O&#39;Reilly, M. Loudikes et al.","Plus d&#39;informations","Online Resources","Shelldorado (http://www.shelldorado.com)Lots of links to scripting resources","Kornshell (http://www.kornshell.com)The official Korn shell home page, with download links.","Mac OSX Unix tutorial (http://www.osxfaq.com/Tutorials/LearningCenter/)Good resource on advanced use of OSX and Unix shell scripting in general","Unix-like shells and utilities for Microsoft Windows","U/Win (http://www.research.att.com/sw/tools/uwin/)\nA free port of ksh and Unix command line utilities, plus Windows DLL for Unix compatability. Developed by AT&amp;T Research.","Cygwin (http://www.cygwin.com/)\nA free Linux-like environment for Windows. Provides bash, command line utilities and DLLs. Developed by RedHat. Un\nX server is also available.","MKS Toolkit (http://www.mkssoftware.com/)\nA commercial ksh clone and command line utilities, plus DLL for Unix compatability.  An X server is also available.","Microsoft Services for UNIX (http://www.microsoft.com/windows/sfu/)\nA POSIX environment for Windows, with ksh, csh, command line tools, libraries and software development tools.\nDeveloped by Interix and bought by Microsoft.  Free download.","Unix shell scripting with ksh/bash: Course Handout[an error occurred while processing this directive]","(last update   22 March 2012)  ©Dartmouth College\n    http://www.dartmouth.edu/~rc/classes/ksh","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Script shell Unix avec ksh / bash\n    Document du cours: (dernière mise à jour le 22 mars 2012) \nCes notes sont disponibles sur http://www.dartmouth.edu/~rc/classes/ksh. La version en ligne contient de nombreux liens vers des informations supplémentaires et peut être plus à jour que les notes imprimées.","html":"<p>Script shell Unix avec ksh / bash\n    Document du cours: (dernière mise à jour le 22 mars 2012) \nCes notes sont disponibles sur http://www.dartmouth.edu/~rc/classes/ksh. La version en ligne contient de nombreux liens vers des informations supplémentaires et peut être plus à jour que les notes imprimées.</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"Les objectifs de cette classe sont de vous permettre de:","html":"<p>Les objectifs de cette classe sont de vous permettre de:</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"Découvrez quels types de problèmes conviennent aux scripts shell","html":"<p>Découvrez quels types de problèmes conviennent aux scripts shell</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"Passez en revue les commandes Unix les plus couramment utilisées et utiles dans les scripts de shell.","html":"<p>Passez en revue les commandes Unix les plus couramment utilisées et utiles dans les scripts de shell.</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"Écrire des scripts shell simples en utilisant les shells Bourne, Korn ou Bash","html":"<p>Écrire des scripts shell simples en utilisant les shells Bourne, Korn ou Bash</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"Ces notes sont destinées à être utilisées dans un cours en deux parties, d’une durée totale de 3 heures.","html":"<p>Ces notes sont destinées à être utilisées dans un cours en deux parties, d’une durée totale de 3 heures.</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"Hypothèses:On suppose que vous savez déjà comment:","html":"<p>Hypothèses:On suppose que vous savez déjà comment:</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"connectez-vous et obtenez une fenêtre de ligne de commande (n&#39;importe quel shell)","html":"<p>connectez-vous et obtenez une fenêtre de ligne de commande (n&#039;importe quel shell)</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"exécuter des commandes de base, naviguer dans les répertoires","html":"<p>exécuter des commandes de base, naviguer dans les répertoires</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"utiliser une redirection simple d&#39;E / S et des tubes","html":"<p>utiliser une redirection simple d&#039;E / S et des tubes</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"utiliser un éditeur de texte (n&#39;importe lequel)","html":"<p>utiliser un éditeur de texte (n&#039;importe lequel)</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"recherche des détails sur l&#39;utilisation des commandes dans les pages de manuel","html":"<p>recherche des détails sur l&#039;utilisation des commandes dans les pages de manuel</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"Des exemples de commandes sont affichés comme ça. Beaucoup de commandes\nsont affichés avec des liens vers leurs pages de manuel complètes\n(sh)La sortie des commandes est affichée comme ça;\nles éléments optionnels sont [ in brackets ].","html":"<p>Des exemples de commandes sont affichés comme ça. Beaucoup de commandes\nsont affichés avec des liens vers leurs pages de manuel complètes\n(sh)La sortie des commandes est affichée comme ça;\nles éléments optionnels sont [ in brackets ].</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"Certaines descriptions dans ces notes ont plus de détails disponibles,\net sont notés comme ceci:","html":"<p>Certaines descriptions dans ces notes ont plus de détails disponibles,\net sont notés comme ceci:</p>"},{"id":"text-15","type":"text","heading":"","plain_text":"Plus de détails sur cet article apparaissent ici. Les notes imprimées\ninclure toutes les informations supplémentaires","html":"<p>Plus de détails sur cet article apparaissent ici. Les notes imprimées\ninclure toutes les informations supplémentaires</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"La permission est donnée de télécharger et d’utiliser ces notes et exemples de scripts, à condition que\ntous les avis de droits d&#39;auteur sont conservés intacts. Certains exemples sont tirés de textes\nou des ressources en ligne qui ont autorisé la redistribution.","html":"<p>La permission est donnée de télécharger et d’utiliser ces notes et exemples de scripts, à condition que\ntous les avis de droits d&#039;auteur sont conservés intacts. Certains exemples sont tirés de textes\nou des ressources en ligne qui ont autorisé la redistribution.</p>"},{"id":"text-17","type":"text","heading":"","plain_text":"Ces notes sont mises à jour de temps en temps. Le développement&quot;\nensemble de notes sont\n http://northstar-www.dartmouth.edu/~richard/classes/ksh\n(Dartmouth seulement)","html":"<p>Ces notes sont mises à jour de temps en temps. Le développement&quot;\nensemble de notes sont\n http://northstar-www.dartmouth.edu/~richard/classes/ksh\n(Dartmouth seulement)</p>"},{"id":"text-18","type":"text","heading":"","plain_text":"Richard Brittain, Services informatiques du Dartmouth College.\n© 2003,2004,2010 Dartmouth College.\nCommentaires et questions, contactez Richard.Brittain @ dartmouth.edu","html":"<p>Richard Brittain, Services informatiques du Dartmouth College.\n© 2003,2004,2010 Dartmouth College.\nCommentaires et questions, contactez Richard.Brittain @ dartmouth.edu</p>"},{"id":"text-19","type":"text","heading":"","plain_text":"Table des matières\n(1)","html":"<p>Table des matières\n(1)</p>"},{"id":"text-20","type":"text","heading":"","plain_text":"Un fichier texte contenant des commandes qui auraient pu être saisies directement dans le shell.","html":"<p>Un fichier texte contenant des commandes qui auraient pu être saisies directement dans le shell.</p>"},{"id":"text-21","type":"text","heading":"","plain_text":"Il n&#39;y a pas de différence de syntaxe entre l&#39;utilisation interactive de la ligne de commande et le placement des commandes\ndans un fichier. Certaines commandes ne sont utiles que lorsqu&#39;elles sont utilisées de manière interactive (par exemple, rappel de l&#39;historique en ligne de commande).\net les autres commandes sont trop complexes pour pouvoir être utilisées de manière interactive.","html":"<p>Il n&#039;y a pas de différence de syntaxe entre l&#039;utilisation interactive de la ligne de commande et le placement des commandes\ndans un fichier. Certaines commandes ne sont utiles que lorsqu&#039;elles sont utilisées de manière interactive (par exemple, rappel de l&#039;historique en ligne de commande).\net les autres commandes sont trop complexes pour pouvoir être utilisées de manière interactive.</p>"},{"id":"text-22","type":"text","heading":"","plain_text":"Le shell lui-même a des capacités limitées &#8211; le pouvoir provient de son utilisation comme &quot;colle&quot;\nlangue pour combiner les utilitaires Unix standard et un logiciel personnalisé, pour produire un outil\nplus utile que les composants seuls.","html":"<p>Le shell lui-même a des capacités limitées &#8211; le pouvoir provient de son utilisation comme &quot;colle&quot;\nlangue pour combiner les utilitaires Unix standard et un logiciel personnalisé, pour produire un outil\nplus utile que les composants seuls.</p>"},{"id":"text-23","type":"text","heading":"","plain_text":"Tout shell peut être utilisé pour écrire un script shell. Pour permettre cela, la première ligne de chaque script\nest:#! / chemin / vers / shell        (par exemple. #! / bin / ksh).","html":"<p>Tout shell peut être utilisé pour écrire un script shell. Pour permettre cela, la première ligne de chaque script\nest:#! / chemin / vers / shell        (par exemple. #! / bin / ksh).</p>"},{"id":"text-24","type":"text","heading":"","plain_text":"le #!    les caractères indiquent au système de localiser le chemin suivant, de le démarrer et de\nalimentez le reste du fichier en entrée.\nTout programme capable de lire les commandes d’un fichier peut être démarré de cette manière, à condition que\nreconnaît le #    convention de commentaires. Le programme est lancé, puis le fichier de script\nest donné comme argument. Pour cette raison, le script doit être lisible et exécutable.\nLes exemples sont perl, awk, tcl et python.","html":"<p>le #!    les caractères indiquent au système de localiser le chemin suivant, de le démarrer et de\nalimentez le reste du fichier en entrée.\nTout programme capable de lire les commandes d’un fichier peut être démarré de cette manière, à condition que\nreconnaît le #    convention de commentaires. Le programme est lancé, puis le fichier de script\nest donné comme argument. Pour cette raison, le script doit être lisible et exécutable.\nLes exemples sont perl, awk, tcl et python.</p>"},{"id":"text-25","type":"text","heading":"","plain_text":"Tout fichier peut être utilisé comme entrée dans un shell en utilisant la syntaxe suivante:ksh myscript","html":"<p>Tout fichier peut être utilisé comme entrée dans un shell en utilisant la syntaxe suivante:ksh myscript</p>"},{"id":"text-26","type":"text","heading":"","plain_text":"Si le fichier est rendu exécutable avec chmod, cela devient une nouvelle commande\net disponible pour utilisation (sujet à la recherche habituelle de $ PATH).chmod + x myscript","html":"<p>Si le fichier est rendu exécutable avec chmod, cela devient une nouvelle commande\net disponible pour utilisation (sujet à la recherche habituelle de $ PATH).chmod + x myscript</p>"},{"id":"text-27","type":"text","heading":"","plain_text":"Un script shell peut être aussi simple qu&#39;une séquence de commandes que vous tapez régulièrement. En mettant\nles dans un script, vous les réduisez à une seule commande.","html":"<p>Un script shell peut être aussi simple qu&#039;une séquence de commandes que vous tapez régulièrement. En mettant\nles dans un script, vous les réduisez à une seule commande.</p>"},{"id":"text-28","type":"text","heading":"","plain_text":"Exemple: ex0 affichage, texte","html":"<p>Exemple: ex0 affichage, texte</p>"},{"id":"text-29","type":"text","heading":"","plain_text":"1: #! / bin / sh\n            2: rendez-vous amoureux\n   3: pwd\n            4: du -k","html":"<p>1: #! / bin / sh\n            2: rendez-vous amoureux\n   3: pwd\n            4: du -k</p>"},{"id":"text-30","type":"text","heading":"","plain_text":"(2)","html":"<p>(2)</p>"},{"id":"text-31","type":"text","heading":"","plain_text":"Combinez des séquences de commandes longues et répétitives en une seule commande simple.","html":"<p>Combinez des séquences de commandes longues et répétitives en une seule commande simple.</p>"},{"id":"text-32","type":"text","heading":"","plain_text":"Généraliser une séquence d&#39;opérations sur un ensemble de données, en une procédure pouvant être\nappliqué à tout ensemble similaire de données.\n  \n(par exemple.\nappliquer la même analyse à chaque fichier de données sur un CD, sans avoir à répéter les commandes)","html":"<p>Généraliser une séquence d&#039;opérations sur un ensemble de données, en une procédure pouvant être\nappliqué à tout ensemble similaire de données.\n  \n(par exemple.\nappliquer la même analyse à chaque fichier de données sur un CD, sans avoir à répéter les commandes)</p>"},{"id":"text-33","type":"text","heading":"","plain_text":"Créer de nouvelles commandes en utilisant des combinaisons d’utilitaires comme les auteurs originaux\njamais pensé à.","html":"<p>Créer de nouvelles commandes en utilisant des combinaisons d’utilitaires comme les auteurs originaux\njamais pensé à.</p>"},{"id":"text-34","type":"text","heading":"","plain_text":"Des scripts shell simples peuvent être écrits sous la forme d&#39;alias shell, mais le script peut être mis à la disposition de tous les utilisateurs.\net tous les processus. Les alias de shell s&#39;appliquent uniquement au shell actuel.","html":"<p>Des scripts shell simples peuvent être écrits sous la forme d&#039;alias shell, mais le script peut être mis à la disposition de tous les utilisateurs.\net tous les processus. Les alias de shell s&#039;appliquent uniquement au shell actuel.</p>"},{"id":"text-35","type":"text","heading":"","plain_text":"Enveloppez les programmes sur lesquels vous n&#39;avez aucun contrôle dans un environnement que vous pouvez contrôler.","html":"<p>Enveloppez les programmes sur lesquels vous n&#039;avez aucun contrôle dans un environnement que vous pouvez contrôler.</p>"},{"id":"text-36","type":"text","heading":"","plain_text":"par exemple. définir des variables d&#39;environnement, basculer vers un répertoire spécial, créer ou sélectionner un fichier de configuration,\nredirigez la sortie, enregistrez l’utilisation, puis exécutez le programme.","html":"<p>par exemple. définir des variables d&#039;environnement, basculer vers un répertoire spécial, créer ou sélectionner un fichier de configuration,\nredirigez la sortie, enregistrez l’utilisation, puis exécutez le programme.</p>"},{"id":"text-37","type":"text","heading":"","plain_text":"Créez des jeux de données personnalisés à la volée et appelez des applications (par exemple, matlab, sas, idl, gnuplot) pour fonctionner\nsur eux, ou créer des commandes / procédures d’application personnalisées.","html":"<p>Créez des jeux de données personnalisés à la volée et appelez des applications (par exemple, matlab, sas, idl, gnuplot) pour fonctionner\nsur eux, ou créer des commandes / procédures d’application personnalisées.</p>"},{"id":"text-38","type":"text","heading":"","plain_text":"Prototypage rapide (mais évitez de laisser les prototypes devenir production)","html":"<p>Prototypage rapide (mais évitez de laisser les prototypes devenir production)</p>"},{"id":"text-39","type":"text","heading":"","plain_text":"Utilisations typiques","html":"<p>Utilisations typiques</p>"},{"id":"text-40","type":"text","heading":"","plain_text":"Scripts de démarrage du système (/etc/init.d)","html":"<p>Scripts de démarrage du système (/etc/init.d)</p>"},{"id":"text-41","type":"text","heading":"","plain_text":"Administrateurs système, pour automatiser de nombreux aspects de la maintenance informatique, compte utilisateur\ncréation etc.","html":"<p>Administrateurs système, pour automatiser de nombreux aspects de la maintenance informatique, compte utilisateur\ncréation etc.</p>"},{"id":"text-42","type":"text","heading":"","plain_text":"Outils d&#39;installation du package d&#39;application\n \nD&#39;autres outils peuvent créer des installateurs plus sophistiqués (par exemple, tcl / tk), mais ne peuvent pas être considérés comme déjà installés. Les scripts shell sont utilisés car ils sont très portables. Certains logiciels sont livrés avec une installation complète de l&#39;outil qu&#39;il veut utiliser\n(tcl / tk / python) pour être autonome, mais cela conduit à un gonflement logiciel.","html":"<p>Outils d&#039;installation du package d&#039;application\n \nD&#039;autres outils peuvent créer des installateurs plus sophistiqués (par exemple, tcl / tk), mais ne peuvent pas être considérés comme déjà installés. Les scripts shell sont utilisés car ils sont très portables. Certains logiciels sont livrés avec une installation complète de l&#039;outil qu&#039;il veut utiliser\n(tcl / tk / python) pour être autonome, mais cela conduit à un gonflement logiciel.</p>"},{"id":"text-43","type":"text","heading":"","plain_text":"Scripts de démarrage d&#39;application, en particulier\napplications sans surveillance (par exemple, à partir de cron    ou à)","html":"<p>Scripts de démarrage d&#039;application, en particulier\napplications sans surveillance (par exemple, à partir de cron    ou à)</p>"},{"id":"text-44","type":"text","heading":"","plain_text":"Tout utilisateur ayant besoin d&#39;automatiser le processus de configuration et d&#39;exécution d&#39;applications commerciales,\nou leur propre code.","html":"<p>Tout utilisateur ayant besoin d&#039;automatiser le processus de configuration et d&#039;exécution d&#039;applications commerciales,\nou leur propre code.</p>"},{"id":"text-45","type":"text","heading":"","plain_text":"AUTOMATISER, AUTOMATISER, AUTOMATISER\n(3)","html":"<p>AUTOMATISER, AUTOMATISER, AUTOMATISER\n(3)</p>"},{"id":"text-46","type":"text","heading":"","plain_text":"sh","html":"<p>sh</p>"},{"id":"text-47","type":"text","heading":"","plain_text":"&quot;Bourne&quot;, écrit par Steve Bourne chez AT &amp; T Bell Labs pour Unix V7 (1979).\nPetit, simple et (à l&#39;origine) très peu de commandes internes, donc il a appelé des programmes externes pour même le plus simple\ndes tâches. Il est toujours disponible sur tout ce qui ressemble vaguement à Unix.","html":"<p>&quot;Bourne&quot;, écrit par Steve Bourne chez AT &amp; T Bell Labs pour Unix V7 (1979).\nPetit, simple et (à l&#039;origine) très peu de commandes internes, donc il a appelé des programmes externes pour même le plus simple\ndes tâches. Il est toujours disponible sur tout ce qui ressemble vaguement à Unix.</p>"},{"id":"text-48","type":"text","heading":"","plain_text":"csh\nLa coquille &quot;C&quot;. (Bill Joy, à Berkeley).\nBeaucoup de choses en commun\navec le shell Bourne, mais de nombreuses améliorations pour améliorer l’utilisation interactive. L&#39;interne\nles commandes utilisées uniquement dans les scripts sont très différent de &quot;sh&quot;, et\nsimilaire (par conception) à la syntaxe du langage &quot;C&quot;.","html":"<p>csh\nLa coquille &quot;C&quot;. (Bill Joy, à Berkeley).\nBeaucoup de choses en commun\navec le shell Bourne, mais de nombreuses améliorations pour améliorer l’utilisation interactive. L&#039;interne\nles commandes utilisées uniquement dans les scripts sont très différent de &quot;sh&quot;, et\nsimilaire (par conception) à la syntaxe du langage &quot;C&quot;.</p>"},{"id":"text-49","type":"text","heading":"","plain_text":"tcsh\nLe shell &quot;TC&quot;. Librement disponible et basé sur &quot;csh&quot;.\nIl comporte de nombreuses fonctionnalités supplémentaires pour rendre l&#39;utilisation interactive plus pratique.","html":"<p>tcsh\nLe shell &quot;TC&quot;. Librement disponible et basé sur &quot;csh&quot;.\nIl comporte de nombreuses fonctionnalités supplémentaires pour rendre l&#039;utilisation interactive plus pratique.</p>"},{"id":"text-50","type":"text","heading":"","plain_text":"Nous l&#39;utilisons comme shell interactif par défaut pour les nouveaux comptes sur tous nos systèmes publics.\nPeu de gens écrivent des scripts dans\nVoir la programmation de Csh considérée comme nuisible par\nTom Christiansen pour une discussion sur les problèmes de programmation des scripts csh.","html":"<p>Nous l&#039;utilisons comme shell interactif par défaut pour les nouveaux comptes sur tous nos systèmes publics.\nPeu de gens écrivent des scripts dans\nVoir la programmation de Csh considérée comme nuisible par\nTom Christiansen pour une discussion sur les problèmes de programmation des scripts csh.</p>"},{"id":"text-51","type":"text","heading":"","plain_text":"ksh","html":"<p>ksh</p>"},{"id":"text-52","type":"text","heading":"","plain_text":"Le &quot;Korn&quot; shell, écrit par David Korn de AT &amp; T Bell Labs (maintenant AT &amp; T Research).\nÉcrit comme une mise à niveau majeure vers &quot;sh&quot; et une compatibilité ascendante avec celui-ci, mais possède de nombreuses commandes internes pour le\nfonctions les plus fréquemment utilisées. Il intègre également de nombreuses fonctionnalités de tcsh qui améliorent\nutilisation interactive (rappel de l&#39;historique de ligne de commande, etc.).","html":"<p>Le &quot;Korn&quot; shell, écrit par David Korn de AT &amp; T Bell Labs (maintenant AT &amp; T Research).\nÉcrit comme une mise à niveau majeure vers &quot;sh&quot; et une compatibilité ascendante avec celui-ci, mais possède de nombreuses commandes internes pour le\nfonctions les plus fréquemment utilisées. Il intègre également de nombreuses fonctionnalités de tcsh qui améliorent\nutilisation interactive (rappel de l&#039;historique de ligne de commande, etc.).</p>"},{"id":"text-53","type":"text","heading":"","plain_text":"L’acceptation a été lente, car les versions précédentes étaient grevées de licences AT &amp; T.\nCe shell est maintenant disponible gratuitement sur tous les systèmes, mais n&#39;est parfois pas installé par défaut sur Unix &quot;libre&quot;.\nIl existe deux versions principales. ksh88 était la version intégrée à AT &amp; T SVR4 Unix, et peut encore être installé\npar certains des vendeurs Unix commerciaux. ksh93 a ajouté plus de fonctionnalités, principalement pour la programmation, et une meilleure conformité POSIX.","html":"<p>L’acceptation a été lente, car les versions précédentes étaient grevées de licences AT &amp; T.\nCe shell est maintenant disponible gratuitement sur tous les systèmes, mais n&#039;est parfois pas installé par défaut sur Unix &quot;libre&quot;.\nIl existe deux versions principales. ksh88 était la version intégrée à AT &amp; T SVR4 Unix, et peut encore être installé\npar certains des vendeurs Unix commerciaux. ksh93 a ajouté plus de fonctionnalités, principalement pour la programmation, et une meilleure conformité POSIX.</p>"},{"id":"text-54","type":"text","heading":"","plain_text":"POSIX 1003.2 Standard Shell.","html":"<p>POSIX 1003.2 Standard Shell.</p>"},{"id":"text-55","type":"text","heading":"","plain_text":"Les comités de normalisation ont travaillé sur le shell Bourne et ont ajouté de nombreuses fonctionnalités au shell Korn (ksh88).\nC shell pour définir un ensemble standard de fonctionnalités que doivent posséder tous les shells conformes.","html":"<p>Les comités de normalisation ont travaillé sur le shell Bourne et ont ajouté de nombreuses fonctionnalités au shell Korn (ksh88).\nC shell pour définir un ensemble standard de fonctionnalités que doivent posséder tous les shells conformes.</p>"},{"id":"text-56","type":"text","heading":"","plain_text":"Sur la plupart des systèmes, / bin / sh est maintenant un shell compatible POSIX.\nKorn shell et Bash sont compatibles POSIX, mais possèdent de nombreuses fonctionnalités qui vont au-delà de la norme.\nSous Solaris, les commandes POSIX / XPG4 qui diffèrent\nlégèrement dans le comportement des commandes SunOS traditionnelles se trouvent dans / usr / xpg4 / bin","html":"<p>Sur la plupart des systèmes, / bin / sh est maintenant un shell compatible POSIX.\nKorn shell et Bash sont compatibles POSIX, mais possèdent de nombreuses fonctionnalités qui vont au-delà de la norme.\nSous Solaris, les commandes POSIX / XPG4 qui diffèrent\nlégèrement dans le comportement des commandes SunOS traditionnelles se trouvent dans / usr / xpg4 / bin</p>"},{"id":"text-57","type":"text","heading":"","plain_text":"frapper","html":"<p>frapper</p>"},{"id":"text-58","type":"text","heading":"","plain_text":"La coquille &quot;Bourne again&quot;. Ecrit dans le cadre de l’effort Open Source GNU / Linux et du shell par défaut pour Linux et\nMac OS X. C&#39;est un clone fonctionnel de sh, avec des fonctionnalités supplémentaires pour améliorer l&#39;utilisation interactive,\najouter la conformité POSIX et la compatibilité partielle de ksh.","html":"<p>La coquille &quot;Bourne again&quot;. Ecrit dans le cadre de l’effort Open Source GNU / Linux et du shell par défaut pour Linux et\nMac OS X. C&#039;est un clone fonctionnel de sh, avec des fonctionnalités supplémentaires pour améliorer l&#039;utilisation interactive,\najouter la conformité POSIX et la compatibilité partielle de ksh.</p>"},{"id":"text-59","type":"text","heading":"","plain_text":"zsh","html":"<p>zsh</p>"},{"id":"text-60","type":"text","heading":"","plain_text":"Un clone fonctionnel gratuit de sh, avec des éléments de ksh, bash et une conformité POSIX complète, et\nnombreuses nouvelles fonctionnalités d&#39;édition en ligne de commande interactives.\nIl a été installé en tant que shell par défaut sur les anciens systèmes MacOSX.","html":"<p>Un clone fonctionnel gratuit de sh, avec des éléments de ksh, bash et une conformité POSIX complète, et\nnombreuses nouvelles fonctionnalités d&#039;édition en ligne de commande interactives.\nIl a été installé en tant que shell par défaut sur les anciens systèmes MacOSX.</p>"},{"id":"text-61","type":"text","heading":"","plain_text":"(4)","html":"<p>(4)</p>"},{"id":"text-62","type":"text","heading":"","plain_text":"Tous les shells énumérés ci-dessus partagent certaines caractéristiques communes et les différences majeures de syntaxe.\ngénéralement, n&#39;affectent que les scénaristes. Ce n&#39;est pas inhabituel\nutiliser un shell (par exemple, tcsh) pour une utilisation interactive, mais un autre (sh ou ksh)\npour écrire des scripts.\nPrincipales similitudes (et récapitulation de l&#39;utilisation de base de la ligne de commande)\nChacun de ces éléments est traité plus en détail ultérieurement.","html":"<p>Tous les shells énumérés ci-dessus partagent certaines caractéristiques communes et les différences majeures de syntaxe.\ngénéralement, n&#039;affectent que les scénaristes. Ce n&#039;est pas inhabituel\nutiliser un shell (par exemple, tcsh) pour une utilisation interactive, mais un autre (sh ou ksh)\npour écrire des scripts.\nPrincipales similitudes (et récapitulation de l&#039;utilisation de base de la ligne de commande)\nChacun de ces éléments est traité plus en détail ultérieurement.</p>"},{"id":"text-63","type":"text","heading":"","plain_text":"Analyser les lignes par des espaces, rechercher des commandes externes à l&#39;aide de $ PATH.","html":"<p>Analyser les lignes par des espaces, rechercher des commandes externes à l&#039;aide de $ PATH.</p>"},{"id":"text-64","type":"text","heading":"","plain_text":"Peut exécuter un script shell en utilisant shellname scriptfile, ou exécuter un seul\n    commande en utilisant shellname -c &quot;commande&quot;","html":"<p>Peut exécuter un script shell en utilisant shellname scriptfile, ou exécuter un seul\n    commande en utilisant shellname -c &quot;commande&quot;</p>"},{"id":"text-65","type":"text","heading":"","plain_text":"Transmettez les arguments de ligne de commande développés aux programmes; récupérer le statut de sortie.","html":"<p>Transmettez les arguments de ligne de commande développés aux programmes; récupérer le statut de sortie.</p>"},{"id":"text-66","type":"text","heading":"","plain_text":"Passer des variables d&#39;environnement aux programmes.","html":"<p>Passer des variables d&#039;environnement aux programmes.</p>"},{"id":"text-67","type":"text","heading":"","plain_text":"Développez les jokers de nom de fichier en utilisant []*?. Chaque coquille a quelques autres\nmétacaractères génériques, mais ceux-ci sont communs à tous les shells.","html":"<p>Développez les jokers de nom de fichier en utilisant []*?. Chaque coquille a quelques autres\nmétacaractères génériques, mais ceux-ci sont communs à tous les shells.</p>"},{"id":"text-68","type":"text","heading":"","plain_text":"Redirection I / O standard et tuyauterie avec , &gt;&gt;, |","html":"<p>Redirection I / O standard et tuyauterie avec , &gt;&gt;, |</p>"},{"id":"text-69","type":"text","heading":"","plain_text":"Quelques fonctions internes (CD)","html":"<p>Quelques fonctions internes (CD)</p>"},{"id":"text-70","type":"text","heading":"","plain_text":"Commandes d&#39;arrière-plan avec Et","html":"<p>Commandes d&#039;arrière-plan avec Et</p>"},{"id":"text-71","type":"text","heading":"","plain_text":"Règles de cotation: les &quot;guillemets&quot; protègent la plupart des choses, mais permettent $ var    interprétation;\nLes &quot;guillemets simples&quot; protègent tous les métacaractères de l&#39;interprétation.","html":"<p>Règles de cotation: les &quot;guillemets&quot; protègent la plupart des choses, mais permettent $ var    interprétation;\nLes &quot;guillemets simples&quot; protègent tous les métacaractères de l&#039;interprétation.</p>"},{"id":"text-72","type":"text","heading":"","plain_text":"Extension du répertoire personnel à l&#39;aide de ~ utilisateur    (à l&#39;exception de sh)","html":"<p>Extension du répertoire personnel à l&#039;aide de ~ utilisateur    (à l&#039;exception de sh)</p>"},{"id":"text-73","type":"text","heading":"","plain_text":"#    commentaires","html":"<p>#    commentaires</p>"},{"id":"text-74","type":"text","heading":"","plain_text":"Substitution de commande en utilisant `commande`    (backtics)","html":"<p>Substitution de commande en utilisant `commande`    (backtics)</p>"},{"id":"text-75","type":"text","heading":"","plain_text":"Développez les variables en utilisant $ varname    syntaxe","html":"<p>Développez les variables en utilisant $ varname    syntaxe</p>"},{"id":"text-76","type":"text","heading":"","plain_text":"Exécution conditionnelle utilisant &amp;&amp;    et ||","html":"<p>Exécution conditionnelle utilisant &amp;&amp;    et ||</p>"},{"id":"text-77","type":"text","heading":"","plain_text":"Suite de ligne avec &quot;&quot;","html":"<p>Suite de ligne avec &quot;&quot;</p>"},{"id":"text-78","type":"text","heading":"","plain_text":"Principales différences\nentre sh (+ dérivés) et csh (+ dérivés).","html":"<p>Principales différences\nentre sh (+ dérivés) et csh (+ dérivés).</p>"},{"id":"text-79","type":"text","heading":"","plain_text":"Syntaxe de toutes les constructions de contrôle de flux et des tests conditionnels.","html":"<p>Syntaxe de toutes les constructions de contrôle de flux et des tests conditionnels.</p>"},{"id":"text-80","type":"text","heading":"","plain_text":"Syntaxe de manipulation des chaînes dans les scripts","html":"<p>Syntaxe de manipulation des chaînes dans les scripts</p>"},{"id":"text-81","type":"text","heading":"","plain_text":"Syntaxe pour la manipulation arithmétique à l&#39;intérieur des scripts","html":"<p>Syntaxe pour la manipulation arithmétique à l&#039;intérieur des scripts</p>"},{"id":"text-82","type":"text","heading":"","plain_text":"Syntaxe de définition des variables locales (utilisées uniquement dans le script) et des variables d’environnement\npassé aux processus enfants). setenv    contre exportation","html":"<p>Syntaxe de définition des variables locales (utilisées uniquement dans le script) et des variables d’environnement\npassé aux processus enfants). setenv    contre exportation</p>"},{"id":"text-83","type":"text","heading":"","plain_text":"Syntaxe de redirection des flux d&#39;E / S autres que stdin / stdout","html":"<p>Syntaxe de redirection des flux d&#039;E / S autres que stdin / stdout</p>"},{"id":"text-84","type":"text","heading":"","plain_text":"Fichiers de démarrage de connexion (.cshrc    et .s&#39;identifier, contre .profil) et les options par défaut","html":"<p>Fichiers de démarrage de connexion (.cshrc    et .s&#039;identifier, contre .profil) et les options par défaut</p>"},{"id":"text-85","type":"text","heading":"","plain_text":"Lecture d’autres scripts shell dans le shell actuel (nom de fichier source, contre . nom de fichier)","html":"<p>Lecture d’autres scripts shell dans le shell actuel (nom de fichier source, contre . nom de fichier)</p>"},{"id":"text-86","type":"text","heading":"","plain_text":"Traitement des signaux (interruptions)","html":"<p>Traitement des signaux (interruptions)</p>"},{"id":"text-87","type":"text","heading":"","plain_text":"(5)","html":"<p>(5)</p>"},{"id":"text-88","type":"text","heading":"","plain_text":"Il existe de nombreux autres programmes qui lisent un fichier de commandes et exécutent\nune séquence d&#39;actions. le &quot;#! / chemin / à / programme&quot;    convention\npermet à n&#39;importe lequel d&#39;entre eux d&#39;être utilisé comme langage de script pour créer de nouvelles commandes.\nCertains sont hautement spécialisés, et certains sont beaucoup plus efficaces que leurs équivalents\nscripts shell à certaines tâches. Il n&#39;y a jamais qu&#39;un seul moyen d&#39;effectuer une fonction,\net souvent, le choix dépend de facteurs tels que:","html":"<p>Il existe de nombreux autres programmes qui lisent un fichier de commandes et exécutent\nune séquence d&#039;actions. le &quot;#! / chemin / à / programme&quot;    convention\npermet à n&#039;importe lequel d&#039;entre eux d&#039;être utilisé comme langage de script pour créer de nouvelles commandes.\nCertains sont hautement spécialisés, et certains sont beaucoup plus efficaces que leurs équivalents\nscripts shell à certaines tâches. Il n&#039;y a jamais qu&#039;un seul moyen d&#039;effectuer une fonction,\net souvent, le choix dépend de facteurs tels que:</p>"},{"id":"text-89","type":"text","heading":"","plain_text":"ce qui est déjà installé &#8211; beaucoup d&#39;autres langages de script ne sont pas disponibles par défaut","html":"<p>ce qui est déjà installé &#8211; beaucoup d&#039;autres langages de script ne sont pas disponibles par défaut</p>"},{"id":"text-90","type":"text","heading":"","plain_text":"quel code similaire existe déjà","html":"<p>quel code similaire existe déjà</p>"},{"id":"text-91","type":"text","heading":"","plain_text":"ce que vous connaissez et pouvez utiliser de la manière la plus efficace.\nVotre temps est toujours plus coûteux que les cycles informatiques.","html":"<p>ce que vous connaissez et pouvez utiliser de la manière la plus efficace.\nVotre temps est toujours plus coûteux que les cycles informatiques.</p>"},{"id":"text-92","type":"text","heading":"","plain_text":"Certains des principaux acteurs (tous disponibles gratuitement) dans les langages de script à usage général sont:","html":"<p>Certains des principaux acteurs (tous disponibles gratuitement) dans les langages de script à usage général sont:</p>"},{"id":"text-93","type":"text","heading":"","plain_text":"awk","html":"<p>awk</p>"},{"id":"text-94","type":"text","heading":"","plain_text":"Un outil de correspondance de modèle et de manipulation de données (texte et numérique). Prédate perl. Installé sur\ntous les systèmes Unix. Souvent utilisé en combinaison avec des scripts shell.","html":"<p>Un outil de correspondance de modèle et de manipulation de données (texte et numérique). Prédate perl. Installé sur\ntous les systèmes Unix. Souvent utilisé en combinaison avec des scripts shell.</p>"},{"id":"text-95","type":"text","heading":"","plain_text":"perl","html":"<p>perl</p>"},{"id":"text-96","type":"text","heading":"","plain_text":"Le langage de script le plus utilisé pour les applications Web CGI et les tâches d&#39;administration système. Perl\nest plus difficile à apprendre et est généralement installé par défaut maintenant.\nIl est plus efficace et dispose d’une énorme bibliothèque de fonctions. Vous pouvez utiliser Perl pour\npresque toutes les tâches de script, mais la syntaxe est très différente de la ligne de commande du shell","html":"<p>Le langage de script le plus utilisé pour les applications Web CGI et les tâches d&#039;administration système. Perl\nest plus difficile à apprendre et est généralement installé par défaut maintenant.\nIl est plus efficace et dispose d’une énorme bibliothèque de fonctions. Vous pouvez utiliser Perl pour\npresque toutes les tâches de script, mais la syntaxe est très différente de la ligne de commande du shell</p>"},{"id":"text-97","type":"text","heading":"","plain_text":"python","html":"<p>python</p>"},{"id":"text-98","type":"text","heading":"","plain_text":"Un langage de script orienté objet. Communément installé par défaut sur les systèmes modernes.","html":"<p>Un langage de script orienté objet. Communément installé par défaut sur les systèmes modernes.</p>"},{"id":"text-99","type":"text","heading":"","plain_text":"tcl/tk","html":"<p>tcl/tk</p>"},{"id":"text-100","type":"text","heading":"","plain_text":"Langage de commande de l&#39;outil. Un autre langage de script à usage général. Le composant &quot;tk&quot; est un\ninterface scriptée vers les composants graphiques X-windows standard, la combinaison est donc souvent utilisée\ncréer des interfaces utilisateur graphiques.","html":"<p>Langage de commande de l&#039;outil. Un autre langage de script à usage général. Le composant &quot;tk&quot; est un\ninterface scriptée vers les composants graphiques X-windows standard, la combinaison est donc souvent utilisée\ncréer des interfaces utilisateur graphiques.</p>"},{"id":"text-101","type":"text","heading":"","plain_text":"Ksh93 peut être étendu en se connectant à des bibliothèques partagées fournissant des commandes internes supplémentaires. Un exemple\nd&#39;une coquille étendue est\ntksh\nqui intègre Tcl / Tk avec ksh et permet la génération de\nscripts utilisant les deux langues. Il peut être utilisé pour le prototypage d&#39;applications d&#39;interface graphique.","html":"<p>Ksh93 peut être étendu en se connectant à des bibliothèques partagées fournissant des commandes internes supplémentaires. Un exemple\nd&#039;une coquille étendue est\ntksh\nqui intègre Tcl / Tk avec ksh et permet la génération de\nscripts utilisant les deux langues. Il peut être utilisé pour le prototypage d&#039;applications d&#039;interface graphique.</p>"},{"id":"text-102","type":"text","heading":"","plain_text":"(6)","html":"<p>(6)</p>"},{"id":"text-103","type":"text","heading":"","plain_text":"Ksh et bash sont les deux super-ensembles de sh. Pour une portabilité maximale, même très ancienne\nordinateurs, vous devriez vous en tenir aux commandes trouvées dans sh. Si possible, fonctionnalités spécifiques à ksh ou bash\nsera noté dans les pages suivantes. En général, les nouveaux obus courent un peu plus vite\net les scripts sont souvent plus lisibles, car la logique peut être exprimée plus proprement au plus récent\nsyntaxe. De nombreuses commandes et tests conditionnels sont maintenant internes.","html":"<p>Ksh et bash sont les deux super-ensembles de sh. Pour une portabilité maximale, même très ancienne\nordinateurs, vous devriez vous en tenir aux commandes trouvées dans sh. Si possible, fonctionnalités spécifiques à ksh ou bash\nsera noté dans les pages suivantes. En général, les nouveaux obus courent un peu plus vite\net les scripts sont souvent plus lisibles, car la logique peut être exprimée plus proprement au plus récent\nsyntaxe. De nombreuses commandes et tests conditionnels sont maintenant internes.</p>"},{"id":"text-104","type":"text","heading":"","plain_text":"La philosophie des outils Unix séparés effectuant chacun un seul\nopération a été suivie de près par les concepteurs de la coque d&#39;origine, de sorte qu&#39;il\navait très peu de commandes internes et\nutilisé des outils externes pour des opérations très triviales\n(comme écho    et [[[[). Ksh et bash en interne\neffectue un grand nombre de manipulations numériques et de chaînes de base et de tests conditionnels. Problèmes occasionnels\nse pose parce que les versions internes de certaines commandes comme écho    ne sont pas entièrement compatibles avec\nl&#39;utilitaire externe ils ont remplacé.","html":"<p>La philosophie des outils Unix séparés effectuant chacun un seul\nopération a été suivie de près par les concepteurs de la coque d&#039;origine, de sorte qu&#039;il\navait très peu de commandes internes et\nutilisé des outils externes pour des opérations très triviales\n(comme écho    et [[[[). Ksh et bash en interne\neffectue un grand nombre de manipulations numériques et de chaînes de base et de tests conditionnels. Problèmes occasionnels\nse pose parce que les versions internes de certaines commandes comme écho    ne sont pas entièrement compatibles avec\nl&#039;utilitaire externe ils ont remplacé.</p>"},{"id":"text-105","type":"text","heading":"","plain_text":"L&#39;action entreprise chaque fois qu&#39;un shell doit exécuter un programme externe consiste à localiser le programme.\n(via $ PATH), fourchette(), qui crée une deuxième copie du shell,\najustez l&#39;entrée / sortie standard pour le\nprogramme externe, et exec (), qui remplace le second shell par le programme externe.\nCe processus est onéreux en termes de calcul (relativement), donc lorsque le script fait quelque chose de trivial\nplusieurs fois dans une boucle, cela fait gagner beaucoup de temps si la fonction est gérée en interne.","html":"<p>L&#039;action entreprise chaque fois qu&#039;un shell doit exécuter un programme externe consiste à localiser le programme.\n(via $ PATH), fourchette(), qui crée une deuxième copie du shell,\najustez l&#039;entrée / sortie standard pour le\nprogramme externe, et exec (), qui remplace le second shell par le programme externe.\nCe processus est onéreux en termes de calcul (relativement), donc lorsque le script fait quelque chose de trivial\nplusieurs fois dans une boucle, cela fait gagner beaucoup de temps si la fonction est gérée en interne.</p>"},{"id":"text-106","type":"text","heading":"","plain_text":"Si vous suivez des manuels sur la programmation du shell Bourne, tous les conseils doivent être valables\nlequel des coquillages dérivés de Bourne que vous utilisez. Malheureusement, de nombreux fournisseurs ont ajouté des fonctionnalités au fil des ans\net atteindre la portabilité complète peut être un défi. Écrire explicitement pour ksh (ou bash) et insister\nsur ce shell en cours d&#39;installation, peut souvent être plus simple.","html":"<p>Si vous suivez des manuels sur la programmation du shell Bourne, tous les conseils doivent être valables\nlequel des coquillages dérivés de Bourne que vous utilisez. Malheureusement, de nombreux fournisseurs ont ajouté des fonctionnalités au fil des ans\net atteindre la portabilité complète peut être un défi. Écrire explicitement pour ksh (ou bash) et insister\nsur ce shell en cours d&#039;installation, peut souvent être plus simple.</p>"},{"id":"text-107","type":"text","heading":"","plain_text":"Le sh et le ksh homme les pages utilisent le terme commande spéciale    pour les commandes internes &#8211; gérées par le shell\nlui-même.\n(7)","html":"<p>Le sh et le ksh homme les pages utilisent le terme commande spéciale    pour les commandes internes &#8211; gérées par le shell\nlui-même.\n(7)</p>"},{"id":"text-108","type":"text","heading":"","plain_text":"Le script shell le plus élémentaire est une liste de commandes exactement telles qu’elles pourraient être.\ndactylographié de manière interactive, préfacé par le #!    en-tête magique.\nToutes les règles d&#39;analyse, les caractères génériques de nom de fichier, les recherches $ PATH, etc., qui ont été résumés\nci-dessus, appliquer.\nEn outre:","html":"<p>Le script shell le plus élémentaire est une liste de commandes exactement telles qu’elles pourraient être.\ndactylographié de manière interactive, préfacé par le #!    en-tête magique.\nToutes les règles d&#039;analyse, les caractères génériques de nom de fichier, les recherches $ PATH, etc., qui ont été résumés\nci-dessus, appliquer.\nEn outre:</p>"},{"id":"text-109","type":"text","heading":"","plain_text":"#    en tant que premier caractère non blanc sur une ligne","html":"<p>#    en tant que premier caractère non blanc sur une ligne</p>"},{"id":"text-110","type":"text","heading":"","plain_text":"marque la ligne en tant que commentaire et le reste de la ligne est complètement ignoré. Utilisation\ncommente librement dans vos scripts, comme dans toutes les autres formes de programmation.","html":"<p>marque la ligne en tant que commentaire et le reste de la ligne est complètement ignoré. Utilisation\ncommente librement dans vos scripts, comme dans toutes les autres formes de programmation.</p>"},{"id":"text-111","type":"text","heading":"","plain_text":"comme dernier caractère d&#39;une ligne","html":"<p>comme dernier caractère d&#039;une ligne</p>"},{"id":"text-112","type":"text","heading":"","plain_text":"provoque la jointure logique de la ligne suivante avant interprétation. Ceci permet\ncommandes très longues à saisir dans le script de manière plus lisible. Tu peux continuer\nla ligne autant de fois que nécessaire.","html":"<p>provoque la jointure logique de la ligne suivante avant interprétation. Ceci permet\ncommandes très longues à saisir dans le script de manière plus lisible. Tu peux continuer\nla ligne autant de fois que nécessaire.</p>"},{"id":"text-113","type":"text","heading":"","plain_text":"Ceci est en fait juste un cas particulier de     Être à échapperou supprimer\nla signification spéciale de, le caractère suivant.","html":"<p>Ceci est en fait juste un cas particulier de     Être à échapperou supprimer\nla signification spéciale de, le caractère suivant.</p>"},{"id":"text-114","type":"text","heading":"","plain_text":";    comme séparateur entre les mots d&#39;une ligne","html":"<p>;    comme séparateur entre les mots d&#039;une ligne</p>"},{"id":"text-115","type":"text","heading":"","plain_text":"est interprété comme une nouvelle ligne. Il vous permet de placer plusieurs commandes sur une seule ligne. Il y a\nquelques occasions où vous doit faire cela, mais souvent il est utilisé pour améliorer la mise en page\ndes commandes composées.","html":"<p>est interprété comme une nouvelle ligne. Il vous permet de placer plusieurs commandes sur une seule ligne. Il y a\nquelques occasions où vous doit faire cela, mais souvent il est utilisé pour améliorer la mise en page\ndes commandes composées.</p>"},{"id":"text-116","type":"text","heading":"","plain_text":"Exemple: affichage ex1, texte","html":"<p>Exemple: affichage ex1, texte</p>"},{"id":"text-117","type":"text","heading":"","plain_text":"1: #! / bin / ksh\n            2: # Aux fins d’affichage, certaines parties du script ont \n            3: # été rendu en technicolor glorieux.\n            4: ## Certains commentaires sont en gras pour signaler les sections spéciales\n            5: \n            6: # Les numéros de ligne à gauche ne font pas partie du script.\n            7: # Ils sont simplement ajoutés au HTML pour référence.\n            8: \n            9: # Les commandes intégrées et les mots-clés (par exemple, print) sont en bleu\n        dix: # Les substitutions de commandes sont violettes. Les variables sont noires\n        11: impression &quot;Résumé de l&#39;utilisation du disque pour $ USER sur `rendez-vous amoureux`&quot;\n  12: \n        13: # Tout le reste est rouge - ce qui est principalement externe \n        14: # commandes et les arguments de toutes les commandes.\n        15: impression Ce sont mes fichiers       # commentaire de fin de ligne pour impression\n        16: # Liste les fichiers en colonnes\n        17: ls -C\n  18: # Résumer l&#39;utilisation du disque\n        19: impression\n        20: impression Utilisation de l&#39;espace disque\n  21: du -k \n  22: sortie 0","html":"<p>1: #! / bin / ksh\n            2: # Aux fins d’affichage, certaines parties du script ont \n            3: # été rendu en technicolor glorieux.\n            4: ## Certains commentaires sont en gras pour signaler les sections spéciales\n            5: \n            6: # Les numéros de ligne à gauche ne font pas partie du script.\n            7: # Ils sont simplement ajoutés au HTML pour référence.\n            8: \n            9: # Les commandes intégrées et les mots-clés (par exemple, print) sont en bleu\n        dix: # Les substitutions de commandes sont violettes. Les variables sont noires\n        11: impression &quot;Résumé de l&#039;utilisation du disque pour $ USER sur `rendez-vous amoureux`&quot;\n  12: \n        13: # Tout le reste est rouge - ce qui est principalement externe \n        14: # commandes et les arguments de toutes les commandes.\n        15: impression Ce sont mes fichiers       # commentaire de fin de ligne pour impression\n        16: # Liste les fichiers en colonnes\n        17: ls -C\n  18: # Résumer l&#039;utilisation du disque\n        19: impression\n        20: impression Utilisation de l&#039;espace disque\n  21: du -k \n  22: sortie 0</p>"},{"id":"text-118","type":"text","heading":"","plain_text":"Statut de sortie\nChaque commande (programme) a un valeur ou statut de sortie\nqu&#39;il retourne au programme appelant. Ce\nest séparé de toute sortie générée. Le statut de sortie d&#39;un script shell peut être défini explicitement à l&#39;aide de\nsortie Nou la valeur par défaut de la dernière commande exécutée.","html":"<p>Statut de sortie\nChaque commande (programme) a un valeur ou statut de sortie\nqu&#039;il retourne au programme appelant. Ce\nest séparé de toute sortie générée. Le statut de sortie d&#039;un script shell peut être défini explicitement à l&#039;aide de\nsortie Nou la valeur par défaut de la dernière commande exécutée.</p>"},{"id":"text-119","type":"text","heading":"","plain_text":"Le statut de sortie est un entier compris entre 0 et 255. Conventionnellement 0 = succès et\ntoute autre valeur indique un problème. Pensez-y comme à un seul moyen pour que tout\ntravailler, mais de nombreuses façons d’échouer. Si la commande s&#39;est terminée par un signal, la valeur est 128 plus\nla valeur du signal.","html":"<p>Le statut de sortie est un entier compris entre 0 et 255. Conventionnellement 0 = succès et\ntoute autre valeur indique un problème. Pensez-y comme à un seul moyen pour que tout\ntravailler, mais de nombreuses façons d’échouer. Si la commande s&#039;est terminée par un signal, la valeur est 128 plus\nla valeur du signal.</p>"},{"id":"text-120","type":"text","heading":"","plain_text":"(8)","html":"<p>(8)</p>"},{"id":"text-121","type":"text","heading":"","plain_text":"Le shell interprète les caractères suivants comme des caractères génériques de nom de fichier, et\ntout mot les contenant est remplacé par une liste triée de tous les fichiers correspondants.","html":"<p>Le shell interprète les caractères suivants comme des caractères génériques de nom de fichier, et\ntout mot les contenant est remplacé par une liste triée de tous les fichiers correspondants.</p>"},{"id":"text-122","type":"text","heading":"","plain_text":"Les caractères génériques peuvent être utilisés dans les parties de répertoire d&#39;un chemin ainsi que dans la partie de nom de fichier.\nSi aucun fichier ne correspond au caractère générique, celui-ci reste inchangé.\nLes caractères génériques ne sont pas des expressions régulières complètes. Sed, grep, awk etc. fonctionnent avec plus de souplesse (et plus\ncomplexes) opérateurs de correspondance de chaînes.","html":"<p>Les caractères génériques peuvent être utilisés dans les parties de répertoire d&#039;un chemin ainsi que dans la partie de nom de fichier.\nSi aucun fichier ne correspond au caractère générique, celui-ci reste inchangé.\nLes caractères génériques ne sont pas des expressions régulières complètes. Sed, grep, awk etc. fonctionnent avec plus de souplesse (et plus\ncomplexes) opérateurs de correspondance de chaînes.</p>"},{"id":"text-123","type":"text","heading":"","plain_text":"*","html":"<p>*</p>"},{"id":"text-124","type":"text","heading":"","plain_text":"Correspond à zéro ou plusieurs caractères.","html":"<p>Correspond à zéro ou plusieurs caractères.</p>"},{"id":"text-125","type":"text","heading":"","plain_text":"?","html":"<p>?</p>"},{"id":"text-126","type":"text","heading":"","plain_text":"Correspondre à n&#39;importe quel personnage","html":"<p>Correspondre à n&#039;importe quel personnage</p>"},{"id":"text-127","type":"text","heading":"","plain_text":"[...]","html":"<p>[...]</p>"},{"id":"text-128","type":"text","heading":"","plain_text":"Faites correspondre n&#39;importe quel caractère de l&#39;ensemble entre crochets. Une plage de caractères peut être spécifiée\navec [  -  ]","html":"<p>Faites correspondre n&#039;importe quel caractère de l&#039;ensemble entre crochets. Une plage de caractères peut être spécifiée\navec [  -  ]</p>"},{"id":"text-129","type":"text","heading":"","plain_text":"[!...]","html":"<p>[!...]</p>"},{"id":"text-130","type":"text","heading":"","plain_text":"Associez n&#39;importe quel caractère non inclus dans l&#39;ensemble entre crochets.","html":"<p>Associez n&#039;importe quel caractère non inclus dans l&#039;ensemble entre crochets.</p>"},{"id":"text-131","type":"text","heading":"","plain_text":"Une initiale &quot;.&quot; dans un nom de fichier ne correspond pas à un caractère générique, sauf si explicitement\ndonné dans le motif. En ce sens, les noms de fichiers commençant par &quot;.&quot; sont cachés.\nUNE &quot;.&quot; ailleurs dans le nom de fichier n&#39;est pas spécial.","html":"<p>Une initiale &quot;.&quot; dans un nom de fichier ne correspond pas à un caractère générique, sauf si explicitement\ndonné dans le motif. En ce sens, les noms de fichiers commençant par &quot;.&quot; sont cachés.\nUNE &quot;.&quot; ailleurs dans le nom de fichier n&#039;est pas spécial.</p>"},{"id":"text-132","type":"text","heading":"","plain_text":"Les opérateurs de modèle peuvent être combinés","html":"<p>Les opérateurs de modèle peuvent être combinés</p>"},{"id":"text-133","type":"text","heading":"","plain_text":"Exemple:chapitre[1-5]. *    pourrait correspondre chapitre1.tex, chapitre4.tex, chapitre5.tex.old.\nCela ne correspond pas chapitre10.tex    ou chapitre 1\n(9)","html":"<p>Exemple:chapitre[1-5]. *    pourrait correspondre chapitre1.tex, chapitre4.tex, chapitre5.tex.old.\nCela ne correspond pas chapitre10.tex    ou chapitre 1\n(9)</p>"},{"id":"text-134","type":"text","heading":"","plain_text":"Les scripts ne sont pas très utiles si toutes les commandes, options et noms de fichiers sont explicitement\ncodé. En utilisant des variables, vous pouvez créer un script générique et l’appliquer à différents\ndes situations. Les noms de variables sont composés de lettres, de chiffres et de traits de soulignement\n ([a-zA-Z0-9_], ne peut pas commencer par un nombre, et sont des cas\nsensible. Plusieurs variables spéciales (toujours des noms en majuscule) sont utilisées par le système &#8211; en les réinitialisant.\npeut provoquer un comportement inattendu. Certaines variables spéciales peuvent être en lecture seule.\nL&#39;utilisation de noms minuscules pour vos propres variables est la plus sûre.\nDéfinition et exportation de variables","html":"<p>Les scripts ne sont pas très utiles si toutes les commandes, options et noms de fichiers sont explicitement\ncodé. En utilisant des variables, vous pouvez créer un script générique et l’appliquer à différents\ndes situations. Les noms de variables sont composés de lettres, de chiffres et de traits de soulignement\n ([a-zA-Z0-9_], ne peut pas commencer par un nombre, et sont des cas\nsensible. Plusieurs variables spéciales (toujours des noms en majuscule) sont utilisées par le système &#8211; en les réinitialisant.\npeut provoquer un comportement inattendu. Certaines variables spéciales peuvent être en lecture seule.\nL&#039;utilisation de noms minuscules pour vos propres variables est la plus sûre.\nDéfinition et exportation de variables</p>"},{"id":"text-135","type":"text","heading":"","plain_text":"srcfile = dataset1","html":"<p>srcfile = dataset1</p>"},{"id":"text-136","type":"text","heading":"","plain_text":"Crée (si elle n’existait pas) une variable nommée &quot;srcfile&quot; et lui attribue la valeur &quot;dataset1&quot;. Si la\nLa variable existait déjà, elle est écrasée. Les variables sont traitées comme des chaînes de texte, sauf si le contexte\nimplique une interprétation numérique. Vous pouvez faire en sorte qu&#39;une variable soit toujours traitée comme un nombre. Notez ici\ndoit être sans espaces autour du &quot;=&quot;.","html":"<p>Crée (si elle n’existait pas) une variable nommée &quot;srcfile&quot; et lui attribue la valeur &quot;dataset1&quot;. Si la\nLa variable existait déjà, elle est écrasée. Les variables sont traitées comme des chaînes de texte, sauf si le contexte\nimplique une interprétation numérique. Vous pouvez faire en sorte qu&#039;une variable soit toujours traitée comme un nombre. Notez ici\ndoit être sans espaces autour du &quot;=&quot;.</p>"},{"id":"text-137","type":"text","heading":"","plain_text":"ensemble","html":"<p>ensemble</p>"},{"id":"text-138","type":"text","heading":"","plain_text":"Afficher toutes les variables actuellement définies dans le shell","html":"<p>Afficher toutes les variables actuellement définies dans le shell</p>"},{"id":"text-139","type":"text","heading":"","plain_text":"non fixé srcfile","html":"<p>non fixé srcfile</p>"},{"id":"text-140","type":"text","heading":"","plain_text":"Supprimer la variable &quot;srcfile&quot;","html":"<p>Supprimer la variable &quot;srcfile&quot;</p>"},{"id":"text-141","type":"text","heading":"","plain_text":"srcfile =","html":"<p>srcfile =</p>"},{"id":"text-142","type":"text","heading":"","plain_text":"Donnez à la variable une valeur nulle (ce n&#39;est pas la même chose que de la supprimer).","html":"<p>Donnez à la variable une valeur nulle (ce n&#039;est pas la même chose que de la supprimer).</p>"},{"id":"text-143","type":"text","heading":"","plain_text":"exportation srcfile","html":"<p>exportation srcfile</p>"},{"id":"text-144","type":"text","heading":"","plain_text":"Ajout de srcfile à la liste des variables qui seront mises à la disposition du programme externe via\nl&#39;environnement. Si vous ne le faites pas, la variable est locale pour cette instance de shell.","html":"<p>Ajout de srcfile à la liste des variables qui seront mises à la disposition du programme externe via\nl&#039;environnement. Si vous ne le faites pas, la variable est locale pour cette instance de shell.</p>"},{"id":"text-145","type":"text","heading":"","plain_text":"exportation","html":"<p>exportation</p>"},{"id":"text-146","type":"text","heading":"","plain_text":"Répertorie toutes les variables en cours d’exportation &#8211; c’est l’environnement qui sera transmis.\naux programmes externes.","html":"<p>Répertorie toutes les variables en cours d’exportation &#8211; c’est l’environnement qui sera transmis.\naux programmes externes.</p>"},{"id":"text-147","type":"text","heading":"","plain_text":"En utilisant des variables","html":"<p>En utilisant des variables</p>"},{"id":"text-148","type":"text","heading":"","plain_text":"$ srcfile","html":"<p>$ srcfile</p>"},{"id":"text-149","type":"text","heading":"","plain_text":"Préfacer le nom de la variable avec $ provoque la valeur de la variable à\nêtre substitué à la place du nom.","html":"<p>Préfacer le nom de la variable avec $ provoque la valeur de la variable à\nêtre substitué à la place du nom.</p>"},{"id":"text-150","type":"text","heading":"","plain_text":"$ srcfile","html":"<p>$ srcfile</p>"},{"id":"text-151","type":"text","heading":"","plain_text":"Si la variable n&#39;est pas entourée d&#39;espaces (ou d&#39;autres caractères qui ne peuvent pas être dans un nom),\nle nom doit être entouré d&#39;accolades &quot;&quot;\nafin que le shell sache quels caractères vous voulez faire partie du nom.","html":"<p>Si la variable n&#039;est pas entourée d&#039;espaces (ou d&#039;autres caractères qui ne peuvent pas être dans un nom),\nle nom doit être entouré d&#039;accolades &quot;&quot;\nafin que le shell sache quels caractères vous voulez faire partie du nom.</p>"},{"id":"text-152","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-153","type":"text","heading":"","plain_text":"fichier de données = recensement2000\n# Essaie de trouver $ datafile_part1, qui n&#39;existe pas\necho $ datafile_part1.sas\n# C&#39;est ce que nous voulions\necho $ datafile _part1.sas","html":"<p>fichier de données = recensement2000\n# Essaie de trouver $ datafile_part1, qui n&#039;existe pas\necho $ datafile_part1.sas\n# C&#039;est ce que nous voulions\necho $ datafile _part1.sas</p>"},{"id":"text-154","type":"text","heading":"","plain_text":"Modificateurs conditionnels\nIl existe différentes manières d’utiliser conditionnellement une variable dans une commande.","html":"<p>Modificateurs conditionnels\nIl existe différentes manières d’utiliser conditionnellement une variable dans une commande.</p>"},{"id":"text-155","type":"text","heading":"","plain_text":"$ datafile-default","html":"<p>$ datafile-default</p>"},{"id":"text-156","type":"text","heading":"","plain_text":"Substituez la valeur de $ fichier de données, s’il a été défini, sinon utilisez la chaîne &quot;default&quot;. C&#39;est facile\nmoyen de permettre des variables optionnelles, et avoir des valeurs par défaut raisonnables si elles n’ont pas été définies. Si fichier de données    était\nindéfini, il en reste ainsi.","html":"<p>Substituez la valeur de $ fichier de données, s’il a été défini, sinon utilisez la chaîne &quot;default&quot;. C&#039;est facile\nmoyen de permettre des variables optionnelles, et avoir des valeurs par défaut raisonnables si elles n’ont pas été définies. Si fichier de données    était\nindéfini, il en reste ainsi.</p>"},{"id":"text-157","type":"text","heading":"","plain_text":"$ datafile = default","html":"<p>$ datafile = default</p>"},{"id":"text-158","type":"text","heading":"","plain_text":"Similaire à ce qui précède, sauf si fichier de données    n&#39;a pas été défini, définissez-le sur la chaîne &quot;default&quot;.","html":"<p>Similaire à ce qui précède, sauf si fichier de données    n&#039;a pas été défini, définissez-le sur la chaîne &quot;default&quot;.</p>"},{"id":"text-159","type":"text","heading":"","plain_text":"$ datafile + default","html":"<p>$ datafile + default</p>"},{"id":"text-160","type":"text","heading":"","plain_text":"Si variable fichier de données    a été défini, utilisez la chaîne &quot;default&quot;, sinon utilisez null. Dans ce cas, le\nvaleur actuelle $ fichier de données    N&#39;est pas utilisé.","html":"<p>Si variable fichier de données    a été défini, utilisez la chaîne &quot;default&quot;, sinon utilisez null. Dans ce cas, le\nvaleur actuelle $ fichier de données    N&#039;est pas utilisé.</p>"},{"id":"text-161","type":"text","heading":"","plain_text":"$ datafile? &quot;message d&#39;erreur&quot;","html":"<p>$ datafile? &quot;message d&#039;erreur&quot;</p>"},{"id":"text-162","type":"text","heading":"","plain_text":"Substituez la valeur de $ fichier de données, s&#39;il a été défini, sinon affichez datafile: message d&#39;erreur.\nCeci est utilisé pour les diagnostics lorsqu&#39;une variable aurait dû être définie et qu&#39;il n&#39;y a pas de valeur par défaut raisonnable à utiliser.","html":"<p>Substituez la valeur de $ fichier de données, s&#039;il a été défini, sinon affichez datafile: message d&#039;erreur.\nCeci est utilisé pour les diagnostics lorsqu&#039;une variable aurait dû être définie et qu&#039;il n&#039;y a pas de valeur par défaut raisonnable à utiliser.</p>"},{"id":"text-163","type":"text","heading":"","plain_text":"Placer un colon (:) avant que le caractère opérateur dans ces constructions ait pour effet de compter un\nnul valeur identique à une variable non définie. Les variables peuvent recevoir une valeur nulle en les définissant\nen une chaîne vide, par exemple fichier de données = .\nExemple:\necho $ datafile: -mydata.datÉcho de la valeur de variable fichier de données    s&#39;il a été défini et est non nul, sinon\necho &quot;mydata.dat&quot;.","html":"<p>Placer un colon (:) avant que le caractère opérateur dans ces constructions ait pour effet de compter un\nnul valeur identique à une variable non définie. Les variables peuvent recevoir une valeur nulle en les définissant\nen une chaîne vide, par exemple fichier de données = .\nExemple:\necho $ datafile: -mydata.datÉcho de la valeur de variable fichier de données    s&#039;il a été défini et est non nul, sinon\necho &quot;mydata.dat&quot;.</p>"},{"id":"text-164","type":"text","heading":"","plain_text":"Préfixe de commande d&#39;attribution de variable\nIl est possible d’exporter une variable pour la durée d’une seule commande en utilisant le\nsyntaxe:\nvar = valeur commande args\n(dix)","html":"<p>Préfixe de commande d&#039;attribution de variable\nIl est possible d’exporter une variable pour la durée d’une seule commande en utilisant le\nsyntaxe:\nvar = valeur commande args\n(dix)</p>"},{"id":"text-165","type":"text","heading":"","plain_text":"Le système utilise plusieurs variables spéciales. Vous pouvez les utiliser, mais vous ne pourrez peut-être pas\npour les changer.\nLes variables spéciales utilisent des noms en majuscules ou des caractères de ponctuation.\nCertaines variables sont définies par le processus de connexion et héritées par le shell (par exemple, $ USER),\ntandis que d&#39;autres ne sont utilisés que par le shell.  Essayez de courir ensemble    ou env Voici quelques-uns des plus couramment utilisés:\nEnvironnement de connexion","html":"<p>Le système utilise plusieurs variables spéciales. Vous pouvez les utiliser, mais vous ne pourrez peut-être pas\npour les changer.\nLes variables spéciales utilisent des noms en majuscules ou des caractères de ponctuation.\nCertaines variables sont définies par le processus de connexion et héritées par le shell (par exemple, $ USER),\ntandis que d&#039;autres ne sont utilisés que par le shell.  Essayez de courir ensemble    ou env Voici quelques-uns des plus couramment utilisés:\nEnvironnement de connexion</p>"},{"id":"text-166","type":"text","heading":"","plain_text":"$ USER, $ LOGNAME","html":"<p>$ USER, $ LOGNAME</p>"},{"id":"text-167","type":"text","heading":"","plain_text":"Prédéfini sur le nom d&#39;utilisateur actuellement connecté.","html":"<p>Prédéfini sur le nom d&#039;utilisateur actuellement connecté.</p>"},{"id":"text-168","type":"text","heading":"","plain_text":"$ PATH","html":"<p>$ PATH</p>"},{"id":"text-169","type":"text","heading":"","plain_text":"La liste des répertoires qui seront recherchés pour les commandes externes. Vous pouvez changer cela dans un script\npour vous assurer que vous obtenez les programmes que vous avez l&#39;intention, et ne pas obtenir accidentellement d&#39;autres versions qui pourraient avoir été\ninstallée.","html":"<p>La liste des répertoires qui seront recherchés pour les commandes externes. Vous pouvez changer cela dans un script\npour vous assurer que vous obtenez les programmes que vous avez l&#039;intention, et ne pas obtenir accidentellement d&#039;autres versions qui pourraient avoir été\ninstallée.</p>"},{"id":"text-170","type":"text","heading":"","plain_text":"$ TERM","html":"<p>$ TERM</p>"},{"id":"text-171","type":"text","heading":"","plain_text":"Le type de terminal dans lequel la session shell est en cours d&#39;exécution. Habituellement, &quot;xterm&quot; ou &quot;vt100&quot;. Beaucoup de programmes\nVous devez savoir cela pour savoir quelles séquences de caractères spéciaux envoyer pour obtenir des effets spéciaux.","html":"<p>Le type de terminal dans lequel la session shell est en cours d&#039;exécution. Habituellement, &quot;xterm&quot; ou &quot;vt100&quot;. Beaucoup de programmes\nVous devez savoir cela pour savoir quelles séquences de caractères spéciaux envoyer pour obtenir des effets spéciaux.</p>"},{"id":"text-172","type":"text","heading":"","plain_text":"$ PAGER","html":"<p>$ PAGER</p>"},{"id":"text-173","type":"text","heading":"","plain_text":"S&#39;il est défini, il contient le nom du programme que l&#39;utilisateur préfère utiliser pour afficher les fichiers texte. habituellement\nrégler sur &quot;plus&quot; ou &quot;moins&quot; ou quelque chose de similaire. De nombreux programmes devant présenter des informations sur plusieurs pages\nl&#39;utilisateur respectera ce paramètre (par exemple, homme). Ce n&#39;est pas réellement utilisé par le shell lui-même, mais\nLes scripts shell doivent l’honorer s’ils doivent émettre une page vers l’utilisateur.","html":"<p>S&#039;il est défini, il contient le nom du programme que l&#039;utilisateur préfère utiliser pour afficher les fichiers texte. habituellement\nrégler sur &quot;plus&quot; ou &quot;moins&quot; ou quelque chose de similaire. De nombreux programmes devant présenter des informations sur plusieurs pages\nl&#039;utilisateur respectera ce paramètre (par exemple, homme). Ce n&#039;est pas réellement utilisé par le shell lui-même, mais\nLes scripts shell doivent l’honorer s’ils doivent émettre une page vers l’utilisateur.</p>"},{"id":"text-174","type":"text","heading":"","plain_text":"$ EDITEUR","html":"<p>$ EDITEUR</p>"},{"id":"text-175","type":"text","heading":"","plain_text":"Si défini, ceci contient le nom du programme que l&#39;utilisateur préfère utiliser pour l&#39;édition de fichier texte. Un programme\nqui doit obliger l’utilisateur à éditer manuellement un fichier peut choisir de démarrer ce programme au lieu de\npar défaut intégré (par exemple &quot;crontab -e&quot;. Ceci détermine également la modification de la ligne de commande par défaut.\ncomportement dans des coquilles interactives.","html":"<p>Si défini, ceci contient le nom du programme que l&#039;utilisateur préfère utiliser pour l&#039;édition de fichier texte. Un programme\nqui doit obliger l’utilisateur à éditer manuellement un fichier peut choisir de démarrer ce programme au lieu de\npar défaut intégré (par exemple &quot;crontab -e&quot;. Ceci détermine également la modification de la ligne de commande par défaut.\ncomportement dans des coquilles interactives.</p>"},{"id":"text-176","type":"text","heading":"","plain_text":"Paramètres internes du shell","html":"<p>Paramètres internes du shell</p>"},{"id":"text-177","type":"text","heading":"","plain_text":"$ PWD","html":"<p>$ PWD</p>"},{"id":"text-178","type":"text","heading":"","plain_text":"Toujours définir le répertoire de travail actuel (en lecture seule)","html":"<p>Toujours définir le répertoire de travail actuel (en lecture seule)</p>"},{"id":"text-179","type":"text","heading":"","plain_text":"$ OLDPWD","html":"<p>$ OLDPWD</p>"},{"id":"text-180","type":"text","heading":"","plain_text":"Le répertoire précédent (avant le plus récent CD    commander). Cependant, changer de répertoire\ndans un script est souvent dangereux.","html":"<p>Le répertoire précédent (avant le plus récent CD    commander). Cependant, changer de répertoire\ndans un script est souvent dangereux.</p>"},{"id":"text-181","type":"text","heading":"","plain_text":"$?    (lecture seulement)","html":"<p>$?    (lecture seulement)</p>"},{"id":"text-182","type":"text","heading":"","plain_text":"Définissez le statut de sortie de la dernière commande exécutée afin de pouvoir tester le succès ou l&#39;échec. Chaque commande réinitialise cette\nil faut donc le sauvegarder immédiatement si vous voulez l’utiliser plus tard.","html":"<p>Définissez le statut de sortie de la dernière commande exécutée afin de pouvoir tester le succès ou l&#039;échec. Chaque commande réinitialise cette\nil faut donc le sauvegarder immédiatement si vous voulez l’utiliser plus tard.</p>"},{"id":"text-183","type":"text","heading":"","plain_text":"$ -","html":"<p>$ -</p>"},{"id":"text-184","type":"text","heading":"","plain_text":"Définissez les options actuellement définies.","html":"<p>Définissez les options actuellement définies.</p>"},{"id":"text-185","type":"text","heading":"","plain_text":"$ IFS","html":"<p>$ IFS</p>"},{"id":"text-186","type":"text","heading":"","plain_text":"Séparateurs de champs internes: ensemble de caractères (normalement des espaces et des tabulations) utilisés pour analyser\nune ligne de commande en arguments séparés. Ceci peut être défini par l&#39;utilisateur à des fins spéciales, mais\nles choses deviennent très déroutantes si rien n&#39;est changé.","html":"<p>Séparateurs de champs internes: ensemble de caractères (normalement des espaces et des tabulations) utilisés pour analyser\nune ligne de commande en arguments séparés. Ceci peut être défini par l&#039;utilisateur à des fins spéciales, mais\nles choses deviennent très déroutantes si rien n&#039;est changé.</p>"},{"id":"text-187","type":"text","heading":"","plain_text":"Variables d&#39;ID de processus","html":"<p>Variables d&#039;ID de processus</p>"},{"id":"text-188","type":"text","heading":"","plain_text":"$$    (lecture seulement)","html":"<p>$$    (lecture seulement)</p>"},{"id":"text-189","type":"text","heading":"","plain_text":"Défini sur l&#39;ID de processus du shell actuel &#8211; utile pour créer des fichiers temporaires uniques, par exemple. /tmp/$0.$$","html":"<p>Défini sur l&#039;ID de processus du shell actuel &#8211; utile pour créer des fichiers temporaires uniques, par exemple. /tmp/$0.$$</p>"},{"id":"text-190","type":"text","heading":"","plain_text":"$ PPID    (lecture seulement)","html":"<p>$ PPID    (lecture seulement)</p>"},{"id":"text-191","type":"text","heading":"","plain_text":"Défini sur l&#39;ID de processus du processus parent de ce shell &#8211; utile pour découvrir comment le script a été appelé.","html":"<p>Défini sur l&#039;ID de processus du processus parent de ce shell &#8211; utile pour découvrir comment le script a été appelé.</p>"},{"id":"text-192","type":"text","heading":"","plain_text":"$!    (lecture seulement)","html":"<p>$!    (lecture seulement)</p>"},{"id":"text-193","type":"text","heading":"","plain_text":"Défini sur l&#39;ID de processus de la dernière commande démarrée en arrière-plan &#8211; utile pour vérifier les processus en arrière-plan.","html":"<p>Défini sur l&#039;ID de processus de la dernière commande démarrée en arrière-plan &#8211; utile pour vérifier les processus en arrière-plan.</p>"},{"id":"text-194","type":"text","heading":"","plain_text":"ksh / bash fonctionnalités supplémentaires","html":"<p>ksh / bash fonctionnalités supplémentaires</p>"},{"id":"text-195","type":"text","heading":"","plain_text":"$ SECONDES    (lecture seulement)","html":"<p>$ SECONDES    (lecture seulement)</p>"},{"id":"text-196","type":"text","heading":"","plain_text":"Nombre entier de secondes depuis le démarrage de ce shell. Peut être utilisé pour les commandes de chronométrage.","html":"<p>Nombre entier de secondes depuis le démarrage de ce shell. Peut être utilisé pour les commandes de chronométrage.</p>"},{"id":"text-197","type":"text","heading":"","plain_text":"$ RANDOM","html":"<p>$ RANDOM</p>"},{"id":"text-198","type":"text","heading":"","plain_text":"Chaque fois qu&#39;il est valorisé, $ RANDOM    renvoie un entier aléatoire compris entre 0 et 32k.  AU HASARD\npeut être réglé sur &quot;semer&quot; le générateur de nombres aléatoires.","html":"<p>Chaque fois qu&#039;il est valorisé, $ RANDOM    renvoie un entier aléatoire compris entre 0 et 32k.  AU HASARD\npeut être réglé sur &quot;semer&quot; le générateur de nombres aléatoires.</p>"},{"id":"text-199","type":"text","heading":"","plain_text":"$ LINENO    (lecture seulement)","html":"<p>$ LINENO    (lecture seulement)</p>"},{"id":"text-200","type":"text","heading":"","plain_text":"Evalue toujours le numéro de ligne actuel du script en cours d&#39;exécution &#8211; utile pour le débogage.","html":"<p>Evalue toujours le numéro de ligne actuel du script en cours d&#039;exécution &#8211; utile pour le débogage.</p>"},{"id":"text-201","type":"text","heading":"","plain_text":"(11)","html":"<p>(11)</p>"},{"id":"text-202","type":"text","heading":"","plain_text":"Pour personnaliser le comportement d&#39;un script au moment de l&#39;exécution,\nvous pouvez lui donner un nombre quelconque d&#39;arguments sur la commande\nligne.","html":"<p>Pour personnaliser le comportement d&#039;un script au moment de l&#039;exécution,\nvous pouvez lui donner un nombre quelconque d&#039;arguments sur la commande\nligne.</p>"},{"id":"text-203","type":"text","heading":"","plain_text":"Ce sont souvent des noms de fichiers, mais peuvent être interprétés par le script de quelque manière que ce soit. Les options\nsont souvent spécifiés en utilisant la convention &quot;-flag&quot; utilisée par la plupart des programmes Unix, et une commande ksh\ngetopts    est disponible pour aider à les analyser.","html":"<p>Ce sont souvent des noms de fichiers, mais peuvent être interprétés par le script de quelque manière que ce soit. Les options\nsont souvent spécifiés en utilisant la convention &quot;-flag&quot; utilisée par la plupart des programmes Unix, et une commande ksh\ngetopts    est disponible pour aider à les analyser.</p>"},{"id":"text-204","type":"text","heading":"","plain_text":"Le shell développe les caractères génériques et rend variable et\nsubstitutions de commandes comme d&#39;habitude, puis analyse les mots obtenus par des espaces (en réalité\nvariable spéciale $ IFS) et place les chaînes de texte résultantes dans\nvariables de position\ncomme suit:","html":"<p>Le shell développe les caractères génériques et rend variable et\nsubstitutions de commandes comme d&#039;habitude, puis analyse les mots obtenus par des espaces (en réalité\nvariable spéciale $ IFS) et place les chaînes de texte résultantes dans\nvariables de position\ncomme suit:</p>"},{"id":"text-205","type":"text","heading":"","plain_text":"0 $, 1 $, 2 $, ... 9 $","html":"<p>0 $, 1 $, 2 $, ... 9 $</p>"},{"id":"text-206","type":"text","heading":"","plain_text":"Les 9 premiers arguments sont disponibles directement sous forme de $ 1-9 $. Pour accéder à plus de 9, utilisez\ndécalage, ou $ *, $ @. La variable 0 $    contient le nom du\nscript lui-même.","html":"<p>Les 9 premiers arguments sont disponibles directement sous forme de $ 1-9 $. Pour accéder à plus de 9, utilisez\ndécalage, ou $ *, $ @. La variable 0 $    contient le nom du\nscript lui-même.</p>"},{"id":"text-207","type":"text","heading":"","plain_text":"$ 10, $ 11, ...","html":"<p>$ 10, $ 11, ...</p>"},{"id":"text-208","type":"text","heading":"","plain_text":"Les arguments positionnels supérieurs à 9 sont définis par ksh et bash. N&#39;oubliez pas d&#39;utiliser des accolades pour vous y référer.","html":"<p>Les arguments positionnels supérieurs à 9 sont définis par ksh et bash. N&#039;oubliez pas d&#039;utiliser des accolades pour vous y référer.</p>"},{"id":"text-209","type":"text","heading":"","plain_text":"décalage","html":"<p>décalage</p>"},{"id":"text-210","type":"text","heading":"","plain_text":"ignore $ 1 et renumérote toutes les autres variables. &quot;décalage N&quot;déplacera N arguments à la fois.","html":"<p>ignore $ 1 et renumérote toutes les autres variables. &quot;décalage N&quot;déplacera N arguments à la fois.</p>"},{"id":"text-211","type":"text","heading":"","plain_text":"$ #","html":"<p>$ #</p>"},{"id":"text-212","type":"text","heading":"","plain_text":"contient le nombre d&#39;arguments définis (non compris $ 0).","html":"<p>contient le nombre d&#039;arguments définis (non compris $ 0).</p>"},{"id":"text-213","type":"text","heading":"","plain_text":"$ *","html":"<p>$ *</p>"},{"id":"text-214","type":"text","heading":"","plain_text":"contient tous les arguments dans une seule chaîne, avec un espace les séparant.","html":"<p>contient tous les arguments dans une seule chaîne, avec un espace les séparant.</p>"},{"id":"text-215","type":"text","heading":"","plain_text":"$ @","html":"<p>$ @</p>"},{"id":"text-216","type":"text","heading":"","plain_text":"semblable à $ *, mais s&#39;il est utilisé entre guillemets, il cite efficacement chaque argument et les maintient séparés.\nSi un argument contient des espaces, la distinction est importante.","html":"<p>semblable à $ *, mais s&#039;il est utilisé entre guillemets, il cite efficacement chaque argument et les maintient séparés.\nSi un argument contient des espaces, la distinction est importante.</p>"},{"id":"text-217","type":"text","heading":"","plain_text":"par exemple. si la liste d&#39;arguments est:  a1 a2 &quot;a3 qui contient des espaces&quot; a4alors: $ 1 = a1, $ 2 = a2, $ 3 = a3 qui contient des espaces, $ 4 = a4et: $ * = a1 a2 a3 qui contient des espaces a4et: &quot;$ @&quot; = &quot;a1&quot; &quot;a2&quot; &quot;a3 qui contient des espaces&quot; &quot;a4&quot;\nUtiliser uniquement le formulaire &quot;$ @&quot; préserve les arguments cités. Si les arguments sont passés du script\ndirectement à un autre programme, cela peut faire une grande différence quant à la signification.","html":"<p>par exemple. si la liste d&#039;arguments est:  a1 a2 &quot;a3 qui contient des espaces&quot; a4alors: $ 1 = a1, $ 2 = a2, $ 3 = a3 qui contient des espaces, $ 4 = a4et: $ * = a1 a2 a3 qui contient des espaces a4et: &quot;$ @&quot; = &quot;a1&quot; &quot;a2&quot; &quot;a3 qui contient des espaces&quot; &quot;a4&quot;\nUtiliser uniquement le formulaire &quot;$ @&quot; préserve les arguments cités. Si les arguments sont passés du script\ndirectement à un autre programme, cela peut faire une grande différence quant à la signification.</p>"},{"id":"text-218","type":"text","heading":"","plain_text":"Exemple: affichage ex7, texte","html":"<p>Exemple: affichage ex7, texte</p>"},{"id":"text-219","type":"text","heading":"","plain_text":"1: #! / bin / sh\n            2: #\n            3: # Vérifier la gestion des arguments de position\n            4: écho &quot;Nombre d&#39;arguments: $ #&quot;\n   5: écho &quot;0 $ = 0 $&quot;\n   6: \n            7: écho &quot;Boucle sur $ *&quot;\n   8: pour un dans $ *; faire\n            9:    écho  &quot;$ a &quot;\n  dix: terminé\n        11: \n        12: écho &quot;Boucle sur &quot; $ @ &quot;&quot;\n  13: pour un dans &quot;$ @&quot;; faire\n        14:    écho  &quot;$ a &quot;\n  15: terminé","html":"<p>1: #! / bin / sh\n            2: #\n            3: # Vérifier la gestion des arguments de position\n            4: écho &quot;Nombre d&#039;arguments: $ #&quot;\n   5: écho &quot;0 $ = 0 $&quot;\n   6: \n            7: écho &quot;Boucle sur $ *&quot;\n   8: pour un dans $ *; faire\n            9:    écho  &quot;$ a &quot;\n  dix: terminé\n        11: \n        12: écho &quot;Boucle sur &quot; $ @ &quot;&quot;\n  13: pour un dans &quot;$ @&quot;; faire\n        14:    écho  &quot;$ a &quot;\n  15: terminé</p>"},{"id":"text-220","type":"text","heading":"","plain_text":"Définir de nouveaux arguments de position\nle ensemble    commande, suivie d&#39;un ensemble d&#39;arguments, crée un nouvel ensemble de\narguments de position. Ceci est souvent utilisé, en supposant que les arguments originaux ne sont plus nécessaires, pour analyser\nun ensemble de mots (en utilisant éventuellement des séparateurs de champs différents). Les arguments peuvent être réinitialisés autant de fois que nécessaire.","html":"<p>Définir de nouveaux arguments de position\nle ensemble    commande, suivie d&#039;un ensemble d&#039;arguments, crée un nouvel ensemble de\narguments de position. Ceci est souvent utilisé, en supposant que les arguments originaux ne sont plus nécessaires, pour analyser\nun ensemble de mots (en utilisant éventuellement des séparateurs de champs différents). Les arguments peuvent être réinitialisés autant de fois que nécessaire.</p>"},{"id":"text-221","type":"text","heading":"","plain_text":"Exemple: affichage ex2, texte","html":"<p>Exemple: affichage ex2, texte</p>"},{"id":"text-222","type":"text","heading":"","plain_text":"1: #! / bin / sh\n            2: # Trouver une entrée dans le fichier de mots de passe\n            3: pwent =`grep &#39;^ root:&#39; / etc / passwd`\n   4: # Turn off globbing - les lignes de mot de passe contiennent souvent &#39;*&#39;\n            5: set -o noglob\n   6: # Le &quot;nom complet&quot; et les autres commentaires sont en\n            7: # champ 5, délimité par deux points. Obtenir ce champ en utilisant le fractionnement des mots de passe\n            8: OIFS =$ IFS; IFS =:; ensemble $ pwent; IFS =$ OIFS\n            9: écho 5 $","html":"<p>1: #! / bin / sh\n            2: # Trouver une entrée dans le fichier de mots de passe\n            3: pwent =`grep &#039;^ root:&#039; / etc / passwd`\n   4: # Turn off globbing - les lignes de mot de passe contiennent souvent &#039;*&#039;\n            5: set -o noglob\n   6: # Le &quot;nom complet&quot; et les autres commentaires sont en\n            7: # champ 5, délimité par deux points. Obtenir ce champ en utilisant le fractionnement des mots de passe\n            8: OIFS =$ IFS; IFS =:; ensemble $ pwent; IFS =$ OIFS\n            9: écho 5 $</p>"},{"id":"text-223","type":"text","heading":"","plain_text":"Exemple: affichage pickrandom, texteSélectionne un fichier aléatoire dans un répertoire.\nUtilise la fonctionnalité ksh RANDOM.","html":"<p>Exemple: affichage pickrandom, texteSélectionne un fichier aléatoire dans un répertoire.\nUtilise la fonctionnalité ksh RANDOM.</p>"},{"id":"text-224","type":"text","heading":"","plain_text":"1: #! / bin / ksh\n            2: \n            3: # Sélectionnez une image aléatoire dans la collection de logos en arrière-plan.\n            4: # Ceci pourrait être utilisé pour configurer un économiseur d&#39;écran, par exemple.\n            5: #\n            6: # Cela fonctionne même si les noms de fichiers contiennent des espaces.\n            7: \n            8: # passer au répertoire des logos pour éviter les longs chemins\n            9: logos =/ afs / northstar / commun / usr / lib / X11 / logos / arrière-plans\n  dix: CD logos $\n        11: \n        12: # &#39;*&#39; est un joker de nom de fichier qui correspond à tous les fichiers du répertoire en cours.\n        13: ensemble *\n  14: \n        15: # Utilisez la syntaxe pour les expressions arithmétiques. &quot;%&quot; est l&#39;opérateur modulo\n        16: # Décale les arguments d&#39;un nombre aléatoire entre 0 et le nombre de fichiers\n        17: décalage $ (($ RANDOM % $ #))\n        18: \n        19: # Affiche le premier argument résultant\n        20: écho &quot;logos $/1 $&quot;","html":"<p>1: #! / bin / ksh\n            2: \n            3: # Sélectionnez une image aléatoire dans la collection de logos en arrière-plan.\n            4: # Ceci pourrait être utilisé pour configurer un économiseur d&#039;écran, par exemple.\n            5: #\n            6: # Cela fonctionne même si les noms de fichiers contiennent des espaces.\n            7: \n            8: # passer au répertoire des logos pour éviter les longs chemins\n            9: logos =/ afs / northstar / commun / usr / lib / X11 / logos / arrière-plans\n  dix: CD logos $\n        11: \n        12: # &#039;*&#039; est un joker de nom de fichier qui correspond à tous les fichiers du répertoire en cours.\n        13: ensemble *\n  14: \n        15: # Utilisez la syntaxe pour les expressions arithmétiques. &quot;%&quot; est l&#039;opérateur modulo\n        16: # Décale les arguments d&#039;un nombre aléatoire entre 0 et le nombre de fichiers\n        17: décalage $ (($ RANDOM % $ #))\n        18: \n        19: # Affiche le premier argument résultant\n        20: écho &quot;logos $/1 $&quot;</p>"},{"id":"text-225","type":"text","heading":"","plain_text":"(12)","html":"<p>(12)</p>"},{"id":"text-226","type":"text","heading":"","plain_text":"Options de démarrage. ksh -options scriptname","html":"<p>Options de démarrage. ksh -options scriptname</p>"},{"id":"text-227","type":"text","heading":"","plain_text":"-X","html":"<p>-X</p>"},{"id":"text-228","type":"text","heading":"","plain_text":"echo ligne stderr avant de l&#39;exécuter","html":"<p>echo ligne stderr avant de l&#039;exécuter</p>"},{"id":"text-229","type":"text","heading":"","plain_text":"-n","html":"<p>-n</p>"},{"id":"text-230","type":"text","heading":"","plain_text":"lit les commandes et vérifie les erreurs de syntaxe, mais ne les exécute pas.","html":"<p>lit les commandes et vérifie les erreurs de syntaxe, mais ne les exécute pas.</p>"},{"id":"text-231","type":"text","heading":"","plain_text":"-une","html":"<p>-une</p>"},{"id":"text-232","type":"text","heading":"","plain_text":"toutes les variables sont automatiquement exportées","html":"<p>toutes les variables sont automatiquement exportées</p>"},{"id":"text-233","type":"text","heading":"","plain_text":"-F","html":"<p>-F</p>"},{"id":"text-234","type":"text","heading":"","plain_text":"désactiver l&#39;expansion des noms de fichiers génériques (globbing)","html":"<p>désactiver l&#039;expansion des noms de fichiers génériques (globbing)</p>"},{"id":"text-235","type":"text","heading":"","plain_text":"set -x","html":"<p>set -x</p>"},{"id":"text-236","type":"text","heading":"","plain_text":"Définir une option dans un script shell","html":"<p>Définir une option dans un script shell</p>"},{"id":"text-237","type":"text","heading":"","plain_text":"$ -","html":"<p>$ -</p>"},{"id":"text-238","type":"text","heading":"","plain_text":"contient les lettres d&#39;option actuellement définies","html":"<p>contient les lettres d&#039;option actuellement définies</p>"},{"id":"text-239","type":"text","heading":"","plain_text":"Il y a beaucoup d&#39;autres options, pas souvent nécessaires. Les options en ksh et bash peuvent aussi être\ndéfinir en utilisant des noms longs (par exemple -o noglob    au lieu de -F). De nombreuses options\nsont uniques à ksh ou bash.\n(13)","html":"<p>Il y a beaucoup d&#039;autres options, pas souvent nécessaires. Les options en ksh et bash peuvent aussi être\ndéfinir en utilisant des noms longs (par exemple -o noglob    au lieu de -F). De nombreuses options\nsont uniques à ksh ou bash.\n(13)</p>"},{"id":"text-240","type":"text","heading":"","plain_text":"syntaxe sh","html":"<p>syntaxe sh</p>"},{"id":"text-241","type":"text","heading":"","plain_text":"`commande`","html":"<p>`commande`</p>"},{"id":"text-242","type":"text","heading":"","plain_text":"Une commande (plus des arguments optionnels) entourés de backticks est exécutée et la sortie standard\nde cette commande est substitué. Si la commande produit une sortie multiligne, les nouvelles lignes sont conservées.\nSi la chaîne résultante est affichée, sans guillemets, en utilisant écho, les nouvelles lignes et les espaces multiples seront supprimés.","html":"<p>Une commande (plus des arguments optionnels) entourés de backticks est exécutée et la sortie standard\nde cette commande est substitué. Si la commande produit une sortie multiligne, les nouvelles lignes sont conservées.\nSi la chaîne résultante est affichée, sans guillemets, en utilisant écho, les nouvelles lignes et les espaces multiples seront supprimés.</p>"},{"id":"text-243","type":"text","heading":"","plain_text":"syntaxe ksh / bash","html":"<p>syntaxe ksh / bash</p>"},{"id":"text-244","type":"text","heading":"","plain_text":"$ (commande)","html":"<p>$ (commande)</p>"},{"id":"text-245","type":"text","heading":"","plain_text":"Cette syntaxe est fonctionnellement identique à celle des backticks, mais les commandes peuvent être plus facilement imbriquées.","html":"<p>Cette syntaxe est fonctionnellement identique à celle des backticks, mais les commandes peuvent être plus facilement imbriquées.</p>"},{"id":"text-246","type":"text","heading":"","plain_text":"$ (&lt;fichier)","html":"<p>$ (&lt;fichier)</p>"},{"id":"text-247","type":"text","heading":"","plain_text":"Ceci est équivalent à `cat file`, mais mis en œuvre en interne pour plus d&#39;efficacité.","html":"<p>Ceci est équivalent à `cat file`, mais mis en œuvre en interne pour plus d&#039;efficacité.</p>"},{"id":"text-248","type":"text","heading":"","plain_text":"Exemple: affichage ex3, texte","html":"<p>Exemple: affichage ex3, texte</p>"},{"id":"text-249","type":"text","heading":"","plain_text":"1: #! / bin / ksh\n            2: \n            3: écho Aujourd&#39;hui c&#39;est `rendez-vous amoureux`\n   4: \n            5: fichier =/ etc / hosts\n   6: écho Le fichier fichier $ a $ (wc -l &lt; fichier $) lignes\n   7: \n            8: nom_hôte -s&gt; nom_hôte\n   9: écho Ce système a le nom d’hôte $ (&lt;monhôte)","html":"<p>1: #! / bin / ksh\n            2: \n            3: écho Aujourd&#039;hui c&#039;est `rendez-vous amoureux`\n   4: \n            5: fichier =/ etc / hosts\n   6: écho Le fichier fichier $ a $ (wc -l &lt; fichier $) lignes\n   7: \n            8: nom_hôte -s&gt; nom_hôte\n   9: écho Ce système a le nom d’hôte $ (&lt;monhôte)</p>"},{"id":"text-250","type":"text","heading":"","plain_text":"(14)","html":"<p>(14)</p>"},{"id":"text-251","type":"text","heading":"","plain_text":"Toute commande simple (ou fonction shell, ou commande composée) peut avoir son entrée et sa sortie\nredirigé à l&#39;aide des opérateurs suivants. Ceci est effectué par le shell avant\nla commande est exécutée.\nRedirection de sortie","html":"<p>Toute commande simple (ou fonction shell, ou commande composée) peut avoir son entrée et sa sortie\nredirigé à l&#039;aide des opérateurs suivants. Ceci est effectué par le shell avant\nla commande est exécutée.\nRedirection de sortie</p>"},{"id":"text-252","type":"text","heading":"","plain_text":"&gt; nom de fichier","html":"<p>&gt; nom de fichier</p>"},{"id":"text-253","type":"text","heading":"","plain_text":"La sortie standard (descripteur de fichier 1) est redirigée vers le fichier nommé. Le fichier est écrasé\nà moins que le noclobber    l&#39;option est définie. Le fichier est créé s&#39;il n&#39;existe pas.","html":"<p>La sortie standard (descripteur de fichier 1) est redirigée vers le fichier nommé. Le fichier est écrasé\nà moins que le noclobber    l&#039;option est définie. Le fichier est créé s&#039;il n&#039;existe pas.</p>"},{"id":"text-254","type":"text","heading":"","plain_text":"Le fichier de périphérique spécial / dev / null    peut être utilisé pour ignorer explicitement les sorties indésirables.\nLa lecture de / dev / null entraîne un statut de fin de fichier.","html":"<p>Le fichier de périphérique spécial / dev / null    peut être utilisé pour ignorer explicitement les sorties indésirables.\nLa lecture de / dev / null entraîne un statut de fin de fichier.</p>"},{"id":"text-255","type":"text","heading":"","plain_text":"&gt;&gt; nom de fichier","html":"<p>&gt;&gt; nom de fichier</p>"},{"id":"text-256","type":"text","heading":"","plain_text":"La sortie standard est ajoutée au fichier nommé. Le fichier est créé s&#39;il n&#39;existe pas.","html":"<p>La sortie standard est ajoutée au fichier nommé. Le fichier est créé s&#039;il n&#039;existe pas.</p>"},{"id":"text-257","type":"text","heading":"","plain_text":"&gt; | nom de fichier","html":"<p>&gt; | nom de fichier</p>"},{"id":"text-258","type":"text","heading":"","plain_text":"Sortie redirection, et remplacer le noclobber option, si définie.","html":"<p>Sortie redirection, et remplacer le noclobber option, si définie.</p>"},{"id":"text-259","type":"text","heading":"","plain_text":"Redirection d&#39;entrée","html":"<p>Redirection d&#039;entrée</p>"},{"id":"text-260","type":"text","heading":"","plain_text":"&lt; nom de fichier","html":"<p>&lt; nom de fichier</p>"},{"id":"text-261","type":"text","heading":"","plain_text":"L&#39;entrée standard (descripteur de fichier 0) est redirigée vers le fichier nommé. Le fichier doit déjà\nexister.","html":"<p>L&#039;entrée standard (descripteur de fichier 0) est redirigée vers le fichier nommé. Le fichier doit déjà\nexister.</p>"},{"id":"text-262","type":"text","heading":"","plain_text":"Pipelines de commande","html":"<p>Pipelines de commande</p>"},{"id":"text-263","type":"text","heading":"","plain_text":"commande | commander [ | command ...]","html":"<p>commande | commander [ | command ...]</p>"},{"id":"text-264","type":"text","heading":"","plain_text":"Pipe plusieurs commandes ensemble. La sortie standard de la première commande devient la norme\nentrée de la deuxième commande. Toutes les commandes sont exécutées simultanément et le transfert de données s&#39;effectue via la mémoire.\ndes tampons. C&#39;est l&#39;une des constructions les plus puissantes d&#39;Unix. Composé les commandes peuvent aussi être\nutilisé avec des tuyaux. Les pipes jouent très bien avec les systèmes multiprocesseurs.","html":"<p>Pipe plusieurs commandes ensemble. La sortie standard de la première commande devient la norme\nentrée de la deuxième commande. Toutes les commandes sont exécutées simultanément et le transfert de données s&#039;effectue via la mémoire.\ndes tampons. C&#039;est l&#039;une des constructions les plus puissantes d&#039;Unix. Composé les commandes peuvent aussi être\nutilisé avec des tuyaux. Les pipes jouent très bien avec les systèmes multiprocesseurs.</p>"},{"id":"text-265","type":"text","heading":"","plain_text":"Un seul pipeline dans un pipeline doit être interactif (tentative de lecture depuis\nle terminal). Cette construction est beaucoup plus efficace que l’utilisation de fichiers temporaires, et la plupart des\nLes utilitaires Unix sont conçus pour fonctionner correctement dans les pipelines.","html":"<p>Un seul pipeline dans un pipeline doit être interactif (tentative de lecture depuis\nle terminal). Cette construction est beaucoup plus efficace que l’utilisation de fichiers temporaires, et la plupart des\nLes utilitaires Unix sont conçus pour fonctionner correctement dans les pipelines.</p>"},{"id":"text-266","type":"text","heading":"","plain_text":"L&#39;état de sortie d&#39;un pipeline est l&#39;état de sortie de la dernière commande. Dans les commandes composées, un pipeline\npeut être utilisé n&#39;importe où une simple commande pourrait être utilisée.","html":"<p>L&#039;état de sortie d&#039;un pipeline est l&#039;état de sortie de la dernière commande. Dans les commandes composées, un pipeline\npeut être utilisé n&#039;importe où une simple commande pourrait être utilisée.</p>"},{"id":"text-267","type":"text","heading":"","plain_text":"(15)","html":"<p>(15)</p>"},{"id":"text-268","type":"text","heading":"","plain_text":"Les scripts shell peuvent générer directement des sorties ou lire des entrées dans des variables à l&#39;aide des commandes suivantes:\nSortie de script","html":"<p>Les scripts shell peuvent générer directement des sorties ou lire des entrées dans des variables à l&#039;aide des commandes suivantes:\nSortie de script</p>"},{"id":"text-269","type":"text","heading":"","plain_text":"écho","html":"<p>écho</p>"},{"id":"text-270","type":"text","heading":"","plain_text":"Imprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nUtilisez des guillemets pour préserver l’espacement. Echo comprend également les conventions d’échappement de type C.","html":"<p>Imprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nUtilisez des guillemets pour préserver l’espacement. Echo comprend également les conventions d’échappement de type C.</p>"},{"id":"text-271","type":"text","heading":"","plain_text":"Attention ça\nle shell peut traiter les barres obliques inverses avant écho    les voit (peut avoir besoin de doubler la barre oblique inverse).\nInterne dans la plupart des coquilles, mais était à l&#39;origine externe.","html":"<p>Attention ça\nle shell peut traiter les barres obliques inverses avant écho    les voit (peut avoir besoin de doubler la barre oblique inverse).\nInterne dans la plupart des coquilles, mais était à l&#039;origine externe.</p>"},{"id":"text-272","type":"text","heading":"","plain_text":"b \n        retour arrière \n     c \n        ligne d&#39;impression sans nouvelle ligne (certaines versions)","html":"<p>b \n        retour arrière \n     c \n        ligne d&#039;impression sans nouvelle ligne (certaines versions)</p>"},{"id":"text-273","type":"text","heading":"","plain_text":"F \n        formulaire d&#39;alimentation \n n \n        nouvelle ligne","html":"<p>F \n        formulaire d&#039;alimentation \n n \n        nouvelle ligne</p>"},{"id":"text-274","type":"text","heading":"","plain_text":"r \n        retour chariot\n     t \n        languette","html":"<p>r \n        retour chariot\n     t \n        languette</p>"},{"id":"text-275","type":"text","heading":"","plain_text":"v \n        onglet vertical \n\\  \n    barre oblique inverse","html":"<p>v \n        onglet vertical \n\\  \n    barre oblique inverse</p>"},{"id":"text-276","type":"text","heading":"","plain_text":"0n où n est le caractère de 8 bits dont le code ASCII\n      code est le nombre octal à 1, 2 ou 3 chiffres\n      représentant ce personnage.","html":"<p>0n où n est le caractère de 8 bits dont le code ASCII\n      code est le nombre octal à 1, 2 ou 3 chiffres\n      représentant ce personnage.</p>"},{"id":"text-277","type":"text","heading":"","plain_text":"-n \nsupprimer newline","html":"<p>-n \nsupprimer newline</p>"},{"id":"text-278","type":"text","heading":"","plain_text":"impression    (ksh interne)","html":"<p>impression    (ksh interne)</p>"},{"id":"text-279","type":"text","heading":"","plain_text":"Imprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nPrint observe les mêmes conventions d&#39;échappement que l&#39;écho.","html":"<p>Imprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nPrint observe les mêmes conventions d&#039;échappement que l&#039;écho.</p>"},{"id":"text-280","type":"text","heading":"","plain_text":"-n","html":"<p>-n</p>"},{"id":"text-281","type":"text","heading":"","plain_text":"supprimer newline","html":"<p>supprimer newline</p>"},{"id":"text-282","type":"text","heading":"","plain_text":"-r","html":"<p>-r</p>"},{"id":"text-283","type":"text","heading":"","plain_text":"mode brut &#8211; ignore les conventions  -escape","html":"<p>mode brut &#8211; ignore les conventions  -escape</p>"},{"id":"text-284","type":"text","heading":"","plain_text":"-R","html":"<p>-R</p>"},{"id":"text-285","type":"text","heading":"","plain_text":"mode brut &#8211; ignore les conventions et les options  -escape sauf -n.","html":"<p>mode brut &#8211; ignore les conventions et les options  -escape sauf -n.</p>"},{"id":"text-286","type":"text","heading":"","plain_text":"Entrée de script","html":"<p>Entrée de script</p>"},{"id":"text-287","type":"text","heading":"","plain_text":"lis var1 var2 reste","html":"<p>lis var1 var2 reste</p>"},{"id":"text-288","type":"text","heading":"","plain_text":"lit une ligne de stdin, analyse de $ IFS et place les mots dans les variables nommées.\nTous les mots restants entrent tous dans la dernière variable. Un &#39;&#39; comme dernier caractère d&#39;une ligne\nsupprime l’importance de la nouvelle ligne et l’entrée continue avec la ligne suivante.","html":"<p>lit une ligne de stdin, analyse de $ IFS et place les mots dans les variables nommées.\nTous les mots restants entrent tous dans la dernière variable. Un &#039;&#039; comme dernier caractère d&#039;une ligne\nsupprime l’importance de la nouvelle ligne et l’entrée continue avec la ligne suivante.</p>"},{"id":"text-289","type":"text","heading":"","plain_text":"-r","html":"<p>-r</p>"},{"id":"text-290","type":"text","heading":"","plain_text":"mode brut &#8211; ignore les conventions  -escape","html":"<p>mode brut &#8211; ignore les conventions  -escape</p>"},{"id":"text-291","type":"text","heading":"","plain_text":"Exemple: affichage ex4a, texte","html":"<p>Exemple: affichage ex4a, texte</p>"},{"id":"text-292","type":"text","heading":"","plain_text":"1: #! / bin / sh\n            2: écho &quot;Test de la saisie utilisateur interactive: saisissez quelques touches et appuyez sur la touche Retour&quot;\n   3: lis x plus\n   4: écho &quot;Le premier mot était &quot;$ x &quot;&quot;\n   5: écho &quot;Le reste de la ligne (le cas échéant) était &quot;$ plus &quot;&quot;","html":"<p>1: #! / bin / sh\n            2: écho &quot;Test de la saisie utilisateur interactive: saisissez quelques touches et appuyez sur la touche Retour&quot;\n   3: lis x plus\n   4: écho &quot;Le premier mot était &quot;$ x &quot;&quot;\n   5: écho &quot;Le reste de la ligne (le cas échéant) était &quot;$ plus &quot;&quot;</p>"},{"id":"text-293","type":"text","heading":"","plain_text":"(16)","html":"<p>(16)</p>"},{"id":"text-294","type":"text","heading":"","plain_text":"La plupart des opérateurs de contrôle de flux utiles impliquent de faire des tests conditionnels et\nbranchement sur le résultat (vrai / faux). Le test peut être soit le tester\ncommande, ou son alias, [[[[, ou le ksh / bash intégré [[[[[ ... ]]\ncommande, qui a des options légèrement différentes, ou il peut être toute commande qui retourne\nun statut de sortie approprié. Zéro est considéré comme &quot;vrai&quot;, tandis que toute valeur autre que zéro est &quot;faux&quot;.\nNotez que ceci est inversé par rapport à la convention du langage C.\nTests de fichiers","html":"<p>La plupart des opérateurs de contrôle de flux utiles impliquent de faire des tests conditionnels et\nbranchement sur le résultat (vrai / faux). Le test peut être soit le tester\ncommande, ou son alias, [[[[, ou le ksh / bash intégré [[[[[ ... ]]\ncommande, qui a des options légèrement différentes, ou il peut être toute commande qui retourne\nun statut de sortie approprié. Zéro est considéré comme &quot;vrai&quot;, tandis que toute valeur autre que zéro est &quot;faux&quot;.\nNotez que ceci est inversé par rapport à la convention du langage C.\nTests de fichiers</p>"},{"id":"text-295","type":"text","heading":"","plain_text":"-e fichier","html":"<p>-e fichier</p>"},{"id":"text-296","type":"text","heading":"","plain_text":"Vrai si fichier existe (peut être de tout type).","html":"<p>Vrai si fichier existe (peut être de tout type).</p>"},{"id":"text-297","type":"text","heading":"","plain_text":"-F fichier","html":"<p>-F fichier</p>"},{"id":"text-298","type":"text","heading":"","plain_text":"Vrai si fichier existe et est un fichier ordinaire.","html":"<p>Vrai si fichier existe et est un fichier ordinaire.</p>"},{"id":"text-299","type":"text","heading":"","plain_text":"-ré fichier","html":"<p>-ré fichier</p>"},{"id":"text-300","type":"text","heading":"","plain_text":"Vrai si fichier existe et est un répertoire.","html":"<p>Vrai si fichier existe et est un répertoire.</p>"},{"id":"text-301","type":"text","heading":"","plain_text":"-r fichier","html":"<p>-r fichier</p>"},{"id":"text-302","type":"text","heading":"","plain_text":"Vrai si fichier existe et est lisibleDe même, -w    = accessible en écriture, -X    = exécutable, -L    = est un lien symbolique.","html":"<p>Vrai si fichier existe et est lisibleDe même, -w    = accessible en écriture, -X    = exécutable, -L    = est un lien symbolique.</p>"},{"id":"text-303","type":"text","heading":"","plain_text":"-s fichier","html":"<p>-s fichier</p>"},{"id":"text-304","type":"text","heading":"","plain_text":"Vrai si fichier existe et a une taille supérieure à zéro","html":"<p>Vrai si fichier existe et a une taille supérieure à zéro</p>"},{"id":"text-305","type":"text","heading":"","plain_text":"-t archiveur de notes","html":"<p>-t archiveur de notes</p>"},{"id":"text-306","type":"text","heading":"","plain_text":"Vrai si l&#39;ouvert archiveur de notes est associé à un terminal. Par exemple. c&#39;est\nutilisé pour déterminer si la sortie standard a été redirigée vers un fichier.","html":"<p>Vrai si l&#039;ouvert archiveur de notes est associé à un terminal. Par exemple. c&#039;est\nutilisé pour déterminer si la sortie standard a été redirigée vers un fichier.</p>"},{"id":"text-307","type":"text","heading":"","plain_text":"Tests de chaînes de caractères","html":"<p>Tests de chaînes de caractères</p>"},{"id":"text-308","type":"text","heading":"","plain_text":"-n &quot;chaîne&quot;","html":"<p>-n &quot;chaîne&quot;</p>"},{"id":"text-309","type":"text","heading":"","plain_text":"vrai si chaîne a une longueur non nulle","html":"<p>vrai si chaîne a une longueur non nulle</p>"},{"id":"text-310","type":"text","heading":"","plain_text":"-z &quot;chaîne&quot;","html":"<p>-z &quot;chaîne&quot;</p>"},{"id":"text-311","type":"text","heading":"","plain_text":"vrai si chaîne a une longueur nulle","html":"<p>vrai si chaîne a une longueur nulle</p>"},{"id":"text-312","type":"text","heading":"","plain_text":"Avec [[[[, l&#39;argument doit être cité, car s&#39;il s&#39;agit d&#39;une variable\na une valeur nulle, l&#39;expansion résultante ( [ -z ] ) est une erreur de syntaxe. Un\nles extensions générant &quot;&quot; comptent comme une chaîne nulle.  Pour [[[[    seulement, un cité\nla chaîne seule est équivalente au test -n, par ex. [ « $var » ]. Dans les coquilles plus anciennes pour lesquelles\n[[[[    est un programme externe, le seul moyen de tester une chaîne nulle est:si [ \"X€var\" = \"X\" ]C&#39;est rarement nécessaire maintenant, mais on le trouve encore souvent.","html":"<p>Avec [[[[, l&#039;argument doit être cité, car s&#039;il s&#039;agit d&#039;une variable\na une valeur nulle, l&#039;expansion résultante ( [ -z ] ) est une erreur de syntaxe. Un\nles extensions générant &quot;&quot; comptent comme une chaîne nulle.  Pour [[[[    seulement, un cité\nla chaîne seule est équivalente au test -n, par ex. [ « $var » ]. Dans les coquilles plus anciennes pour lesquelles\n[[[[    est un programme externe, le seul moyen de tester une chaîne nulle est:si [ &quot;X€var&quot; = &quot;X&quot; ]C&#039;est rarement nécessaire maintenant, mais on le trouve encore souvent.</p>"},{"id":"text-313","type":"text","heading":"","plain_text":"$ variable = texte","html":"<p>$ variable = texte</p>"},{"id":"text-314","type":"text","heading":"","plain_text":"Vrai si $ variable allumettes texte.","html":"<p>Vrai si $ variable allumettes texte.</p>"},{"id":"text-315","type":"text","heading":"","plain_text":"$ variable &lt; texte","html":"<p>$ variable &lt; texte</p>"},{"id":"text-316","type":"text","heading":"","plain_text":"Vrai si $ variable vient avant (lexicalement) texteDe même, &gt;    = vient après","html":"<p>Vrai si $ variable vient avant (lexicalement) texteDe même, &gt;    = vient après</p>"},{"id":"text-317","type":"text","heading":"","plain_text":"(17)","html":"<p>(17)</p>"},{"id":"text-318","type":"text","heading":"","plain_text":"Arithmetic tests","html":"<p>Arithmetic tests</p>"},{"id":"text-319","type":"text","heading":"","plain_text":"$variable -eq  nombre","html":"<p>$variable -eq  nombre</p>"},{"id":"text-320","type":"text","heading":"","plain_text":"True if $variable, interpreted as a number, is equal to nombre.","html":"<p>True if $variable, interpreted as a number, is equal to nombre.</p>"},{"id":"text-321","type":"text","heading":"","plain_text":"$variable -ne  nombre","html":"<p>$variable -ne  nombre</p>"},{"id":"text-322","type":"text","heading":"","plain_text":"True if $variable, interpreted as a number, is ne pas égal à nombre.De même, -lt    = less than, -le    = less than or equal,\n-gt    = greater than, -ge    = greater than or equal","html":"<p>True if $variable, interpreted as a number, is ne pas égal à nombre.De même, -lt    = less than, -le    = less than or equal,\n-gt    = greater than, -ge    = greater than or equal</p>"},{"id":"text-323","type":"text","heading":"","plain_text":"Additional tests for [[&#8230;]](ksh and bash)","html":"<p>Additional tests for [[&#8230;]](ksh and bash)</p>"},{"id":"text-324","type":"text","heading":"","plain_text":"$variable = modèle","html":"<p>$variable = modèle</p>"},{"id":"text-325","type":"text","heading":"","plain_text":"True if $variable allumettes modèle. Si modèle contains no wildcards,\nthen this is just an exact text match.  The same wildcards as used for filename matching are used.","html":"<p>True if $variable allumettes modèle. Si modèle contains no wildcards,\nthen this is just an exact text match.  The same wildcards as used for filename matching are used.</p>"},{"id":"text-326","type":"text","heading":"","plain_text":"le modèle must not be quoted. Puisque [[&#8230;]]is internal to the shell, the pattern in this case is\ntreated differently and not filename-expanded as an external command would require.","html":"<p>le modèle must not be quoted. Puisque [[&#8230;]]is internal to the shell, the pattern in this case is\ntreated differently and not filename-expanded as an external command would require.</p>"},{"id":"text-327","type":"text","heading":"","plain_text":"file1 -nt file2","html":"<p>file1 -nt file2</p>"},{"id":"text-328","type":"text","heading":"","plain_text":"True if file1 is newer than file2.  De même -ot    = older than","html":"<p>True if file1 is newer than file2.  De même -ot    = older than</p>"},{"id":"text-329","type":"text","heading":"","plain_text":"file1 -ef file2","html":"<p>file1 -ef file2</p>"},{"id":"text-330","type":"text","heading":"","plain_text":"true if file1 is effectively the same as file2, after following\nsymlinks and hard links.","html":"<p>true if file1 is effectively the same as file2, after following\nsymlinks and hard links.</p>"},{"id":"text-331","type":"text","heading":"","plain_text":"Negating and Combining tests\nTests may be negated by prepending the !    operator, and combined with boolean\nET et OU operators using the syntax:","html":"<p>Negating and Combining tests\nTests may be negated by prepending the !    operator, and combined with boolean\nET et OU operators using the syntax:</p>"},{"id":"text-332","type":"text","heading":"","plain_text":"conditionnel -a conditionnel, conditionnel -o conditionnel","html":"<p>conditionnel -a conditionnel, conditionnel -o conditionnel</p>"},{"id":"text-333","type":"text","heading":"","plain_text":"ET et OU syntax for tester    et [[[[","html":"<p>ET et OU syntax for tester    et [[[[</p>"},{"id":"text-334","type":"text","heading":"","plain_text":"conditionnel &amp;&amp; conditionnel, conditionnel || conditionnel","html":"<p>conditionnel &amp;&amp; conditionnel, conditionnel || conditionnel</p>"},{"id":"text-335","type":"text","heading":"","plain_text":"ET et OU syntax for [[[[[ ... ]]","html":"<p>ET et OU syntax for [[[[[ ... ]]</p>"},{"id":"text-336","type":"text","heading":"","plain_text":"Parentheses may be inserted to resolve ambiguities or override the default operator precedence rules.","html":"<p>Parentheses may be inserted to resolve ambiguities or override the default operator precedence rules.</p>"},{"id":"text-337","type":"text","heading":"","plain_text":"Exemples:","html":"<p>Exemples:</p>"},{"id":"text-338","type":"text","heading":"","plain_text":"si [[  -x /usr/local/bin/lserve && \n       -w /var/logs/lserve.log ]]; puis\n   /usr/local/bin/lserve &gt;&gt; /var/logs/lserve.log &amp;\nfi","html":"<p>si [[  -x /usr/local/bin/lserve &amp;&amp; \n       -w /var/logs/lserve.log ]]; puis\n   /usr/local/bin/lserve &gt;&gt; /var/logs/lserve.log &amp;\nfi</p>"},{"id":"text-339","type":"text","heading":"","plain_text":"pwent=`grep &#39;^richard:&#39; /etc/passwd`\nsi [ -z \"$pwent\" ]; puis\n   echo richard not found\nfi","html":"<p>pwent=`grep &#039;^richard:&#039; /etc/passwd`\nsi [ -z &quot;$pwent&quot; ]; puis\n   echo richard not found\nfi</p>"},{"id":"text-340","type":"text","heading":"","plain_text":"(18)","html":"<p>(18)</p>"},{"id":"text-341","type":"text","heading":"","plain_text":"UNE liste in these descriptions is a simple command, or a pipeline.\nThe value of the liste is the value of the last simple command run in it.","html":"<p>UNE liste in these descriptions is a simple command, or a pipeline.\nThe value of the liste is the value of the last simple command run in it.</p>"},{"id":"text-342","type":"text","heading":"","plain_text":"UNE liste can also be a set of simple commands or\npipelines separated by &quot;;,&amp;,&amp;&amp;,||,|&amp;&quot;.\nFor the compound commands which branch on the success or failure\nde certaines liste,  it is usually [[[[    ou [[[[[[[[, but can be anything.","html":"<p>UNE liste can also be a set of simple commands or\npipelines separated by &quot;;,&amp;,&amp;&amp;,||,|&amp;&quot;.\nFor the compound commands which branch on the success or failure\nde certaines liste,  it is usually [[[[    ou [[[[[[[[, but can be anything.</p>"},{"id":"text-343","type":"text","heading":"","plain_text":"Conditional execution: if/else","html":"<p>Conditional execution: if/else</p>"},{"id":"text-344","type":"text","heading":"","plain_text":"liste &amp;&amp; liste","html":"<p>liste &amp;&amp; liste</p>"},{"id":"text-345","type":"text","heading":"","plain_text":"Execute the first liste. If true (success), execute the second one.","html":"<p>Execute the first liste. If true (success), execute the second one.</p>"},{"id":"text-346","type":"text","heading":"","plain_text":"liste || liste","html":"<p>liste || liste</p>"},{"id":"text-347","type":"text","heading":"","plain_text":"Execute the first liste. If false (failure), execute the second one.","html":"<p>Execute the first liste. If false (failure), execute the second one.</p>"},{"id":"text-348","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-349","type":"text","heading":"","plain_text":"mkdir tempdir &amp;&amp; cp workfile tempdir","html":"<p>mkdir tempdir &amp;&amp; cp workfile tempdir</p>"},{"id":"text-350","type":"text","heading":"","plain_text":"sshd || echo &quot;sshd failed to start&quot;","html":"<p>sshd || echo &quot;sshd failed to start&quot;</p>"},{"id":"text-351","type":"text","heading":"","plain_text":"You can use both forms together (with care) &#8211; they are processed left to right, and &amp;&amp; must come first.\nExemple:","html":"<p>You can use both forms together (with care) &#8211; they are processed left to right, and &amp;&amp; must come first.\nExemple:</p>"},{"id":"text-352","type":"text","heading":"","plain_text":"mkdir tempdir &amp;&amp; cp workfile tempdir || \n echo &quot;Failed to create tempdir&quot;","html":"<p>mkdir tempdir &amp;&amp; cp workfile tempdir || \n echo &quot;Failed to create tempdir&quot;</p>"},{"id":"text-353","type":"text","heading":"","plain_text":"si liste; puis liste ; elif liste; puis liste; autre liste; fi","html":"<p>si liste; puis liste ; elif liste; puis liste; autre liste; fi</p>"},{"id":"text-354","type":"text","heading":"","plain_text":"Execute the first liste, and if true (success), execute the &quot;then&quot; list, otherwise\nexecute the &quot;else&quot; list.  The &quot;elif&quot;  and &quot;else&quot; lists are optional.","html":"<p>Execute the first liste, and if true (success), execute the &quot;then&quot; list, otherwise\nexecute the &quot;else&quot; list.  The &quot;elif&quot;  and &quot;else&quot; lists are optional.</p>"},{"id":"text-355","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-356","type":"text","heading":"","plain_text":"si [ -r $myfile ]\npuis\n   cat $myfile\nautre\n   echo $myfile not readable\nfi","html":"<p>si [ -r $myfile ]\npuis\n   cat $myfile\nautre\n   echo $myfile not readable\nfi</p>"},{"id":"text-357","type":"text","heading":"","plain_text":"Looping: &#39;while&#39; and &#39;for&#39; loops","html":"<p>Looping: &#039;while&#039; and &#039;for&#039; loops</p>"},{"id":"text-358","type":"text","heading":"","plain_text":"tandis que liste; faire liste; terminé\njusqu&#39;à ce que liste; faire liste; terminé","html":"<p>tandis que liste; faire liste; terminé\njusqu&#039;à ce que liste; faire liste; terminé</p>"},{"id":"text-359","type":"text","heading":"","plain_text":"Execute the first liste and if true (success), execute the second liste. Repeat as\nlong as the first liste est vrai. le jusqu&#39;à ce que    form just negates the test.","html":"<p>Execute the first liste and if true (success), execute the second liste. Repeat as\nlong as the first liste est vrai. le jusqu&#039;à ce que    form just negates the test.</p>"},{"id":"text-360","type":"text","heading":"","plain_text":"Exemple: ex4 display, text","html":"<p>Exemple: ex4 display, text</p>"},{"id":"text-361","type":"text","heading":"","plain_text":"1: #!/bin/ksh\n            2: count=0\n   3: max=dix\n   4: tandis que [[[[[[[[$count -lt $max ]]\n   5: faire \n            6:   écho $count\n            7:   count=$((count + 1))\n            8: terminé\n            9: écho &quot;Value of count after loop is: $count&quot;","html":"<p>1: #!/bin/ksh\n            2: count=0\n   3: max=dix\n   4: tandis que [[[[[[[[$count -lt $max ]]\n   5: faire \n            6:   écho $count\n            7:   count=$((count + 1))\n            8: terminé\n            9: écho &quot;Value of count after loop is: $count&quot;</p>"},{"id":"text-362","type":"text","heading":"","plain_text":"pour identifiant [in[in[in[inmots ]; do; liste; terminé","html":"<p>pour identifiant [in[in[in[inmots ]; do; liste; terminé</p>"},{"id":"text-363","type":"text","heading":"","plain_text":"Ensemble identifiant in turn to each word in  mots and execute the liste.\nOmitting the &quot;in mots&quot; clause implies using $@, i.e. the identifiant est mis en\nturn to each positional argument.","html":"<p>Ensemble identifiant in turn to each word in  mots and execute the liste.\nOmitting the &quot;in mots&quot; clause implies using $@, i.e. the identifiant est mis en\nturn to each positional argument.</p>"},{"id":"text-364","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-365","type":"text","heading":"","plain_text":"for file in *.dat\nfaire\n    echo Processing $file\nterminé","html":"<p>for file in *.dat\nfaire\n    echo Processing $file\nterminé</p>"},{"id":"text-366","type":"text","heading":"","plain_text":"As with most programming languages, there are often several ways to express the same action.\nRunning a command and then explicitly examining $?    can be used instead of some of the above.","html":"<p>As with most programming languages, there are often several ways to express the same action.\nRunning a command and then explicitly examining $?    can be used instead of some of the above.</p>"},{"id":"text-367","type":"text","heading":"","plain_text":"Compound commands can be thought of as running in an implicit subshell. Ils\ncan have I/O redirection independant of the rest of the script.  Setting of variables in a real subshell does not\nleave them set in the parent script.  Setting variables in implicit subshells varies in behaviour among shells.\nOlder sh    could not set variables in an implicit subshell and then use them later,\nbut current ksh    can do this (mostly).","html":"<p>Compound commands can be thought of as running in an implicit subshell. Ils\ncan have I/O redirection independant of the rest of the script.  Setting of variables in a real subshell does not\nleave them set in the parent script.  Setting variables in implicit subshells varies in behaviour among shells.\nOlder sh    could not set variables in an implicit subshell and then use them later,\nbut current ksh    can do this (mostly).</p>"},{"id":"text-368","type":"text","heading":"","plain_text":"Exemple: ex11 display, textReading a file line by line.  The book by Randal Michael contains 12 example ways to read a file line by line,\nwhich vary tremendously in efficiency.  This example shows the simplest and fastest way.","html":"<p>Exemple: ex11 display, textReading a file line by line.  The book by Randal Michael contains 12 example ways to read a file line by line,\nwhich vary tremendously in efficiency.  This example shows the simplest and fastest way.</p>"},{"id":"text-369","type":"text","heading":"","plain_text":"1: #!/bin/sh\n            2: \n            3: # Demonstrate reading a file line-by-line, using I/O\n            4: # redirection in a compound command\n            5: # Also test variable setting inside an implicit subshell.\n            6: # Test this under sh and ksh and compare the output.\n            7: \n            8: line=&quot;TEST&quot;\n   9: save=\n        10: \n        11: si [-z&quot;[-z&quot;[-z\"[-z\"$1&quot; ]; puis\n        12:    écho &quot;Usage: 0 $ filename&quot;\n  13: autre\n        14:    si [-r[-r[-r[-r$1 ]; puis\n        15:       tandis que read line; faire\n        16:          écho &quot;$line&quot;\n  17:          save=$line\n        18:       terminé &lt; $1\n        19:    fi\n        20: fi\n        21: écho &quot;End value of $line est $line&quot;\n  22: écho &quot;End value of $save est $save&quot;","html":"<p>1: #!/bin/sh\n            2: \n            3: # Demonstrate reading a file line-by-line, using I/O\n            4: # redirection in a compound command\n            5: # Also test variable setting inside an implicit subshell.\n            6: # Test this under sh and ksh and compare the output.\n            7: \n            8: line=&quot;TEST&quot;\n   9: save=\n        10: \n        11: si [-z&quot;[-z&quot;[-z&quot;[-z&quot;$1&quot; ]; puis\n        12:    écho &quot;Usage: 0 $ filename&quot;\n  13: autre\n        14:    si [-r[-r[-r[-r$1 ]; puis\n        15:       tandis que read line; faire\n        16:          écho &quot;$line&quot;\n  17:          save=$line\n        18:       terminé &lt; $1\n        19:    fi\n        20: fi\n        21: écho &quot;End value of $line est $line&quot;\n  22: écho &quot;End value of $save est $save&quot;</p>"},{"id":"text-370","type":"text","heading":"","plain_text":"(19)","html":"<p>(19)</p>"},{"id":"text-371","type":"text","heading":"","plain_text":"Case statement: pattern matching","html":"<p>Case statement: pattern matching</p>"},{"id":"text-372","type":"text","heading":"","plain_text":"Cas mot dans modèle) liste;; esac","html":"<p>Cas mot dans modèle) liste;; esac</p>"},{"id":"text-373","type":"text","heading":"","plain_text":"Comparer mot avec chaque modèle) in turn, and executes the first liste\npour lequel le mot allumettes. le les patrons follow the same rules as for filename\nwildcards.","html":"<p>Comparer mot avec chaque modèle) in turn, and executes the first liste\npour lequel le mot allumettes. le les patrons follow the same rules as for filename\nwildcards.</p>"},{"id":"text-374","type":"text","heading":"","plain_text":"(ksh and bash only)\nA pattern-list is a list of one or more  patterns  separated\nfrom  each  other with a |. Composite patterns can be formed\nwith one or more of the following:","html":"<p>(ksh and bash only)\nA pattern-list is a list of one or more  patterns  separated\nfrom  each  other with a |. Composite patterns can be formed\nwith one or more of the following:</p>"},{"id":"text-375","type":"text","heading":"","plain_text":"?(pattern-list)","html":"<p>?(pattern-list)</p>"},{"id":"text-376","type":"text","heading":"","plain_text":"Optionally matches any one of the given patterns.","html":"<p>Optionally matches any one of the given patterns.</p>"},{"id":"text-377","type":"text","heading":"","plain_text":"*(pattern-list)","html":"<p>*(pattern-list)</p>"},{"id":"text-378","type":"text","heading":"","plain_text":"Matches  zero  or  more  occurrences  of   the   given  patterns.","html":"<p>Matches  zero  or  more  occurrences  of   the   given  patterns.</p>"},{"id":"text-379","type":"text","heading":"","plain_text":"+(pattern-list)","html":"<p>+(pattern-list)</p>"},{"id":"text-380","type":"text","heading":"","plain_text":"Matches one or more occurrences of the given patterns.","html":"<p>Matches one or more occurrences of the given patterns.</p>"},{"id":"text-381","type":"text","heading":"","plain_text":"@(pattern-list)","html":"<p>@(pattern-list)</p>"},{"id":"text-382","type":"text","heading":"","plain_text":"Matches exactly one of the given patterns.","html":"<p>Matches exactly one of the given patterns.</p>"},{"id":"text-383","type":"text","heading":"","plain_text":"!(pattern-list)","html":"<p>!(pattern-list)</p>"},{"id":"text-384","type":"text","heading":"","plain_text":"Matches anything, except one of the given patterns.","html":"<p>Matches anything, except one of the given patterns.</p>"},{"id":"text-385","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-386","type":"text","heading":"","plain_text":"case $filename in\n    *.dat)\n        echo Processing a .dat file\n        ;;\n    *.sas)\n        echo Processing a .sas file\n        ;;\n    *)\n        # catch anything else that doesn&#39;t match patterns\n        echo &quot;Don&#39;t know how to deal with $filename&quot;\n        ;;\n    esac","html":"<p>case $filename in\n    *.dat)\n        echo Processing a .dat file\n        ;;\n    *.sas)\n        echo Processing a .sas file\n        ;;\n    *)\n        # catch anything else that doesn&#039;t match patterns\n        echo &quot;Don&#039;t know how to deal with $filename&quot;\n        ;;\n    esac</p>"},{"id":"text-387","type":"text","heading":"","plain_text":"Miscellaneous flow control and subshells\nPause [n]","html":"<p>Miscellaneous flow control and subshells\nPause [n]</p>"},{"id":"text-388","type":"text","heading":"","plain_text":"Break out of the current (or n&#39;th) enclosing loop.  Control jumps to the next statement\nafter the loop","html":"<p>Break out of the current (or n&#039;th) enclosing loop.  Control jumps to the next statement\nafter the loop</p>"},{"id":"text-389","type":"text","heading":"","plain_text":"continuer [n];","html":"<p>continuer [n];</p>"},{"id":"text-390","type":"text","heading":"","plain_text":"Resume iteration of the current (or n&#39;th) enclosing loop.  Control jumps to the top of the loop,\nwhich generally causes re-evaluation of a tandis que    or processing the next element of a\npour.","html":"<p>Resume iteration of the current (or n&#039;th) enclosing loop.  Control jumps to the top of the loop,\nwhich generally causes re-evaluation of a tandis que    or processing the next element of a\npour.</p>"},{"id":"text-391","type":"text","heading":"","plain_text":". nom de fichier","html":"<p>. nom de fichier</p>"},{"id":"text-392","type":"text","heading":"","plain_text":"Read the contents of the named file into the current shell and execute as if in line.  Uses $PATH\nto locate the file, and can be passed positional parameters.  This is often used to read in shell\nfunctions that are common to multiple scripts.  There are security implications if the pathname is not\nfully specified.","html":"<p>Read the contents of the named file into the current shell and execute as if in line.  Uses $PATH\nto locate the file, and can be passed positional parameters.  This is often used to read in shell\nfunctions that are common to multiple scripts.  There are security implications if the pathname is not\nfully specified.</p>"},{"id":"text-393","type":"text","heading":"","plain_text":"( ... )    Command grouping","html":"<p>( ... )    Command grouping</p>"},{"id":"text-394","type":"text","heading":"","plain_text":"Commands grouped in &quot;( )&quot; are executed in a subshell, with a separate environment\n(can not affect the variables in the rest of the script).  \n(20)","html":"<p>Commands grouped in &quot;( )&quot; are executed in a subshell, with a separate environment\n(can not affect the variables in the rest of the script).  \n(20)</p>"},{"id":"text-395","type":"text","heading":"","plain_text":"As with most aspects of shell scripting, there are usually several possible ways to accomplish\na task.  Certain idioms show up commonly.  These are five ways to examine and branch on the\ninitial character of a string.","html":"<p>As with most aspects of shell scripting, there are usually several possible ways to accomplish\na task.  Certain idioms show up commonly.  These are five ways to examine and branch on the\ninitial character of a string.</p>"},{"id":"text-396","type":"text","heading":"","plain_text":"Utilisation Cas    with a pattern:","html":"<p>Utilisation Cas    with a pattern:</p>"},{"id":"text-397","type":"text","heading":"","plain_text":"case $var in/*) echo &quot;starts with /&quot; ;; \nWorks in all shells, and uses no extra processes","html":"<p>case $var in/*) echo &quot;starts with /&quot; ;; \nWorks in all shells, and uses no extra processes</p>"},{"id":"text-398","type":"text","heading":"","plain_text":"Utilisation `cut`:","html":"<p>Utilisation `cut`:</p>"},{"id":"text-399","type":"text","heading":"","plain_text":"si [ \"`echo $var | cut -c1`\" = \"/\" ] ; puis .\nWorks in all shells, but inefficiently uses a pipe and external process for a trivial task.","html":"<p>si [ &quot;`echo $var | cut -c1`&quot; = &quot;/&quot; ] ; puis .\nWorks in all shells, but inefficiently uses a pipe and external process for a trivial task.</p>"},{"id":"text-400","type":"text","heading":"","plain_text":"Use POSIX variable truncation:","html":"<p>Use POSIX variable truncation:</p>"},{"id":"text-401","type":"text","heading":"","plain_text":"si [ \"$var%$var#?\" = \"/\" ]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Not obvious if you have not seen\nthis one before.  Fails on old Bourne shells.\nDave Taylor in &quot;Wicked Cool Shell Scripts&quot; likes this one.","html":"<p>si [ &quot;$var%$var#?&quot; = &quot;/&quot; ]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Not obvious if you have not seen\nthis one before.  Fails on old Bourne shells.\nDave Taylor in &quot;Wicked Cool Shell Scripts&quot; likes this one.</p>"},{"id":"text-402","type":"text","heading":"","plain_text":"Use POSIX  pattern match inside of [[&#8230;]]:","html":"<p>Use POSIX  pattern match inside of [[&#8230;]]:</p>"},{"id":"text-403","type":"text","heading":"","plain_text":"si [[ $var = /* ]]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Note that you must use [[&#8230;]]and no quotes around the pattern.","html":"<p>si [[ $var = /* ]]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Note that you must use [[&#8230;]]and no quotes around the pattern.</p>"},{"id":"text-404","type":"text","heading":"","plain_text":"le [[&#8230;]]syntax is handled internally by the shell and can therefore interpret &quot;wildcard&quot; patterns\ndifferently than an external command.  An unquoted wildcard is interpreted as a pattern to be matched,\nwhile a quoted wildcard is taken literally. le [&#8230;] syntax, even if handled internally, is treated\nas though it were external for backward compatability.  This requires that wildcard patterns be expanded\nto matching filenames.","html":"<p>le [[&#8230;]]syntax is handled internally by the shell and can therefore interpret &quot;wildcard&quot; patterns\ndifferently than an external command.  An unquoted wildcard is interpreted as a pattern to be matched,\nwhile a quoted wildcard is taken literally. le [&#8230;] syntax, even if handled internally, is treated\nas though it were external for backward compatability.  This requires that wildcard patterns be expanded\nto matching filenames.</p>"},{"id":"text-405","type":"text","heading":"","plain_text":"Use ksh (93 and later) and bash variable substrings:","html":"<p>Use ksh (93 and later) and bash variable substrings:</p>"},{"id":"text-406","type":"text","heading":"","plain_text":"si [ \"$var:0:1\" = \"/\" ]; puis\nksh93 and later versions, and bash, have a syntax for directly extracting substrings by character\nposition. $varname:start:length","html":"<p>si [ &quot;$var:0:1&quot; = &quot;/&quot; ]; puis\nksh93 and later versions, and bash, have a syntax for directly extracting substrings by character\nposition. $varname:start:length</p>"},{"id":"text-407","type":"text","heading":"","plain_text":"Exemple: ex17 display, text\n(21)","html":"<p>Exemple: ex17 display, text\n(21)</p>"},{"id":"text-408","type":"text","heading":"","plain_text":"The shells (ksh in particular) have many more internal commands.  Some are used more in interactive\nshells.  The commands listed here are used in scripts, but don&#39;t conveniently fit elsewhere in the\nclasse.","html":"<p>The shells (ksh in particular) have many more internal commands.  Some are used more in interactive\nshells.  The commands listed here are used in scripts, but don&#039;t conveniently fit elsewhere in the\nclasse.</p>"},{"id":"text-409","type":"text","heading":"","plain_text":"eval args","html":"<p>eval args</p>"},{"id":"text-410","type":"text","heading":"","plain_text":"The args are read as input to the shell and the resulting command executed.  Allows &quot;double&quot; expansion\nof some constructs.  For example, constructing a variable name out of pieces, and then obtaining the value\nof that variable.","html":"<p>The args are read as input to the shell and the resulting command executed.  Allows &quot;double&quot; expansion\nof some constructs.  For example, constructing a variable name out of pieces, and then obtaining the value\nof that variable.</p>"},{"id":"text-411","type":"text","heading":"","plain_text":"netdev=NETDEV_ \nNETDEV_1=hme0         # As part of an initialization step defining multiple devices","html":"<p>netdev=NETDEV_ \nNETDEV_1=hme0         # As part of an initialization step defining multiple devices</p>"},{"id":"text-412","type":"text","heading":"","plain_text":"devnum=1              # As part of a loop over those devices\nifname=$netdev€devnum # construct a variable name NETDEV_1\neval device=$$ifname # evaluate it - device is set to hme0","html":"<p>devnum=1              # As part of a loop over those devices\nifname=$netdev€devnum # construct a variable name NETDEV_1\neval device=$$ifname # evaluate it - device is set to hme0</p>"},{"id":"text-413","type":"text","heading":"","plain_text":"exec command args","html":"<p>exec command args</p>"},{"id":"text-414","type":"text","heading":"","plain_text":"The command is executed au lieu de the current shell.  There is no return from an exec.\nI/O redirection may be used.  This is also used to change the I/O for the current shell.","html":"<p>The command is executed au lieu de the current shell.  There is no return from an exec.\nI/O redirection may be used.  This is also used to change the I/O for the current shell.</p>"},{"id":"text-415","type":"text","heading":"","plain_text":":","html":"<p>:</p>"},{"id":"text-416","type":"text","heading":"","plain_text":"The line is variable-expanded, but otherwise treated as a comment. parfois\nused as a synonym for &quot;true&quot; in a loop.","html":"<p>The line is variable-expanded, but otherwise treated as a comment. parfois\nused as a synonym for &quot;true&quot; in a loop.</p>"},{"id":"text-417","type":"text","heading":"","plain_text":"while :; faire\n  # this loop will go forever until broken by \n  # a conditional test inside, or a signal\nterminé","html":"<p>while :; faire\n  # this loop will go forever until broken by \n  # a conditional test inside, or a signal\nterminé</p>"},{"id":"text-418","type":"text","heading":"","plain_text":"unset var ...","html":"<p>unset var ...</p>"},{"id":"text-419","type":"text","heading":"","plain_text":"Remove the named variables.  This is not the same as setting their values to null.","html":"<p>Remove the named variables.  This is not the same as setting their values to null.</p>"},{"id":"text-420","type":"text","heading":"","plain_text":"composer [+/- options]    [[[[prénom[=[=[=[=valeur]]...    (ksh only,\nbash uses déclarer    for similar functions)","html":"<p>composer [+/- options]    [[[[prénom[=[=[=[=valeur]]...    (ksh only,\nbash uses déclarer    for similar functions)</p>"},{"id":"text-421","type":"text","heading":"","plain_text":"Set attributes and values for shell variables and functions.  When used inside a function, a local\nvariable is created.  Some of the options are:","html":"<p>Set attributes and values for shell variables and functions.  When used inside a function, a local\nvariable is created.  Some of the options are:</p>"},{"id":"text-422","type":"text","heading":"","plain_text":"-L[n]","html":"<p>-L[n]</p>"},{"id":"text-423","type":"text","heading":"","plain_text":"Left justify and remove leading blanks.  The variable always has length n if specified.","html":"<p>Left justify and remove leading blanks.  The variable always has length n if specified.</p>"},{"id":"text-424","type":"text","heading":"","plain_text":"-R[n]","html":"<p>-R[n]</p>"},{"id":"text-425","type":"text","heading":"","plain_text":"Right justify and fill with leading blanks. The variable always has length n if specified.","html":"<p>Right justify and fill with leading blanks. The variable always has length n if specified.</p>"},{"id":"text-426","type":"text","heading":"","plain_text":"-l","html":"<p>-l</p>"},{"id":"text-427","type":"text","heading":"","plain_text":"The named variable is always treated as an integer.  This makes arithmetic faster.  The reserved word\n entier    is an alias for typeset -i.","html":"<p>The named variable is always treated as an integer.  This makes arithmetic faster.  The reserved word\n entier    is an alias for typeset -i.</p>"},{"id":"text-428","type":"text","heading":"","plain_text":"-Z[n]","html":"<p>-Z[n]</p>"},{"id":"text-429","type":"text","heading":"","plain_text":"As for -R, but fill with zeroes if the value is a number","html":"<p>As for -R, but fill with zeroes if the value is a number</p>"},{"id":"text-430","type":"text","heading":"","plain_text":"-je","html":"<p>-je</p>"},{"id":"text-431","type":"text","heading":"","plain_text":"Lower-case convert the named variables","html":"<p>Lower-case convert the named variables</p>"},{"id":"text-432","type":"text","heading":"","plain_text":"-u","html":"<p>-u</p>"},{"id":"text-433","type":"text","heading":"","plain_text":"Upper-case convert the named variables","html":"<p>Upper-case convert the named variables</p>"},{"id":"text-434","type":"text","heading":"","plain_text":"-r","html":"<p>-r</p>"},{"id":"text-435","type":"text","heading":"","plain_text":"Mark the variables as readonly","html":"<p>Mark the variables as readonly</p>"},{"id":"text-436","type":"text","heading":"","plain_text":"-x","html":"<p>-x</p>"},{"id":"text-437","type":"text","heading":"","plain_text":"Export the named variables to the enviroment","html":"<p>Export the named variables to the enviroment</p>"},{"id":"text-438","type":"text","heading":"","plain_text":"-ft","html":"<p>-ft</p>"},{"id":"text-439","type":"text","heading":"","plain_text":"The variables are taken as function names.  Turn on execution tracing.","html":"<p>The variables are taken as function names.  Turn on execution tracing.</p>"},{"id":"text-440","type":"text","heading":"","plain_text":"(22)","html":"<p>(22)</p>"},{"id":"text-441","type":"text","heading":"","plain_text":"Text variables\nle modèle in the following uses the same wildcards as for filename matching.","html":"<p>Text variables\nle modèle in the following uses the same wildcards as for filename matching.</p>"},{"id":"text-442","type":"text","heading":"","plain_text":"$#var","html":"<p>$#var</p>"},{"id":"text-443","type":"text","heading":"","plain_text":"returns the length of $var in characters","html":"<p>returns the length of $var in characters</p>"},{"id":"text-444","type":"text","heading":"","plain_text":"$var%pattern","html":"<p>$var%pattern</p>"},{"id":"text-445","type":"text","heading":"","plain_text":"removes the shortest suffix of $var patching modèle","html":"<p>removes the shortest suffix of $var patching modèle</p>"},{"id":"text-446","type":"text","heading":"","plain_text":"$var%%pattern","html":"<p>$var%%pattern</p>"},{"id":"text-447","type":"text","heading":"","plain_text":"removes the longest suffix of $var patching modèle","html":"<p>removes the longest suffix of $var patching modèle</p>"},{"id":"text-448","type":"text","heading":"","plain_text":"$var#pattern","html":"<p>$var#pattern</p>"},{"id":"text-449","type":"text","heading":"","plain_text":"removes the shortest prefix of $var patching modèle","html":"<p>removes the shortest prefix of $var patching modèle</p>"},{"id":"text-450","type":"text","heading":"","plain_text":"$var##pattern","html":"<p>$var##pattern</p>"},{"id":"text-451","type":"text","heading":"","plain_text":"removes the longest prefix of $var patching modèle","html":"<p>removes the longest prefix of $var patching modèle</p>"},{"id":"text-452","type":"text","heading":"","plain_text":"Numeric variables","html":"<p>Numeric variables</p>"},{"id":"text-453","type":"text","heading":"","plain_text":"$((  integer expression  ))","html":"<p>$((  integer expression  ))</p>"},{"id":"text-454","type":"text","heading":"","plain_text":"The $(( &#8230; )) construction interprets the contents as an arithmetic\nexpression (integer only).  Variables are referenced by name without the &quot;$&quot;.  Most of the arithmetic\nsyntax of the &#39;C&#39; language is supported, including bit manipulations\n (*,/,+,-,|,&amp;,&lt;&gt;. Use parentheses for changing precedence).","html":"<p>The $(( &#8230; )) construction interprets the contents as an arithmetic\nexpression (integer only).  Variables are referenced by name without the &quot;$&quot;.  Most of the arithmetic\nsyntax of the &#039;C&#039; language is supported, including bit manipulations\n (*,/,+,-,|,&amp;,&lt;&gt;. Use parentheses for changing precedence).</p>"},{"id":"text-455","type":"text","heading":"","plain_text":"Exemples\ndatapath=/data/public/project/trials/set1/datafile.dat","html":"<p>Exemples\ndatapath=/data/public/project/trials/set1/datafile.dat</p>"},{"id":"text-456","type":"text","heading":"","plain_text":"filename=$datapath##*/","html":"<p>filename=$datapath##*/</p>"},{"id":"text-457","type":"text","heading":"","plain_text":"nom de fichier    is set to &quot;datafile.dat&quot; since the longest préfixe\npattern matching &quot;*/&quot; is the\nleading directory path (compare basename)","html":"<p>nom de fichier    is set to &quot;datafile.dat&quot; since the longest préfixe\npattern matching &quot;*/&quot; is the\nleading directory path (compare basename)</p>"},{"id":"text-458","type":"text","heading":"","plain_text":"path=$datapath%/*","html":"<p>path=$datapath%/*</p>"},{"id":"text-459","type":"text","heading":"","plain_text":"chemin    is set to &quot;/data/public/project/trials/set1&quot; since the shortest suffixe\npattern matching &quot;/*&quot; is the\nfilename in the last directory (compare dirname)","html":"<p>chemin    is set to &quot;/data/public/project/trials/set1&quot; since the shortest suffixe\npattern matching &quot;/*&quot; is the\nfilename in the last directory (compare dirname)</p>"},{"id":"text-460","type":"text","heading":"","plain_text":"i=$((i+1))","html":"<p>i=$((i+1))</p>"},{"id":"text-461","type":"text","heading":"","plain_text":"often used in tandis que    boucles","html":"<p>often used in tandis que    boucles</p>"},{"id":"text-462","type":"text","heading":"","plain_text":"(23)","html":"<p>(23)</p>"},{"id":"text-463","type":"text","heading":"","plain_text":"All but the earliest versions of sh    allow you define shell functions, which are visible only\nto the shell script and can be used like any other command.  Shell functions take precedence over\nexternal commands if the same name is used.  Functions execute in the same process as the caller,\nand must be defined before use (appear earlier in the file).  They allow a script to be broken\ninto maintainable chunks, and encourage code reuse between scripts.\nDefining functions","html":"<p>All but the earliest versions of sh    allow you define shell functions, which are visible only\nto the shell script and can be used like any other command.  Shell functions take precedence over\nexternal commands if the same name is used.  Functions execute in the same process as the caller,\nand must be defined before use (appear earlier in the file).  They allow a script to be broken\ninto maintainable chunks, and encourage code reuse between scripts.\nDefining functions</p>"},{"id":"text-464","type":"text","heading":"","plain_text":"identifiant()  liste;","html":"<p>identifiant()  liste;</p>"},{"id":"text-465","type":"text","heading":"","plain_text":"POSIX syntax for shell functions.  Such functions do not restrict scope of variables\nor signal traps.\nThe identifier follows the rules for variable names,\nbut uses a separate namespace.","html":"<p>POSIX syntax for shell functions.  Such functions do not restrict scope of variables\nor signal traps.\nThe identifier follows the rules for variable names,\nbut uses a separate namespace.</p>"},{"id":"text-466","type":"text","heading":"","plain_text":"une fonction identifiant  liste;","html":"<p>une fonction identifiant  liste;</p>"},{"id":"text-467","type":"text","heading":"","plain_text":"Ksh and bash optional syntax for defining a function.  These functions may define local\nvariables and local signal\ntraps and so can more easily avoid side effects and be reused by multiple scripts.","html":"<p>Ksh and bash optional syntax for defining a function.  These functions may define local\nvariables and local signal\ntraps and so can more easily avoid side effects and be reused by multiple scripts.</p>"},{"id":"text-468","type":"text","heading":"","plain_text":"A function may read or modify any shell variable that exists in the calling script.  Such variables\nsont global.","html":"<p>A function may read or modify any shell variable that exists in the calling script.  Such variables\nsont global.</p>"},{"id":"text-469","type":"text","heading":"","plain_text":"(ksh and bash only) Functions may also declare local variables in the function using composer    ou\ndéclarer.\nLocal variables are visible to the current function and any functions called by it.","html":"<p>(ksh and bash only) Functions may also declare local variables in the function using composer    ou\ndéclarer.\nLocal variables are visible to the current function and any functions called by it.</p>"},{"id":"text-470","type":"text","heading":"","plain_text":"revenir [n], sortie [n]","html":"<p>revenir [n], sortie [n]</p>"},{"id":"text-471","type":"text","heading":"","plain_text":"Return from a function with the given value, or exit the whole script with the given value.","html":"<p>Return from a function with the given value, or exit the whole script with the given value.</p>"},{"id":"text-472","type":"text","heading":"","plain_text":"Sans un revenir, the function returns when it reaches the end, and the value is the\nexit status of the last command it ran.","html":"<p>Sans un revenir, the function returns when it reaches the end, and the value is the\nexit status of the last command it ran.</p>"},{"id":"text-473","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-474","type":"text","heading":"","plain_text":"die()","html":"<p>die()</p>"},{"id":"text-475","type":"text","heading":"","plain_text":"   # Print an error message and exit with given status\n   # call as: die status &quot;message&quot; [\"message\" ...]\n   exitstat=$1; décalage\n   for i in &quot;$@&quot;; faire\n      print -R &quot;$i&quot;\n   terminé\n   exit $exitstat","html":"<p>   # Print an error message and exit with given status\n   # call as: die status &quot;message&quot; [&quot;message&quot; ...]\n   exitstat=$1; décalage\n   for i in &quot;$@&quot;; faire\n      print -R &quot;$i&quot;\n   terminé\n   exit $exitstat</p>"},{"id":"text-476","type":"text","heading":"","plain_text":"Calling functions.\nFunctions are called like any other command.  The output may be redirected independantly of the\nscript, and arguments passed to the function.  Shell option flags like -x are unset in a function &#8211; you\nmust explicitly set them in each function to trace the execution.  Shell functions may even be backgrounded\nand run asynchronously, or run as coprocesses (ksh).","html":"<p>Calling functions.\nFunctions are called like any other command.  The output may be redirected independantly of the\nscript, and arguments passed to the function.  Shell option flags like -x are unset in a function &#8211; you\nmust explicitly set them in each function to trace the execution.  Shell functions may even be backgrounded\nand run asynchronously, or run as coprocesses (ksh).</p>"},{"id":"text-477","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-478","type":"text","heading":"","plain_text":"[ -w $filename ]    || \n  die 1 &quot;$file not writeable&quot; &quot;check permissions&quot;","html":"<p>[ -w $filename ]    || \n  die 1 &quot;$file not writeable&quot; &quot;check permissions&quot;</p>"},{"id":"text-479","type":"text","heading":"","plain_text":"Exemple: Backgrounded function call. ex12 display, text","html":"<p>Exemple: Backgrounded function call. ex12 display, text</p>"},{"id":"text-480","type":"text","heading":"","plain_text":"1: #!/bin/sh\n            2: \n            3: background()\n   4: \n   5:    sleep 10\n   6:    écho &quot;Background&quot;\n   7:    sleep 10\n   8:    # Function will return here - if backgrounded, the subprocess will exit.\n            9: \n  10: \n        11: écho &quot;ps before background function&quot;\n  12: ps\n  13: background &amp;\n  14: écho &quot;My PID=$$&quot;\n  15: écho &quot;Background function PID=$!&quot;\n  16: écho &quot;ps after background function&quot;\n  17: ps\n  18: sortie 0","html":"<p>1: #!/bin/sh\n            2: \n            3: background()\n   4: \n   5:    sleep 10\n   6:    écho &quot;Background&quot;\n   7:    sleep 10\n   8:    # Function will return here - if backgrounded, the subprocess will exit.\n            9: \n  10: \n        11: écho &quot;ps before background function&quot;\n  12: ps\n  13: background &amp;\n  14: écho &quot;My PID=$$&quot;\n  15: écho &quot;Background function PID=$!&quot;\n  16: écho &quot;ps after background function&quot;\n  17: ps\n  18: sortie 0</p>"},{"id":"text-481","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-482","type":"text","heading":"","plain_text":"vprint()","html":"<p>vprint()</p>"},{"id":"text-483","type":"text","heading":"","plain_text":"   # Print or not depending on global &quot;$verbosity&quot;\n   # Change the verbosity with a single variable.\n   # Arg. 1 is the level for this message.\n   level=$1; décalage\n   si [[ $level -le $verbosity ]]; puis\n      print -R $*\n   fi","html":"<p>   # Print or not depending on global &quot;$verbosity&quot;\n   # Change the verbosity with a single variable.\n   # Arg. 1 is the level for this message.\n   level=$1; décalage\n   si [[ $level -le $verbosity ]]; puis\n      print -R $*\n   fi</p>"},{"id":"text-484","type":"text","heading":"","plain_text":"verbosity=2\nvprint 1 This message will appear\nvprint 3 This only appears if verbosity is 3 or higher","html":"<p>verbosity=2\nvprint 1 This message will appear\nvprint 3 This only appears if verbosity is 3 or higher</p>"},{"id":"text-485","type":"text","heading":"","plain_text":"Reuseable functions\nBy using only command line arguments, not global variables, and taking care to minimise the side\neffects of functions, they can be made reusable by multiple scripts.  Typically they would be\nplaced in a separate file and read with the &quot;.&quot; operator.","html":"<p>Reuseable functions\nBy using only command line arguments, not global variables, and taking care to minimise the side\neffects of functions, they can be made reusable by multiple scripts.  Typically they would be\nplaced in a separate file and read with the &quot;.&quot; operator.</p>"},{"id":"text-486","type":"text","heading":"","plain_text":"Functions may generate output to stdout, stderr, or any other file or filehandle.  Messages to stdout\nmay be captured by command substitution (`myfunction`, which provides another way for a function to\nreturn information to the calling script.  Beware of side-effects (and reducing reusability)\nin functions which perform I/O.\n(24)","html":"<p>Functions may generate output to stdout, stderr, or any other file or filehandle.  Messages to stdout\nmay be captured by command substitution (`myfunction`, which provides another way for a function to\nreturn information to the calling script.  Beware of side-effects (and reducing reusability)\nin functions which perform I/O.\n(24)</p>"},{"id":"text-487","type":"text","heading":"","plain_text":"Unix I/O is performed by assigning file descriptors to files or devices, and then\nusing those descriptors for reading and writing.  Descriptors 0, 1, and 2 are always\nused for stdin, stdout and stderr respectively.  Stdin defaults to the keyboard,\nwhile stdout and stderr both default to the current terminal window.\nRedirecting for the whole script\nRedirecting stdout, stderr and other file descriptors for the whole script\ncan be done with the exec    commander.","html":"<p>Unix I/O is performed by assigning file descriptors to files or devices, and then\nusing those descriptors for reading and writing.  Descriptors 0, 1, and 2 are always\nused for stdin, stdout and stderr respectively.  Stdin defaults to the keyboard,\nwhile stdout and stderr both default to the current terminal window.\nRedirecting for the whole script\nRedirecting stdout, stderr and other file descriptors for the whole script\ncan be done with the exec    commander.</p>"},{"id":"text-488","type":"text","heading":"","plain_text":"exec     &gt; outfile &lt; infile \n \nwith no command, the exec    just reassigns the I/O of the current shell.\n \nexec n&gt;outfile\n \nThe form n opens file descriptor n instead of the default stdin/stdout.\nThis can then be used with read -u    ou print -u.","html":"<p>exec     &gt; outfile &lt; infile \n \nwith no command, the exec    just reassigns the I/O of the current shell.\n \nexec n&gt;outfile\n \nThe form n opens file descriptor n instead of the default stdin/stdout.\nThis can then be used with read -u    ou print -u.</p>"},{"id":"text-489","type":"text","heading":"","plain_text":"Explicitly opening or duplicating file descriptors\nOne reason to do this is to save the current\nstate of stdin/stdout, temporarily reassign them, then restore them.","html":"<p>Explicitly opening or duplicating file descriptors\nOne reason to do this is to save the current\nstate of stdin/stdout, temporarily reassign them, then restore them.</p>"},{"id":"text-490","type":"text","heading":"","plain_text":"&gt;&amp;n\n \nstandard output is moved to whatever file descriptor n is currently pointing to\n \n&lt;&amp;n\n \nstandard input is moved to whatever file descriptor n is currently pointing to\n \nn&gt;fichier\n \nfile descriptor n is opened for writing on the named fichier.\n \nn&gt;&amp;1\n \nfile descriptor n is set to whatever file descriptor 1 is currently pointing to.","html":"<p>&gt;&amp;n\n \nstandard output is moved to whatever file descriptor n is currently pointing to\n \n&lt;&amp;n\n \nstandard input is moved to whatever file descriptor n is currently pointing to\n \nn&gt;fichier\n \nfile descriptor n is opened for writing on the named fichier.\n \nn&gt;&amp;1\n \nfile descriptor n is set to whatever file descriptor 1 is currently pointing to.</p>"},{"id":"text-491","type":"text","heading":"","plain_text":"Exemple Sending messages to stderr (2) instead of stdout (1)","html":"<p>Exemple Sending messages to stderr (2) instead of stdout (1)</p>"},{"id":"text-492","type":"text","heading":"","plain_text":"echo &quot;Error: program failed&quot; &gt;&amp;2","html":"<p>echo &quot;Error: program failed&quot; &gt;&amp;2</p>"},{"id":"text-493","type":"text","heading":"","plain_text":"Echo always writes to stdout, but stdout can be temporarily reassigned to duplicate stderr (or other file\ndescriptors).\nConventionally Unix programs send error messages to stderr to keep them separated from stdout.\nInput and output to open file descriptors (ksh)\nPrinting to file descriptors (usually more efficient than open/append/close):","html":"<p>Echo always writes to stdout, but stdout can be temporarily reassigned to duplicate stderr (or other file\ndescriptors).\nConventionally Unix programs send error messages to stderr to keep them separated from stdout.\nInput and output to open file descriptors (ksh)\nPrinting to file descriptors (usually more efficient than open/append/close):</p>"},{"id":"text-494","type":"text","heading":"","plain_text":"impression     -u n args\n \nprint to file descriptor n.\n \n-p\n \nwrite to the pipe to a coprocess (opened by |&amp;)","html":"<p>impression     -u n args\n \nprint to file descriptor n.\n \n-p\n \nwrite to the pipe to a coprocess (opened by |&amp;)</p>"},{"id":"text-495","type":"text","heading":"","plain_text":"Reading from file descriptors other than stdin:","html":"<p>Reading from file descriptors other than stdin:</p>"},{"id":"text-496","type":"text","heading":"","plain_text":"lis     -u n var1 var2 rest\n \nread a line from file descriptor n, parsing by $IFS, and placing the words into\nthe named variables.  Any left over words all go into the last variable.\n \n-p\n \nread from the pipe to a coprocess (opened by |&amp;)","html":"<p>lis     -u n var1 var2 rest\n \nread a line from file descriptor n, parsing by $IFS, and placing the words into\nthe named variables.  Any left over words all go into the last variable.\n \n-p\n \nread from the pipe to a coprocess (opened by |&amp;)</p>"},{"id":"text-497","type":"text","heading":"","plain_text":"Closing file handles","html":"<p>Closing file handles</p>"},{"id":"text-498","type":"text","heading":"","plain_text":"&lt;&amp;-\n \nstandard input is explicitly closed\n \n&gt;&amp;-\n \nstandard output is explicitly closed","html":"<p>&lt;&amp;-\n \nstandard input is explicitly closed\n \n&gt;&amp;-\n \nstandard output is explicitly closed</p>"},{"id":"text-499","type":"text","heading":"","plain_text":"For example, to indicate to another program downstream in a pipeline that no more\ndata will be coming.  All file descriptors are closed when a script exits.","html":"<p>For example, to indicate to another program downstream in a pipeline that no more\ndata will be coming.  All file descriptors are closed when a script exits.</p>"},{"id":"text-500","type":"text","heading":"","plain_text":"I/O redirection operators are evaluated left-to-right.  This makes a difference in a\nstatement like:\n&quot;&gt;filename 2&gt;&amp;1&quot;.  (Many books with example scripts get this wrong)\n&quot;Here&quot; documents","html":"<p>I/O redirection operators are evaluated left-to-right.  This makes a difference in a\nstatement like:\n&quot;&gt;filename 2&gt;&amp;1&quot;.  (Many books with example scripts get this wrong)\n&quot;Here&quot; documents</p>"},{"id":"text-501","type":"text","heading":"","plain_text":"&lt;&amp;lt [-]chaîne","html":"<p>&lt;&amp;lt [-]chaîne</p>"},{"id":"text-502","type":"text","heading":"","plain_text":"redirect input to the temporary file formed by everything up the matching chaîne\nat the start of a line.  Allows for placing file content inline in a script.","html":"<p>redirect input to the temporary file formed by everything up the matching chaîne\nat the start of a line.  Allows for placing file content inline in a script.</p>"},{"id":"text-503","type":"text","heading":"","plain_text":"Exemple: ex5 display, text","html":"<p>Exemple: ex5 display, text</p>"},{"id":"text-504","type":"text","heading":"","plain_text":"1: #!/bin/sh\n            2: écho &quot;Example of unquoted here document, with variable and command substitution&quot;\n   3: \n            4: cat &lt;&lt;EOF\n   5:  This text will be fed to the &quot;cat&quot; program as \n   6:  standard input.  It will also have variable\n   7:  and command substitutions performed.\n   8:  I am logged in as $USER and today is `rendez-vous amoureux`\n   9: EOF\n  10: écho\n        11: écho &quot;Example of quoted here document, with no variable or command substitution&quot;\n  12: # The terminating string must be at the start of a line.\n        13: cat &lt;&lt;&quot;EndOfInput&quot;\n  14:  This text will be fed to the &quot;cat&quot; program as standard\n  15:  input.  Since the text string marking the end was quoted, it does not get \n  16:  variable and command subsitutions.\n  17:  I am logged in as $USER and today is `rendez-vous amoureux`\n  18: EndOfInput","html":"<p>1: #!/bin/sh\n            2: écho &quot;Example of unquoted here document, with variable and command substitution&quot;\n   3: \n            4: cat &lt;&lt;EOF\n   5:  This text will be fed to the &quot;cat&quot; program as \n   6:  standard input.  It will also have variable\n   7:  and command substitutions performed.\n   8:  I am logged in as $USER and today is `rendez-vous amoureux`\n   9: EOF\n  10: écho\n        11: écho &quot;Example of quoted here document, with no variable or command substitution&quot;\n  12: # The terminating string must be at the start of a line.\n        13: cat &lt;&lt;&quot;EndOfInput&quot;\n  14:  This text will be fed to the &quot;cat&quot; program as standard\n  15:  input.  Since the text string marking the end was quoted, it does not get \n  16:  variable and command subsitutions.\n  17:  I am logged in as $USER and today is `rendez-vous amoureux`\n  18: EndOfInput</p>"},{"id":"text-505","type":"text","heading":"","plain_text":"Exemple: duplex display, text","html":"<p>Exemple: duplex display, text</p>"},{"id":"text-506","type":"text","heading":"","plain_text":"1: #!/bin/sh\n            2: # Add in the magic postscript preface to perform\n            3: # duplex printer control for Xerox docuprint.\n            4: \n            5: # To have this script send the files directly to the printer, use \n            6: # a subshell to collect the output of the two &#39;cat&#39; commands.\n            7: \n            8: ## (\n            9: cat &lt;&lt; EOP\n  10: %!PS\n  11: %%BeginFeature: *Duplex DuplexTumble\n  12: &lt;&gt; setpagedevice\n  13: %%EndFeature\n  14: EOP\n  15: cat &quot;$@&quot;\n  16: ## ) | lpr","html":"<p>1: #!/bin/sh\n            2: # Add in the magic postscript preface to perform\n            3: # duplex printer control for Xerox docuprint.\n            4: \n            5: # To have this script send the files directly to the printer, use \n            6: # a subshell to collect the output of the two &#039;cat&#039; commands.\n            7: \n            8: ## (\n            9: cat &lt;&lt; EOP\n  10: %!PS\n  11: %%BeginFeature: *Duplex DuplexTumble\n  12: &lt;&gt; setpagedevice\n  13: %%EndFeature\n  14: EOP\n  15: cat &quot;$@&quot;\n  16: ## ) | lpr</p>"},{"id":"text-507","type":"text","heading":"","plain_text":"(25)","html":"<p>(25)</p>"},{"id":"text-508","type":"text","heading":"","plain_text":"More complicated manipulations of file descriptors can be arranged.\nTwo such examples are shown here:","html":"<p>More complicated manipulations of file descriptors can be arranged.\nTwo such examples are shown here:</p>"},{"id":"text-509","type":"text","heading":"","plain_text":"This short test script can be used to generate suitable output.ex13: display, text","html":"<p>This short test script can be used to generate suitable output.ex13: display, text</p>"},{"id":"text-510","type":"text","heading":"","plain_text":"echo &quot;This goes to stdout&quot;\necho &quot;This goes to stdout and has foo in the line&quot;\necho &quot;This goes to stderr&quot; &gt;&amp;2\nexit 99","html":"<p>echo &quot;This goes to stdout&quot;\necho &quot;This goes to stdout and has foo in the line&quot;\necho &quot;This goes to stderr&quot; &gt;&amp;2\nexit 99</p>"},{"id":"text-511","type":"text","heading":"","plain_text":"Pass stderr of a command into a pipeline for further processing\nExemple: ex14 display, text","html":"<p>Pass stderr of a command into a pipeline for further processing\nExemple: ex14 display, text</p>"},{"id":"text-512","type":"text","heading":"","plain_text":"exec 3&gt;&amp;1 ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#39;s/stderr/STDERR/&#39; 1&gt;&amp;2","html":"<p>exec 3&gt;&amp;1 ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#039;s/stderr/STDERR/&#039; 1&gt;&amp;2</p>"},{"id":"text-513","type":"text","heading":"","plain_text":"We duplicate stdout to another file descriptor (3), then run the first command with stderr redirected\nto stdout and stdout redirected to the saved descriptor (3). The result is piped into other commands\ncomme requis. The output of the pipeline is redirected back to stderr, so that stdout and stderr of the script\nas a whole are what we expect.","html":"<p>We duplicate stdout to another file descriptor (3), then run the first command with stderr redirected\nto stdout and stdout redirected to the saved descriptor (3). The result is piped into other commands\ncomme requis. The output of the pipeline is redirected back to stderr, so that stdout and stderr of the script\nas a whole are what we expect.</p>"},{"id":"text-514","type":"text","heading":"","plain_text":"1: #!/bin/sh\n            2: # Example 14\n            3: # Take stderr from a command and pass it into a pipe\n            4: # for further processing.\n            5: \n            6: # Uses ex13.sh to generate some output to stderr\n            7: # stdout of ex13 is processed normally\n            8: \n            9: # Save a copy of original stdout\n        10: exec 3&gt;&amp;1\n  11: \n        12: # stdout from ex13.sh is directed to the original stdout (3)\n        13: # stderr is passed into the pipe for further processing.\n        14: # stdout from the pipe is redirected back to stderr\n        15: ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#39;s/stderr/STDERR/&#39; 1&gt;&amp;2\n  16: \n        17: # 3 is closed before running the command, just in case it cares\n        18: # about inheriting open file descriptors.","html":"<p>1: #!/bin/sh\n            2: # Example 14\n            3: # Take stderr from a command and pass it into a pipe\n            4: # for further processing.\n            5: \n            6: # Uses ex13.sh to generate some output to stderr\n            7: # stdout of ex13 is processed normally\n            8: \n            9: # Save a copy of original stdout\n        10: exec 3&gt;&amp;1\n  11: \n        12: # stdout from ex13.sh is directed to the original stdout (3)\n        13: # stderr is passed into the pipe for further processing.\n        14: # stdout from the pipe is redirected back to stderr\n        15: ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#039;s/stderr/STDERR/&#039; 1&gt;&amp;2\n  16: \n        17: # 3 is closed before running the command, just in case it cares\n        18: # about inheriting open file descriptors.</p>"},{"id":"text-515","type":"text","heading":"","plain_text":"Capture the exit status of a command in the middle of a pipeline\nExemple: ex15 display, text","html":"<p>Capture the exit status of a command in the middle of a pipeline\nExemple: ex15 display, text</p>"},{"id":"text-516","type":"text","heading":"","plain_text":"exec 3&gt;&amp;1     ex13stat=`((./ex13.sh; echo $? &gt;&amp;4) | grep &#39;foo&#39; 1&gt;&amp;3) 4&gt;&amp;1` \nThis script uses nested subshells captured in backtics.\nAgain we first duplicate stdout to another file descriptor (3).\nThe inner subshell runs the first command, then writes the exit status\nto fd 4.  The outer subshell redirects 4 to stdout so that it is\ncaptured by the backtics.  Standard output from the first command\n(inner subshell) is passed into the pipeline as normal, but the final output\nof the pipeline is redirected to 3 so that it appears on the original stdout\nand is not captured by the backtics.","html":"<p>exec 3&gt;&amp;1     ex13stat=`((./ex13.sh; echo $? &gt;&amp;4) | grep &#039;foo&#039; 1&gt;&amp;3) 4&gt;&amp;1` \nThis script uses nested subshells captured in backtics.\nAgain we first duplicate stdout to another file descriptor (3).\nThe inner subshell runs the first command, then writes the exit status\nto fd 4.  The outer subshell redirects 4 to stdout so that it is\ncaptured by the backtics.  Standard output from the first command\n(inner subshell) is passed into the pipeline as normal, but the final output\nof the pipeline is redirected to 3 so that it appears on the original stdout\nand is not captured by the backtics.</p>"},{"id":"text-517","type":"text","heading":"","plain_text":"If any of the commands really care about inheriting open file\ndescriptors that they don&#39;t need then a more correct command line\ncloses the descriptors before running the commands.","html":"<p>If any of the commands really care about inheriting open file\ndescriptors that they don&#039;t need then a more correct command line\ncloses the descriptors before running the commands.</p>"},{"id":"text-518","type":"text","heading":"","plain_text":"1: #!/bin/sh\n            2: # Example 15\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into $ex13stat.  \n            8: # stdout of ex13 is processed normally\n            9: \n        10: # Save a copy of stdout\n        11: exec 3&gt;&amp;1\n  12: # Run a subshell, with 4 duplicated to 1 so we get it in stdout.  \n        13: # Capture the output in ``\n        14: # ex13stat=`( ...  ) 4&gt;&amp;1`\n        15: # Inside the subshell, run another subshell to execute ex13, \n        16: # and echo the status code to 4\n        17: # (./ex13.sh; écho $? &gt;&amp;4)\n        18: # stdout from the inner subshell is processed normally, but the \n        19: # subsequent output must be directed to 3 so it goes to the \n        20: # original stdout and not be captured by the ``\n        21: ex13stat=`((./ex13.sh; écho $? &gt;&amp;4) | grep &#39;foo&#39; 1&gt;&amp;3) 4&gt;&amp;1`\n  22: \n        23: écho Last command status=$?\n  24: écho ex13stat=$ex13stat\n        25: \n        26: # If any of the commands really care about inheriting open file \n        27: # descriptors that they don&#39;t need then a more correct command line \n        28: # closes the descriptors before running the commands\n        29: exec 3&gt;&amp;1\n  30: ex13stat=`((./ex13.sh 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  31:    grep &#39;foo&#39;  1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  32: écho Last command status=$?\n  33: écho ex13stat=$ex13stat","html":"<p>1: #!/bin/sh\n            2: # Example 15\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into $ex13stat.  \n            8: # stdout of ex13 is processed normally\n            9: \n        10: # Save a copy of stdout\n        11: exec 3&gt;&amp;1\n  12: # Run a subshell, with 4 duplicated to 1 so we get it in stdout.  \n        13: # Capture the output in ``\n        14: # ex13stat=`( ...  ) 4&gt;&amp;1`\n        15: # Inside the subshell, run another subshell to execute ex13, \n        16: # and echo the status code to 4\n        17: # (./ex13.sh; écho $? &gt;&amp;4)\n        18: # stdout from the inner subshell is processed normally, but the \n        19: # subsequent output must be directed to 3 so it goes to the \n        20: # original stdout and not be captured by the ``\n        21: ex13stat=`((./ex13.sh; écho $? &gt;&amp;4) | grep &#039;foo&#039; 1&gt;&amp;3) 4&gt;&amp;1`\n  22: \n        23: écho Last command status=$?\n  24: écho ex13stat=$ex13stat\n        25: \n        26: # If any of the commands really care about inheriting open file \n        27: # descriptors that they don&#039;t need then a more correct command line \n        28: # closes the descriptors before running the commands\n        29: exec 3&gt;&amp;1\n  30: ex13stat=`((./ex13.sh 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  31:    grep &#039;foo&#039;  1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  32: écho Last command status=$?\n  33: écho ex13stat=$ex13stat</p>"},{"id":"text-519","type":"text","heading":"","plain_text":"Combine the above two techniques:","html":"<p>Combine the above two techniques:</p>"},{"id":"text-520","type":"text","heading":"","plain_text":"Exemple: ex16 display, text","html":"<p>Exemple: ex16 display, text</p>"},{"id":"text-521","type":"text","heading":"","plain_text":"exec 3&gt;&amp;1 ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; echo $? &gt;&amp;4) |          sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`","html":"<p>exec 3&gt;&amp;1 ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; echo $? &gt;&amp;4) |          sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`</p>"},{"id":"text-522","type":"text","heading":"","plain_text":"1: #!/bin/sh\n            2: # Example 16\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into ex13stat. \n            8: # stderr of ex13 is processed by the pipe, stdout\n            9: # is left alone.\n        10: \n        11: # Save a copy of stdout\n        12: exec 3&gt;&amp;1\n  13: \n        14: # Run a subshell, with 4 copied to 1 so we get it in stdout.  \n        15: # Capture the output in backtics`\n        16: # ex13stat=`(    ) 4&gt;&amp;1`\n        17: \n        18: # In the subshell, run another subshell to execute ex13, and \n        19: # echo the status code to 4\n        20: # (./ex13.sh; écho $? &gt;&amp;4)\n        21: \n        22: # stdout from the inner subshell is directed to the original stdout (3)\n        23: # stderr is passed into the pipe for further processing.\n        24: # stdout from the pipe is redirected back to stderr\n        25: \n        26: # Close the extra descriptors before running the commands\n        27: exec 3&gt;&amp;1\n  28: ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  29:   sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  30: \n        31: écho Last command status=$?\n  32: écho ex13stat=$ex13stat\n        33:","html":"<p>1: #!/bin/sh\n            2: # Example 16\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into ex13stat. \n            8: # stderr of ex13 is processed by the pipe, stdout\n            9: # is left alone.\n        10: \n        11: # Save a copy of stdout\n        12: exec 3&gt;&amp;1\n  13: \n        14: # Run a subshell, with 4 copied to 1 so we get it in stdout.  \n        15: # Capture the output in backtics`\n        16: # ex13stat=`(    ) 4&gt;&amp;1`\n        17: \n        18: # In the subshell, run another subshell to execute ex13, and \n        19: # echo the status code to 4\n        20: # (./ex13.sh; écho $? &gt;&amp;4)\n        21: \n        22: # stdout from the inner subshell is directed to the original stdout (3)\n        23: # stderr is passed into the pipe for further processing.\n        24: # stdout from the pipe is redirected back to stderr\n        25: \n        26: # Close the extra descriptors before running the commands\n        27: exec 3&gt;&amp;1\n  28: ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  29:   sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  30: \n        31: écho Last command status=$?\n  32: écho ex13stat=$ex13stat\n        33:</p>"},{"id":"text-523","type":"text","heading":"","plain_text":"A practical application of this would be running a utility such as dd\nwhere the exit status is important to capture, but the error output is overly chatty and\nmay need to be filtered before delivering to other parts of a script.\n(26)","html":"<p>A practical application of this would be running a utility such as dd\nwhere the exit status is important to capture, but the error output is overly chatty and\nmay need to be filtered before delivering to other parts of a script.\n(26)</p>"},{"id":"text-524","type":"text","heading":"","plain_text":"Scripts can start any number of background jobs (any external command),\nwhich run in parallel with the\nparent script, and asynchronously.  Processes which require no further interaction\nor synchronization (fire and forget) are easy.\nInteraction with background jobs is tricky. Vous pouvez\nuse signals, pipes, named pipes, or disk files for communication.","html":"<p>Scripts can start any number of background jobs (any external command),\nwhich run in parallel with the\nparent script, and asynchronously.  Processes which require no further interaction\nor synchronization (fire and forget) are easy.\nInteraction with background jobs is tricky. Vous pouvez\nuse signals, pipes, named pipes, or disk files for communication.</p>"},{"id":"text-525","type":"text","heading":"","plain_text":"commander Et","html":"<p>commander Et</p>"},{"id":"text-526","type":"text","heading":"","plain_text":"Début commander as a background process.  Control returns immediately to the shell.","html":"<p>Début commander as a background process.  Control returns immediately to the shell.</p>"},{"id":"text-527","type":"text","heading":"","plain_text":"bgpid=$!","html":"<p>bgpid=$!</p>"},{"id":"text-528","type":"text","heading":"","plain_text":"The special variable $!    contains the process ID of the last background job\nthat was started.  You can save that and examine the process later\n(ps -p $bgpid) or send it a signal (kill -HUP $bgpid).","html":"<p>The special variable $!    contains the process ID of the last background job\nthat was started.  You can save that and examine the process later\n(ps -p $bgpid) or send it a signal (kill -HUP $bgpid).</p>"},{"id":"text-529","type":"text","heading":"","plain_text":"ksh coprocesses\nCoprocesses are a way of starting a separate process which\nruns asychronously, but has stdin/stdout connected to the parent script via pipes.","html":"<p>ksh coprocesses\nCoprocesses are a way of starting a separate process which\nruns asychronously, but has stdin/stdout connected to the parent script via pipes.</p>"},{"id":"text-530","type":"text","heading":"","plain_text":"commander |&amp;","html":"<p>commander |&amp;</p>"},{"id":"text-531","type":"text","heading":"","plain_text":"Start a coprocess with a 2-way pipe to it","html":"<p>Start a coprocess with a 2-way pipe to it</p>"},{"id":"text-532","type":"text","heading":"","plain_text":"lis -p var","html":"<p>lis -p var</p>"},{"id":"text-533","type":"text","heading":"","plain_text":"Read from the pipe to the coprocess, instead of standard input","html":"<p>Read from the pipe to the coprocess, instead of standard input</p>"},{"id":"text-534","type":"text","heading":"","plain_text":"impression -p args","html":"<p>impression -p args</p>"},{"id":"text-535","type":"text","heading":"","plain_text":"Write to the pipe connected to the coprocess, instead of standard output","html":"<p>Write to the pipe connected to the coprocess, instead of standard output</p>"},{"id":"text-536","type":"text","heading":"","plain_text":"Multiple coprocesses can be handled by moving the special file descriptors connected\nto the pipes onto standard input and output, and or to explicitly specified file descriptors.","html":"<p>Multiple coprocesses can be handled by moving the special file descriptors connected\nto the pipes onto standard input and output, and or to explicitly specified file descriptors.</p>"},{"id":"text-537","type":"text","heading":"","plain_text":"exec &lt;&amp;p","html":"<p>exec &lt;&amp;p</p>"},{"id":"text-538","type":"text","heading":"","plain_text":"The input from the coprocess is moved to standard input","html":"<p>The input from the coprocess is moved to standard input</p>"},{"id":"text-539","type":"text","heading":"","plain_text":"exec &gt;&amp;p","html":"<p>exec &gt;&amp;p</p>"},{"id":"text-540","type":"text","heading":"","plain_text":"The output from the coprocess is moved to standard output","html":"<p>The output from the coprocess is moved to standard output</p>"},{"id":"text-541","type":"text","heading":"","plain_text":"Exemple: ex9 display, textA script wants to save a copy of all output in a file, but also wants a copy\nà l&#39;écran. This is equivalent to always running the script asscénario | tee outfile","html":"<p>Exemple: ex9 display, textA script wants to save a copy of all output in a file, but also wants a copy\nà l&#039;écran. This is equivalent to always running the script asscénario | tee outfile</p>"},{"id":"text-542","type":"text","heading":"","plain_text":"1: #!/bin/ksh\n            2: \n            3: # If we have not redirected standard output, save a copy of\n            4: # the output of this script into a file, but still send a\n            5: # copy to the screen.\n            6: \n            7: si [[ -t 1 ]]; puis\n            8:   # Only do this if fd 1 (stdout) is still connected\n            9:   # to a terminal\n        10: \n        11:   # We want the standard output of the &quot;tee&quot; process\n        12:   # to go explicitly to the screen (/dev/tty)\n        13:   # and the second copy goes into a logfile named $0.out\n        14: \n        15:   tee 0 $.out &gt;/dev/tty |&amp;\n  16: \n        17:   # Our stdout all goes into this coprocess\n        18:   exec 1&gt;&amp;p\n  19: fi\n        20: \n        21: # Now generate some output\n        22: impression &quot;User activity snapshot on $(hostname) at $(date)&quot;\n  23: impression\n        24: qui","html":"<p>1: #!/bin/ksh\n            2: \n            3: # If we have not redirected standard output, save a copy of\n            4: # the output of this script into a file, but still send a\n            5: # copy to the screen.\n            6: \n            7: si [[ -t 1 ]]; puis\n            8:   # Only do this if fd 1 (stdout) is still connected\n            9:   # to a terminal\n        10: \n        11:   # We want the standard output of the &quot;tee&quot; process\n        12:   # to go explicitly to the screen (/dev/tty)\n        13:   # and the second copy goes into a logfile named $0.out\n        14: \n        15:   tee 0 $.out &gt;/dev/tty |&amp;\n  16: \n        17:   # Our stdout all goes into this coprocess\n        18:   exec 1&gt;&amp;p\n  19: fi\n        20: \n        21: # Now generate some output\n        22: impression &quot;User activity snapshot on $(hostname) at $(date)&quot;\n  23: impression\n        24: qui</p>"},{"id":"text-543","type":"text","heading":"","plain_text":"Exemple: ex10 display, textStart a coprocess to look up usernames in some database.\nIt is faster to run a single process than to run a separate\nlookup for each user.","html":"<p>Exemple: ex10 display, textStart a coprocess to look up usernames in some database.\nIt is faster to run a single process than to run a separate\nlookup for each user.</p>"},{"id":"text-544","type":"text","heading":"","plain_text":"1: #!/bin/ksh\n            2: # This example uses a locally written tool for Dartmouth Name Directory lookups\n            3: \n            4: # Start the dndlookup program as a coprocess\n            5: # Tell it to output only the canonical full name, and to not print multiple matches\n            6: dndlookup -fname -u |&amp;\n   7: \n            8: # move the input/output streams so we \n            9: # can use other coprocesses too\n        10: exec 4&gt;&amp;p\n  11: exec 5&lt;&amp;p\n  12: \n        13: écho &quot;Name file contents:&quot;\n  14: cat namefile\n  15: écho\n        16: \n        17: # read the names from a file &quot;namefile&quot;\n        18: tandis que read uname; faire\n        19:   impression -u4 $uname\n        20:   lis  -u5 dndname\n  21:   Cas $dndname dans\n  22:   *many matches*)\n  23:     # handle case where the name wasn&#39;t unique\n        24:     impression &quot;Multiple matches to &quot;$uname&quot; in DND&quot;\n  25:     ;;\n  26:   *no match*)\n  27:     # handle case where the name wasn&#39;t found\n        28:     impression &quot;No matches to &quot;$uname&quot; in DND&quot;\n  29:     ;;\n  30:   *)\n  31:     # we seem to have a hit - process the\n        32:     # canonical named retrieved from dndlookup\n        33:     impression &quot;Unique DND match: full name for &quot;$uname&quot; is &quot;$dndname&quot;&quot;\n  34:     ;; \n  35:   esac\n        36:   sleep 2\n  37: terminé &lt; namefile\n  38: \n        39: # We&#39;ve read all the names, but the coprocess\n        40: # is still running.  Close the pipe to tell it\n        41: # we have finished.\n        42: exec 4&gt;&amp;-","html":"<p>1: #!/bin/ksh\n            2: # This example uses a locally written tool for Dartmouth Name Directory lookups\n            3: \n            4: # Start the dndlookup program as a coprocess\n            5: # Tell it to output only the canonical full name, and to not print multiple matches\n            6: dndlookup -fname -u |&amp;\n   7: \n            8: # move the input/output streams so we \n            9: # can use other coprocesses too\n        10: exec 4&gt;&amp;p\n  11: exec 5&lt;&amp;p\n  12: \n        13: écho &quot;Name file contents:&quot;\n  14: cat namefile\n  15: écho\n        16: \n        17: # read the names from a file &quot;namefile&quot;\n        18: tandis que read uname; faire\n        19:   impression -u4 $uname\n        20:   lis  -u5 dndname\n  21:   Cas $dndname dans\n  22:   *many matches*)\n  23:     # handle case where the name wasn&#039;t unique\n        24:     impression &quot;Multiple matches to &quot;$uname&quot; in DND&quot;\n  25:     ;;\n  26:   *no match*)\n  27:     # handle case where the name wasn&#039;t found\n        28:     impression &quot;No matches to &quot;$uname&quot; in DND&quot;\n  29:     ;;\n  30:   *)\n  31:     # we seem to have a hit - process the\n        32:     # canonical named retrieved from dndlookup\n        33:     impression &quot;Unique DND match: full name for &quot;$uname&quot; is &quot;$dndname&quot;&quot;\n  34:     ;; \n  35:   esac\n        36:   sleep 2\n  37: terminé &lt; namefile\n  38: \n        39: # We&#039;ve read all the names, but the coprocess\n        40: # is still running.  Close the pipe to tell it\n        41: # we have finished.\n        42: exec 4&gt;&amp;-</p>"},{"id":"text-545","type":"text","heading":"","plain_text":"(27)","html":"<p>(27)</p>"},{"id":"text-546","type":"text","heading":"","plain_text":"Both ksh and bash implement arrays of variables, but in somewhat different ways.","html":"<p>Both ksh and bash implement arrays of variables, but in somewhat different ways.</p>"},{"id":"text-547","type":"text","heading":"","plain_text":"ksh distinguishes between numerically indexed (small) arrays, and string indexed (associative) arrays.\nbash uses integers for all array indexing, but the integers need not be consecutive and unassigned array elements\ndo not exist.  Arrays must be declared before use, e,g. typeset -A myarray    (ksh associative array), or\ntypeset -a myarray    (bash).","html":"<p>ksh distinguishes between numerically indexed (small) arrays, and string indexed (associative) arrays.\nbash uses integers for all array indexing, but the integers need not be consecutive and unassigned array elements\ndo not exist.  Arrays must be declared before use, e,g. typeset -A myarray    (ksh associative array), or\ntypeset -a myarray    (bash).</p>"},{"id":"text-548","type":"text","heading":"","plain_text":"Array elements are set with the syntax:\nmyarray[index]=value\nand referenced with the syntax $myarray[index]","html":"<p>Array elements are set with the syntax:\nmyarray[index]=value\nand referenced with the syntax $myarray[index]</p>"},{"id":"text-549","type":"text","heading":"","plain_text":"This example shows use of an array indexed by IP addresses, as strings in ksh or as non-consecutive numbers in bash.\nIt also demonstrates use of getopt for options processing","html":"<p>This example shows use of an array indexed by IP addresses, as strings in ksh or as non-consecutive numbers in bash.\nIt also demonstrates use of getopt for options processing</p>"},{"id":"text-550","type":"text","heading":"","plain_text":"Exemple: getauthlogs display, text","html":"<p>Exemple: getauthlogs display, text</p>"},{"id":"text-551","type":"text","heading":"","plain_text":"1: #! / bin / bash\n            2: # $Header: $\n            3: # First attempt at a consolidated auth log collection from kaserver\n            4: # Timestamps in the raw files are NOT designed for easy sorting.\n            5: #\n            6: # Options:\n            7: #  -i  -- translate hex IP addresses to dotted-decimal (relatively quick)\n            8: #  -h  -- translate hex IP addresses to DNS names (somewhat slower - DNS lookups)\n            9: #  -u user -- filter for the named user before translating addresses\n        10: \n        11: hextodec()\n  12: \n  13:    # convert the IP address in reverse-hex to dotted-decimal\n        14:    écho $((0x$1:6:2)).$((0x$1:4:2)).$((0x$1:2:2)).$((0x$1:0:2))\n        15: \n  16: \n        17: hostlookup()\n  18:  tr &#39;A-Z&#39; &#39;a-z&#39;\n  30:       ;;\n  31:    esac\n        32: \n  33: \n        34: # Options\n        35: iptranslate=0\n  36: gethostnames=0\n  37: filter=chat\n  38: tandis que getopts ihu: o ; faire\n        39:    Cas $o dans\n  40:    i) iptranslate=1 ;;\n  41:    h) gethostnames=1; iptranslate=1 ;;\n  42:    u) filter=&quot;grep $OPTARG&quot; ;;\n  43:    esac\n        44: terminé\n        45: décalage $(($OPTIND-1))\n        46: \n        47: # We could get the DB server names from &#39;fs checkservers&#39;, but it isn&#39;t obvious what is from our cell. nous\n        48: # could also grep CellServDB.  I cop out and hard code one known DB server and get the others from it.\n        49: masterserver=halley.dartmouth.edu\n  50: serverlist=$(bos listhosts -server $masterserver| grep &#39;Host .* is &#39; | awk &#39;print 4 $&#39;)\n  51: \n        52: # If we want to filter usernames, it is more efficient to do it inline, before sorting, translation and hostname lookups\n        53: \n        54: # Array to hold IP address/name conversions (associative array, ksh only)\n        55: # ksh - use -A for associative array.  bash - use -a and numeric array\n        56: composer -a hostnames\n  57: \n        58: (\n  59: pour dbserver in $serverlist; faire\n        60:    bos getlog -server $dbserver -file /usr/afs/logs/AuthLog\n  61: terminé\n        62: ) | grep -v &#39;Fetching log file&#39; | $filter | sed -e &#39;s/^... //&#39; -e &#39;s/  ([1-9]) / 01 /&#39; | sort --month-sort | \n  63:     sed &#39;-e s/ ([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])$/ 01/&#39; |\n  64:     tandis que read line; faire\n        65:    si [[[[[[[[$iptranslate == 1 ]]; puis\n        66:       # Ugly!\n        67:       # Sometimes we get a 7-digit hex code in the log - the kaserver apparently drops leading zeros.\n        68:       # The second &#39;sed&#39; in the pipe catches these are fixes them.\n        69:       Cas $line dans\n  70:       * from [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])\n  71:          # translate the reverse-hex address\n        72:          iphex=$line##* from \n        73:          # bash version - index by numeric value only, but can be sparse array -- use the raw IP \n        74:          ipdec=$((0x$iphex))\n        75:          frontpart=$line% from *\n        76:          si [[[[[[[[$gethostnames == 1 ]]; puis\n        77:             # ksh - index on hex value as a string (iphex)\n        78:             # bash - index on numeric value (ipdec)\n        79:             index=$ipdec\n        80:             si [[-z&quot;[[-z&quot;[[-z\"[[-z\"$hostnames[[[[$index]&quot; ]]; puis\n        81:                hostnames[[[[$index]=&quot;$(hostlookup $(hextodec $iphex))&quot; \n  82:             fi\n        83:             écho &quot;$frontpart de $hostnames[[[[$index]&quot;\n  84:          autre\n        85:             écho &quot;$frontpart from $(hextodec $iphex)&quot;\n  86:          fi\n        87:          ;;\n  88:       *)\n  89:          écho &quot;$line&quot;\n  90:          ;;\n  91:       esac\n        92:    autre\n        93:       # No ip translation, just echo the whole line\n        94:       écho &quot;$line&quot;\n  95:    fi   \n        96: terminé\n        97:","html":"<p>1: #! / bin / bash\n            2: # $Header: $\n            3: # First attempt at a consolidated auth log collection from kaserver\n            4: # Timestamps in the raw files are NOT designed for easy sorting.\n            5: #\n            6: # Options:\n            7: #  -i  -- translate hex IP addresses to dotted-decimal (relatively quick)\n            8: #  -h  -- translate hex IP addresses to DNS names (somewhat slower - DNS lookups)\n            9: #  -u user -- filter for the named user before translating addresses\n        10: \n        11: hextodec()\n  12: \n  13:    # convert the IP address in reverse-hex to dotted-decimal\n        14:    écho $((0x$1:6:2)).$((0x$1:4:2)).$((0x$1:2:2)).$((0x$1:0:2))\n        15: \n  16: \n        17: hostlookup()\n  18:  tr &#039;A-Z&#039; &#039;a-z&#039;\n  30:       ;;\n  31:    esac\n        32: \n  33: \n        34: # Options\n        35: iptranslate=0\n  36: gethostnames=0\n  37: filter=chat\n  38: tandis que getopts ihu: o ; faire\n        39:    Cas $o dans\n  40:    i) iptranslate=1 ;;\n  41:    h) gethostnames=1; iptranslate=1 ;;\n  42:    u) filter=&quot;grep $OPTARG&quot; ;;\n  43:    esac\n        44: terminé\n        45: décalage $(($OPTIND-1))\n        46: \n        47: # We could get the DB server names from &#039;fs checkservers&#039;, but it isn&#039;t obvious what is from our cell. nous\n        48: # could also grep CellServDB.  I cop out and hard code one known DB server and get the others from it.\n        49: masterserver=halley.dartmouth.edu\n  50: serverlist=$(bos listhosts -server $masterserver| grep &#039;Host .* is &#039; | awk &#039;print 4 $&#039;)\n  51: \n        52: # If we want to filter usernames, it is more efficient to do it inline, before sorting, translation and hostname lookups\n        53: \n        54: # Array to hold IP address/name conversions (associative array, ksh only)\n        55: # ksh - use -A for associative array.  bash - use -a and numeric array\n        56: composer -a hostnames\n  57: \n        58: (\n  59: pour dbserver in $serverlist; faire\n        60:    bos getlog -server $dbserver -file /usr/afs/logs/AuthLog\n  61: terminé\n        62: ) | grep -v &#039;Fetching log file&#039; | $filter | sed -e &#039;s/^... //&#039; -e &#039;s/  ([1-9]) / 01 /&#039; | sort --month-sort | \n  63:     sed &#039;-e s/ ([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])$/ 01/&#039; |\n  64:     tandis que read line; faire\n        65:    si [[[[[[[[$iptranslate == 1 ]]; puis\n        66:       # Ugly!\n        67:       # Sometimes we get a 7-digit hex code in the log - the kaserver apparently drops leading zeros.\n        68:       # The second &#039;sed&#039; in the pipe catches these are fixes them.\n        69:       Cas $line dans\n  70:       * from [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])\n  71:          # translate the reverse-hex address\n        72:          iphex=$line##* from \n        73:          # bash version - index by numeric value only, but can be sparse array -- use the raw IP \n        74:          ipdec=$((0x$iphex))\n        75:          frontpart=$line% from *\n        76:          si [[[[[[[[$gethostnames == 1 ]]; puis\n        77:             # ksh - index on hex value as a string (iphex)\n        78:             # bash - index on numeric value (ipdec)\n        79:             index=$ipdec\n        80:             si [[-z&quot;[[-z&quot;[[-z&quot;[[-z&quot;$hostnames[[[[$index]&quot; ]]; puis\n        81:                hostnames[[[[$index]=&quot;$(hostlookup $(hextodec $iphex))&quot; \n  82:             fi\n        83:             écho &quot;$frontpart de $hostnames[[[[$index]&quot;\n  84:          autre\n        85:             écho &quot;$frontpart from $(hextodec $iphex)&quot;\n  86:          fi\n        87:          ;;\n  88:       *)\n  89:          écho &quot;$line&quot;\n  90:          ;;\n  91:       esac\n        92:    autre\n        93:       # No ip translation, just echo the whole line\n        94:       écho &quot;$line&quot;\n  95:    fi   \n        96: terminé\n        97:</p>"},{"id":"text-552","type":"text","heading":"","plain_text":"(28)","html":"<p>(28)</p>"},{"id":"text-553","type":"text","heading":"","plain_text":"Unix signals (software interrupts) can be sent as asynchronous events to shell scripts, just\nas they can to any other program.  The default behaviour is to ignore some signals and immediately\nexit on others.  Scripts may detect signals and divert control to a handler function or external\nprogramme. This is often used to perform clean-up actions before exiting, or restart certain\nprocedures.  Execution resumes where it left off, if the signal handler returns.  Signal traps\nmust be set separately inside of shell functions.  Signals can be sent to a process with\ntuer.","html":"<p>Unix signals (software interrupts) can be sent as asynchronous events to shell scripts, just\nas they can to any other program.  The default behaviour is to ignore some signals and immediately\nexit on others.  Scripts may detect signals and divert control to a handler function or external\nprogramme. This is often used to perform clean-up actions before exiting, or restart certain\nprocedures.  Execution resumes where it left off, if the signal handler returns.  Signal traps\nmust be set separately inside of shell functions.  Signals can be sent to a process with\ntuer.</p>"},{"id":"text-554","type":"text","heading":"","plain_text":"piège gestionnaire sig ...","html":"<p>piège gestionnaire sig ...</p>"},{"id":"text-555","type":"text","heading":"","plain_text":"gestionnaire is a command to be read (evaluated first) and executed on receipt of\nle spécifié sigs. Signals can be specified by name or number (see kill(1))\npar exemple. HUP, INT, QUIT, TERM. A Ctrl-C at the terminal generates a INT.","html":"<p>gestionnaire is a command to be read (evaluated first) and executed on receipt of\nle spécifié sigs. Signals can be specified by name or number (see kill(1))\npar exemple. HUP, INT, QUIT, TERM. A Ctrl-C at the terminal generates a INT.</p>"},{"id":"text-556","type":"text","heading":"","plain_text":"A handler of -    resets the signals to their default values","html":"<p>A handler of -    resets the signals to their default values</p>"},{"id":"text-557","type":"text","heading":"","plain_text":"A handler of &#39;&#39;    (null) ignores the signals","html":"<p>A handler of &#039;&#039;    (null) ignores the signals</p>"},{"id":"text-558","type":"text","heading":"","plain_text":"Special signal values are as follows:","html":"<p>Special signal values are as follows:</p>"},{"id":"text-559","type":"text","heading":"","plain_text":"EXIT","html":"<p>EXIT</p>"},{"id":"text-560","type":"text","heading":"","plain_text":"the handler is called when the function exits, or when the whole script exits. le\nexit signal has value 0.","html":"<p>the handler is called when the function exits, or when the whole script exits. le\nexit signal has value 0.</p>"},{"id":"text-561","type":"text","heading":"","plain_text":"ERR    (ksh)","html":"<p>ERR    (ksh)</p>"},{"id":"text-562","type":"text","heading":"","plain_text":"the handler is called when any command has a non-zero exit status","html":"<p>the handler is called when any command has a non-zero exit status</p>"},{"id":"text-563","type":"text","heading":"","plain_text":"DEBUG    (ksh)","html":"<p>DEBUG    (ksh)</p>"},{"id":"text-564","type":"text","heading":"","plain_text":"the handler is called after chaque commander.","html":"<p>the handler is called after chaque commander.</p>"},{"id":"text-565","type":"text","heading":"","plain_text":"Exemple: ex8 display, text","html":"<p>Exemple: ex8 display, text</p>"},{"id":"text-566","type":"text","heading":"","plain_text":"1: #! / bin / bash\n            2: # Try this under bash, ksh and sh\n            3: \n            4: piège huphandler  HUP\n   5: piège &#39;&#39;          QUIT\n   6: piège exithandler TERM INT\n   7: \n            8: huphandler()\n   9: \n  10:    écho &#39;Received SIGHUP&#39;\n  11:    écho &quot;continuing&quot;\n  12: \n  13: \n        14: exithandler()\n  15: \n  16:    écho &#39;Received SIGTERM or SIGINT&#39;\n  17:    sortie 1\n  18: \n  19: ## Execution starts here - infinite loop until interrupted\n        20: # Use &quot;:&quot; or &quot;true&quot; for infinite loop\n        21: # SECONDS is built-in to bash and ksh.  It is number of seconds since script started\n        22: : is like a comment, but it is evaluated for side effects and evaluates to true\n  23: seconds=0\n  24: tandis que : ; faire\n        25: # while true; faire\n        26:    sleep 5\n  27:    seconds=$((seconds + 5))\n        28:    écho -n &quot;$SECONDS $seconds - &quot;\n  29: terminé","html":"<p>1: #! / bin / bash\n            2: # Try this under bash, ksh and sh\n            3: \n            4: piège huphandler  HUP\n   5: piège &#039;&#039;          QUIT\n   6: piège exithandler TERM INT\n   7: \n            8: huphandler()\n   9: \n  10:    écho &#039;Received SIGHUP&#039;\n  11:    écho &quot;continuing&quot;\n  12: \n  13: \n        14: exithandler()\n  15: \n  16:    écho &#039;Received SIGTERM or SIGINT&#039;\n  17:    sortie 1\n  18: \n  19: ## Execution starts here - infinite loop until interrupted\n        20: # Use &quot;:&quot; or &quot;true&quot; for infinite loop\n        21: # SECONDS is built-in to bash and ksh.  It is number of seconds since script started\n        22: : is like a comment, but it is evaluated for side effects and evaluates to true\n  23: seconds=0\n  24: tandis que : ; faire\n        25: # while true; faire\n        26:    sleep 5\n  27:    seconds=$((seconds + 5))\n        28:    écho -n &quot;$SECONDS $seconds - &quot;\n  29: terminé</p>"},{"id":"text-567","type":"text","heading":"","plain_text":"Exit handlers can be defined to clean up temporary files or reset the state of devices. Ce\ncan be useful if the script has multiple possible exit points.\n(29)","html":"<p>Exit handlers can be defined to clean up temporary files or reset the state of devices. Ce\ncan be useful if the script has multiple possible exit points.\n(29)</p>"},{"id":"text-568","type":"text","heading":"","plain_text":"Shell scripts are often used by system administrators and are run as a priviledged user.","html":"<p>Shell scripts are often used by system administrators and are run as a priviledged user.</p>"},{"id":"text-569","type":"text","heading":"","plain_text":"Don&#39;t use set-UID scripts.","html":"<p>Don&#039;t use set-UID scripts.</p>"},{"id":"text-570","type":"text","heading":"","plain_text":"Most systems don&#39;t even allow a script to be made set-UID.  It is\nimpossible (due to inherent race conditions) to ensure that a set-uid script cannot be compromised.\nUse wrapper programs like sudo    instead.","html":"<p>Most systems don&#039;t even allow a script to be made set-UID.  It is\nimpossible (due to inherent race conditions) to ensure that a set-uid script cannot be compromised.\nUse wrapper programs like sudo    instead.</p>"},{"id":"text-571","type":"text","heading":"","plain_text":"Always explicitly set $PATH    at the start of a script, so that you know exactly\nwhich external programs will be used.","html":"<p>Always explicitly set $PATH    at the start of a script, so that you know exactly\nwhich external programs will be used.</p>"},{"id":"text-572","type":"text","heading":"","plain_text":"If possible, don&#39;t use temporary files.  If they cannot be avoided, use $TMPDIR,\nand create files safely (e.g. mktemp).","html":"<p>If possible, don&#039;t use temporary files.  If they cannot be avoided, use $TMPDIR,\nand create files safely (e.g. mktemp).</p>"},{"id":"text-573","type":"text","heading":"","plain_text":"Often scripts will write to a fixed, or trivially generated temporary filename in /tmp.  If the\nfile already exists and you don&#39;t have permission to overwrite it, the script will fail. Si vous\ndo have permission to overwrite it, you will delete the previous contents.  Since /tmp is public write,\nanother user may create files in it, or possibly fill it completely.\nExemple:","html":"<p>Often scripts will write to a fixed, or trivially generated temporary filename in /tmp.  If the\nfile already exists and you don&#039;t have permission to overwrite it, the script will fail. Si vous\ndo have permission to overwrite it, you will delete the previous contents.  Since /tmp is public write,\nanother user may create files in it, or possibly fill it completely.\nExemple:</p>"},{"id":"text-574","type":"text","heading":"","plain_text":"A link is created by an unprivileged user in /tmp:     /tmp/scratch  -&gt; /vmunix","html":"<p>A link is created by an unprivileged user in /tmp:     /tmp/scratch  -&gt; /vmunix</p>"},{"id":"text-575","type":"text","heading":"","plain_text":"A root user runs a script that blindly writes a scratch file to /tmp/scratch, and overwrites the\noperating system.","html":"<p>A root user runs a script that blindly writes a scratch file to /tmp/scratch, and overwrites the\noperating system.</p>"},{"id":"text-576","type":"text","heading":"","plain_text":"Environment variable $TMPDIR    is often used to indicate a preferred location for\ntemporary files (e.g., a per-user directory).  Some systems may use $TMP    ou $TEMP.\nSafe scratch files can be made by creating a new directory, owned\nand writeable only by you, then creating files in there.\nExemple:","html":"<p>Environment variable $TMPDIR    is often used to indicate a preferred location for\ntemporary files (e.g., a per-user directory).  Some systems may use $TMP    ou $TEMP.\nSafe scratch files can be made by creating a new directory, owned\nand writeable only by you, then creating files in there.\nExemple:</p>"},{"id":"text-577","type":"text","heading":"","plain_text":"(umask 077 &amp;&amp; mkdir /tmp/tempdir.$$) || exit 1","html":"<p>(umask 077 &amp;&amp; mkdir /tmp/tempdir.$$) || exit 1</p>"},{"id":"text-578","type":"text","heading":"","plain_text":"or (deluxe version)","html":"<p>or (deluxe version)</p>"},{"id":"text-579","type":"text","heading":"","plain_text":"tmp=$TMPDIR:-/tmp\ntmp=$tmp/tempdir.$RANDOM.$RANDOM.$RANDOM.$$\n(umask 077 &amp;&amp; mkdir $tmp) || \n    echo &quot;Could not create temporary directory&quot; 1&gt;&amp;2\n    exit 1","html":"<p>tmp=$TMPDIR:-/tmp\ntmp=$tmp/tempdir.$RANDOM.$RANDOM.$RANDOM.$$\n(umask 077 &amp;&amp; mkdir $tmp) || \n    echo &quot;Could not create temporary directory&quot; 1&gt;&amp;2\n    exit 1</p>"},{"id":"text-580","type":"text","heading":"","plain_text":"Alternatively, many systems have mktemp    to safely create a temporary file and return\nthe filename, which can be used by the script and then deleted.","html":"<p>Alternatively, many systems have mktemp    to safely create a temporary file and return\nthe filename, which can be used by the script and then deleted.</p>"},{"id":"text-581","type":"text","heading":"","plain_text":"Check exit status of everything you do.","html":"<p>Check exit status of everything you do.</p>"},{"id":"text-582","type":"text","heading":"","plain_text":"Don&#39;t trust user input","html":"<p>Don&#039;t trust user input</p>"},{"id":"text-583","type":"text","heading":"","plain_text":"contents of files\n  \ndata piped from other programs\n  \nfichier des noms. Output of filename generation with wildcards, or directly from\n     ls    ou trouver","html":"<p>contents of files\n  \ndata piped from other programs\n  \nfichier des noms. Output of filename generation with wildcards, or directly from\n     ls    ou trouver</p>"},{"id":"text-584","type":"text","heading":"","plain_text":"Exemple:\nConsider the effects of a file named &quot;myfile;cd /;rm *&quot; if processed,\nunquoted, by your script.","html":"<p>Exemple:\nConsider the effects of a file named &quot;myfile;cd /;rm *&quot; if processed,\nunquoted, by your script.</p>"},{"id":"text-585","type":"text","heading":"","plain_text":"One possible way to protect against weirdo characters in file names:","html":"<p>One possible way to protect against weirdo characters in file names:</p>"},{"id":"text-586","type":"text","heading":"","plain_text":"# A function to massage a list of filenames \n# to protect weirdo characters\n# e.g. find ... | protect_filenames | xargs command\n#\n# We are backslash-protecting the characters &#39;&quot; ?*;\nprotect_filenames()","html":"<p># A function to massage a list of filenames \n# to protect weirdo characters\n# e.g. find ... | protect_filenames | xargs command\n#\n# We are backslash-protecting the characters &#039;&quot; ?*;\nprotect_filenames()</p>"},{"id":"text-587","type":"text","heading":"","plain_text":"   sed -es/\\\\/\\\\\\\\/g \n       -es/\\&#39;/\\\\&#39;/g   \n       -es/\\&quot;/\\\\&quot;/g   \n       -es/\\;/\\\\;/g   \n       -es/\\?/\\\\?/g   \n       -es/\\*/\\\\*/g   \n       -es/\\ /\\\\ /g","html":"<p>   sed -es/\\\\/\\\\\\\\/g \n       -es/\\&#039;/\\\\&#039;/g   \n       -es/\\&quot;/\\\\&quot;/g   \n       -es/\\;/\\\\;/g   \n       -es/\\?/\\\\?/g   \n       -es/\\*/\\\\*/g   \n       -es/\\ /\\\\ /g</p>"},{"id":"text-588","type":"text","heading":"","plain_text":"If using GNU trouver    et xargs, there is a much cleaner option\nto null-terminate generated pathnames.","html":"<p>If using GNU trouver    et xargs, there is a much cleaner option\nto null-terminate generated pathnames.</p>"},{"id":"text-589","type":"text","heading":"","plain_text":"(30)","html":"<p>(30)</p>"},{"id":"text-590","type":"text","heading":"","plain_text":"Shell scripts are very frequently written quickly for a single purpose, used once and discarded.\nThey are also as frequently kept and used many times, and migrate into other uses, but often\ndo not receive the same level of testing and debugging that other software would be given\nin the same situation. Il est possible to apply general principles of good software\nengineering to shell scripts.","html":"<p>Shell scripts are very frequently written quickly for a single purpose, used once and discarded.\nThey are also as frequently kept and used many times, and migrate into other uses, but often\ndo not receive the same level of testing and debugging that other software would be given\nin the same situation. Il est possible to apply general principles of good software\nengineering to shell scripts.</p>"},{"id":"text-591","type":"text","heading":"","plain_text":"Preface scripts with a statement of purpose, author, date and revision notes","html":"<p>Preface scripts with a statement of purpose, author, date and revision notes</p>"},{"id":"text-592","type":"text","heading":"","plain_text":"Use a revision control system for complex scripts with a long lifetime","html":"<p>Use a revision control system for complex scripts with a long lifetime</p>"},{"id":"text-593","type":"text","heading":"","plain_text":"Assume your script volonté have a long lifetime unless you are certain it won&#39;t","html":"<p>Assume your script volonté have a long lifetime unless you are certain it won&#039;t</p>"},{"id":"text-594","type":"text","heading":"","plain_text":"Document any non-standard external utilities which your script needs","html":"<p>Document any non-standard external utilities which your script needs</p>"},{"id":"text-595","type":"text","heading":"","plain_text":"Document your scripts with inline comments &#8211; you&#39;ll need them in a few months when you edit it.","html":"<p>Document your scripts with inline comments &#8211; you&#039;ll need them in a few months when you edit it.</p>"},{"id":"text-596","type":"text","heading":"","plain_text":"Treat standard input and output in the normal way, so that your script can be used\nin combination with other programs (the Unix toolkit philosophy)","html":"<p>Treat standard input and output in the normal way, so that your script can be used\nin combination with other programs (the Unix toolkit philosophy)</p>"},{"id":"text-597","type":"text","heading":"","plain_text":"Be consistent in the format of your output, so that other programs can rely on it","html":"<p>Be consistent in the format of your output, so that other programs can rely on it</p>"},{"id":"text-598","type":"text","heading":"","plain_text":"Use options to control behaviour such as verbosity of output.  Overly chatty programs are\nvery hard to combine with other utilities","html":"<p>Use options to control behaviour such as verbosity of output.  Overly chatty programs are\nvery hard to combine with other utilities</p>"},{"id":"text-599","type":"text","heading":"","plain_text":"Use interactive features (prompting the user for information) très parcimonieusement.\nDoing so renders the script unuseable in pipeline combinations with other programs, or in unattended\noperations.","html":"<p>Use interactive features (prompting the user for information) très parcimonieusement.\nDoing so renders the script unuseable in pipeline combinations with other programs, or in unattended\noperations.</p>"},{"id":"text-600","type":"text","heading":"","plain_text":"Test (a lot)","html":"<p>Test (a lot)</p>"},{"id":"text-601","type":"text","heading":"","plain_text":"When not to use shell scripts","html":"<p>When not to use shell scripts</p>"},{"id":"text-602","type":"text","heading":"","plain_text":"If an existing tool already does what you need &#8211; use it.","html":"<p>If an existing tool already does what you need &#8211; use it.</p>"},{"id":"text-603","type":"text","heading":"","plain_text":"If the script is more than a few hundred lines, you are probably using the wrong tool.","html":"<p>If the script is more than a few hundred lines, you are probably using the wrong tool.</p>"},{"id":"text-604","type":"text","heading":"","plain_text":"If performance is horrible, and the script is used a lot, you might want to consider another language.","html":"<p>If performance is horrible, and the script is used a lot, you might want to consider another language.</p>"},{"id":"text-605","type":"text","heading":"","plain_text":"(31)","html":"<p>(31)</p>"},{"id":"text-606","type":"text","heading":"","plain_text":"The class accounts have directories with all of the examples from the books by Blinn,\nMichael, Rosenblatt, and Taylor.  These can also be downloaded (see the References page).\nSome of these are linked below (but not included in the printed notes), with additional comments.","html":"<p>The class accounts have directories with all of the examples from the books by Blinn,\nMichael, Rosenblatt, and Taylor.  These can also be downloaded (see the References page).\nSome of these are linked below (but not included in the printed notes), with additional comments.</p>"},{"id":"text-607","type":"text","heading":"","plain_text":"Download a compressed tar file of all example scripts used in these notes.","html":"<p>Download a compressed tar file of all example scripts used in these notes.</p>"},{"id":"text-608","type":"text","heading":"","plain_text":"postprint display, textA wrapper script for printing a mix of text and postscript files","html":"<p>postprint display, textA wrapper script for printing a mix of text and postscript files</p>"},{"id":"text-609","type":"text","heading":"","plain_text":"checkpath display,\ntexteCheck all the directories in the $PATH    for possibly conflicting programs.","html":"<p>checkpath display,\ntexteCheck all the directories in the $PATH    for possibly conflicting programs.</p>"},{"id":"text-610","type":"text","heading":"","plain_text":"run-with-timeout display,\ntexteRun a command with a timeout.  Kill the command if it hasn&#39;t finished when the timeout expires.","html":"<p>run-with-timeout display,\ntexteRun a command with a timeout.  Kill the command if it hasn&#039;t finished when the timeout expires.</p>"},{"id":"text-611","type":"text","heading":"","plain_text":"MailPkg display, textTar, compress, split and uuendcode a set of files for mailing. (Blinn)","html":"<p>MailPkg display, textTar, compress, split and uuendcode a set of files for mailing. (Blinn)</p>"},{"id":"text-612","type":"text","heading":"","plain_text":"Ptree (original) display, text\nPtree (ksh version) display, textRuns &quot;ps&quot; to get a process listing and then\nreformats to show the process family hierarchies.  The original example is pure Bourne shell\nand inefficient.  The ksh version is a fairly simple translation to use ksh internal commands\nwhere possible, and avoid writing scratch files,  and runs very much faster.  (Blinn).","html":"<p>Ptree (original) display, text\nPtree (ksh version) display, textRuns &quot;ps&quot; to get a process listing and then\nreformats to show the process family hierarchies.  The original example is pure Bourne shell\nand inefficient.  The ksh version is a fairly simple translation to use ksh internal commands\nwhere possible, and avoid writing scratch files,  and runs very much faster.  (Blinn).</p>"},{"id":"text-613","type":"text","heading":"","plain_text":"This entire tutorial was created from individual HTML pages using a content management system written\nas ksh scripts (heavily using sed to edit the pages), coordinated by faire.\n&lt;! &#8211;","html":"<p>This entire tutorial was created from individual HTML pages using a content management system written\nas ksh scripts (heavily using sed to edit the pages), coordinated by faire.\n&lt;! &#8211;</p>"},{"id":"text-614","type":"text","heading":"","plain_text":"buildhtml afficher, texte\nTurns a stand-alone HTML file into a component of the tutorial, with navigation links and frames.\nbuildslidelist afficher, texte\nCreates the slide list which appears as the left frame of the tutorial.\nbuildframeset afficher, texte\nCreates a top level frameset to call the slide list and content pages.\nksh2html afficher, texte\nCreates the colourized HTML page of a shell script.\nMakefile texte\nMakefile used to build the site using the above tools","html":"<p>buildhtml afficher, texte\nTurns a stand-alone HTML file into a component of the tutorial, with navigation links and frames.\nbuildslidelist afficher, texte\nCreates the slide list which appears as the left frame of the tutorial.\nbuildframeset afficher, texte\nCreates a top level frameset to call the slide list and content pages.\nksh2html afficher, texte\nCreates the colourized HTML page of a shell script.\nMakefile texte\nMakefile used to build the site using the above tools</p>"},{"id":"text-615","type":"text","heading":"","plain_text":"-&gt;","html":"<p>-&gt;</p>"},{"id":"text-616","type":"text","heading":"","plain_text":"You can even write an entire web server as a shell script.  This one is part of the\nLEAF\n(Linux Embedded Appliance Firewall) project.  This wouldn&#39;t be suitable for much load, but handles occasional queries on\nstatic HTML and CGI scripts.\n(www.nisi.ab.ca/lrp/Packages/weblet.htm)","html":"<p>You can even write an entire web server as a shell script.  This one is part of the\nLEAF\n(Linux Embedded Appliance Firewall) project.  This wouldn&#039;t be suitable for much load, but handles occasional queries on\nstatic HTML and CGI scripts.\n(www.nisi.ab.ca/lrp/Packages/weblet.htm)</p>"},{"id":"text-617","type":"text","heading":"","plain_text":"(32)","html":"<p>(32)</p>"},{"id":"text-618","type":"text","heading":"","plain_text":"The following commands are very frequently used in shell scripts.  Many of them are used\nin the examples in these notes.  This is just a brief recap &#8212; see the man pages for details on usage.\nThe most useful are flagged with *.","html":"<p>The following commands are very frequently used in shell scripts.  Many of them are used\nin the examples in these notes.  This is just a brief recap &#8212; see the man pages for details on usage.\nThe most useful are flagged with *.</p>"},{"id":"text-619","type":"text","heading":"","plain_text":"Most of these commands will operate on a one or more named files, or will operate on a stream of\ndata from standard input if no files are named.\nListing, copying and moving files and directories","html":"<p>Most of these commands will operate on a one or more named files, or will operate on a stream of\ndata from standard input if no files are named.\nListing, copying and moving files and directories</p>"},{"id":"text-620","type":"text","heading":"","plain_text":"ls *","html":"<p>ls *</p>"},{"id":"text-621","type":"text","heading":"","plain_text":"list contents of a directory, or list details of files and directories.","html":"<p>list contents of a directory, or list details of files and directories.</p>"},{"id":"text-622","type":"text","heading":"","plain_text":"mkdir; rmdir *","html":"<p>mkdir; rmdir *</p>"},{"id":"text-623","type":"text","heading":"","plain_text":"Make and Remove directories.","html":"<p>Make and Remove directories.</p>"},{"id":"text-624","type":"text","heading":"","plain_text":"rm; cp; mv *","html":"<p>rm; cp; mv *</p>"},{"id":"text-625","type":"text","heading":"","plain_text":"Remove (delete), Copy and Move (rename) files and directories","html":"<p>Remove (delete), Copy and Move (rename) files and directories</p>"},{"id":"text-626","type":"text","heading":"","plain_text":"toucher *","html":"<p>toucher *</p>"},{"id":"text-627","type":"text","heading":"","plain_text":"Update the last modifed timestamp on a file, to make it appear to have just been written.","html":"<p>Update the last modifed timestamp on a file, to make it appear to have just been written.</p>"},{"id":"text-628","type":"text","heading":"","plain_text":"If the file does not exist, a new zero-byte file is created, which is often useful to signify that\nan event has occurred.","html":"<p>If the file does not exist, a new zero-byte file is created, which is often useful to signify that\nan event has occurred.</p>"},{"id":"text-629","type":"text","heading":"","plain_text":"tee","html":"<p>tee</p>"},{"id":"text-630","type":"text","heading":"","plain_text":"Make a duplicate copy of a data stream &#8211; used in pipelines to send one copy to a log file\nand a second copy on to another program.  (Think plumbing).","html":"<p>Make a duplicate copy of a data stream &#8211; used in pipelines to send one copy to a log file\nand a second copy on to another program.  (Think plumbing).</p>"},{"id":"text-631","type":"text","heading":"","plain_text":"Displaying text, files or parts of files","html":"<p>Displaying text, files or parts of files</p>"},{"id":"text-632","type":"text","heading":"","plain_text":"écho *","html":"<p>écho *</p>"},{"id":"text-633","type":"text","heading":"","plain_text":"Echo the arguments to standard output &#8212; used for messages from scripts.\nSome versions of &quot;sh&quot;, and all csh/ksh/bash shells internalized &quot;echo&quot;.","html":"<p>Echo the arguments to standard output &#8212; used for messages from scripts.\nSome versions of &quot;sh&quot;, and all csh/ksh/bash shells internalized &quot;echo&quot;.</p>"},{"id":"text-634","type":"text","heading":"","plain_text":"Conflicts\nsometimes arise over the syntax for echoing a line with no trailing CR/LF.\nSome use &quot;c&quot; and some use option &quot;-n&quot;.  To avoid these problems, ksh also provides the &quot;print&quot;\ncommand for output.","html":"<p>Conflicts\nsometimes arise over the syntax for echoing a line with no trailing CR/LF.\nSome use &quot;c&quot; and some use option &quot;-n&quot;.  To avoid these problems, ksh also provides the &quot;print&quot;\ncommand for output.</p>"},{"id":"text-635","type":"text","heading":"","plain_text":"chat *","html":"<p>chat *</p>"},{"id":"text-636","type":"text","heading":"","plain_text":"Copy and concatenate files; display contents of a file","html":"<p>Copy and concatenate files; display contents of a file</p>"},{"id":"text-637","type":"text","heading":"","plain_text":"tête, queue *","html":"<p>tête, queue *</p>"},{"id":"text-638","type":"text","heading":"","plain_text":"Display the beginning of a file, or the end of it.","html":"<p>Display the beginning of a file, or the end of it.</p>"},{"id":"text-639","type":"text","heading":"","plain_text":"Couper","html":"<p>Couper</p>"},{"id":"text-640","type":"text","heading":"","plain_text":"Extract selected fields from each line of a file.  Often awk is easier to use, even though it is\na more complex program.","html":"<p>Extract selected fields from each line of a file.  Often awk is easier to use, even though it is\na more complex program.</p>"},{"id":"text-641","type":"text","heading":"","plain_text":"toilettes","html":"<p>toilettes</p>"},{"id":"text-642","type":"text","heading":"","plain_text":"Count lines, words and characters in the input.","html":"<p>Count lines, words and characters in the input.</p>"},{"id":"text-643","type":"text","heading":"","plain_text":"Compression and archiving","html":"<p>Compression and archiving</p>"},{"id":"text-644","type":"text","heading":"","plain_text":"compresse; gzip, Zip *: français; le goudron *","html":"<p>compresse; gzip, Zip *: français; le goudron *</p>"},{"id":"text-645","type":"text","heading":"","plain_text":"Various utilities to compress/uncompress individual files, combine multiple files into a single archive, or\ndo both.","html":"<p>Various utilities to compress/uncompress individual files, combine multiple files into a single archive, or\ndo both.</p>"},{"id":"text-646","type":"text","heading":"","plain_text":"Sorting and searching for patterns","html":"<p>Sorting and searching for patterns</p>"},{"id":"text-647","type":"text","heading":"","plain_text":"Trier *","html":"<p>Trier *</p>"},{"id":"text-648","type":"text","heading":"","plain_text":"Sort data alphabetically or numerically.","html":"<p>Sort data alphabetically or numerically.</p>"},{"id":"text-649","type":"text","heading":"","plain_text":"grep *","html":"<p>grep *</p>"},{"id":"text-650","type":"text","heading":"","plain_text":"Search a file for lines containing character patterns.  The patterns can be simple fixed text, or very complex\nregular expressions.","html":"<p>Search a file for lines containing character patterns.  The patterns can be simple fixed text, or very complex\nregular expressions.</p>"},{"id":"text-651","type":"text","heading":"","plain_text":"The name comes from &quot;Global Regular Expression and Print&quot; &#8212; a function from\nthe Unix editors which was used frequently enough to warrant getting its own program.","html":"<p>The name comes from &quot;Global Regular Expression and Print&quot; &#8212; a function from\nthe Unix editors which was used frequently enough to warrant getting its own program.</p>"},{"id":"text-652","type":"text","heading":"","plain_text":"uniq *","html":"<p>uniq *</p>"},{"id":"text-653","type":"text","heading":"","plain_text":"Remove duplicate lines, and generate a count of repeated lines.","html":"<p>Remove duplicate lines, and generate a count of repeated lines.</p>"},{"id":"text-654","type":"text","heading":"","plain_text":"toilettes *","html":"<p>toilettes *</p>"},{"id":"text-655","type":"text","heading":"","plain_text":"Count lines, words and characters in a file.","html":"<p>Count lines, words and characters in a file.</p>"},{"id":"text-656","type":"text","heading":"","plain_text":"System information (users, processes, time)","html":"<p>System information (users, processes, time)</p>"},{"id":"text-657","type":"text","heading":"","plain_text":"rendez-vous amoureux *","html":"<p>rendez-vous amoureux *</p>"},{"id":"text-658","type":"text","heading":"","plain_text":"Display the current date and time (flexible format).  Useful for conditional execution based on\ntime, and for timestamping output.","html":"<p>Display the current date and time (flexible format).  Useful for conditional execution based on\ntime, and for timestamping output.</p>"},{"id":"text-659","type":"text","heading":"","plain_text":"ps *","html":"<p>ps *</p>"},{"id":"text-660","type":"text","heading":"","plain_text":"List the to a running processes.","html":"<p>List the to a running processes.</p>"},{"id":"text-661","type":"text","heading":"","plain_text":"tuer *","html":"<p>tuer *</p>"},{"id":"text-662","type":"text","heading":"","plain_text":"Send a signal (interrupt) to a running process.","html":"<p>Send a signal (interrupt) to a running process.</p>"},{"id":"text-663","type":"text","heading":"","plain_text":"identifiant","html":"<p>identifiant</p>"},{"id":"text-664","type":"text","heading":"","plain_text":"Print the user name and UID and group of the current user (e.g. to distinguish priviledged users before\nattempting to run programs which may fail with permission errors)","html":"<p>Print the user name and UID and group of the current user (e.g. to distinguish priviledged users before\nattempting to run programs which may fail with permission errors)</p>"},{"id":"text-665","type":"text","heading":"","plain_text":"qui","html":"<p>qui</p>"},{"id":"text-666","type":"text","heading":"","plain_text":"Display who is logged on the system, and from where they logged in.","html":"<p>Display who is logged on the system, and from where they logged in.</p>"},{"id":"text-667","type":"text","heading":"","plain_text":"uname *","html":"<p>uname *</p>"},{"id":"text-668","type":"text","heading":"","plain_text":"Display information about the system, OS version, hardware architecture etc.","html":"<p>Display information about the system, OS version, hardware architecture etc.</p>"},{"id":"text-669","type":"text","heading":"","plain_text":"courrier *","html":"<p>courrier *</p>"},{"id":"text-670","type":"text","heading":"","plain_text":"Send mail, from a file or standard input, to named recipients.  Since scripts are often used to automate\nlong-running background jobs, sending notification of completion by mail is a common trick.","html":"<p>Send mail, from a file or standard input, to named recipients.  Since scripts are often used to automate\nlong-running background jobs, sending notification of completion by mail is a common trick.</p>"},{"id":"text-671","type":"text","heading":"","plain_text":"enregistreur","html":"<p>enregistreur</p>"},{"id":"text-672","type":"text","heading":"","plain_text":"Place a message in the central system logging facility.  Scripts can submit messages\nwith all the facilities available to compiled programs.","html":"<p>Place a message in the central system logging facility.  Scripts can submit messages\nwith all the facilities available to compiled programs.</p>"},{"id":"text-673","type":"text","heading":"","plain_text":"nom d&#39;hôte","html":"<p>nom d&#039;hôte</p>"},{"id":"text-674","type":"text","heading":"","plain_text":"Display the hostname of the current host &#8211; usful to keep track of where your programs are running","html":"<p>Display the hostname of the current host &#8211; usful to keep track of where your programs are running</p>"},{"id":"text-675","type":"text","heading":"","plain_text":"Conditional tests","html":"<p>Conditional tests</p>"},{"id":"text-676","type":"text","heading":"","plain_text":"tester; [[[[ *","html":"<p>tester; [[[[ *</p>"},{"id":"text-677","type":"text","heading":"","plain_text":"The conditional test, used extensively in scripts, is also an external program which evaluates\nthe expression given as an argument and returns true (0) or false (1) exit status.  The name &quot;[&quot; is a\nlink to the &quot;test&quot; program, so a line like:si [ -w logfile ] actually runs a program &quot;[« , with arguments « -w logfile ]&quot;, and returns a true/false value to the &quot;if&quot;\ncommander.","html":"<p>The conditional test, used extensively in scripts, is also an external program which evaluates\nthe expression given as an argument and returns true (0) or false (1) exit status.  The name &quot;[&quot; is a\nlink to the &quot;test&quot; program, so a line like:si [ -w logfile ] actually runs a program &quot;[« , with arguments « -w logfile ]&quot;, and returns a true/false value to the &quot;if&quot;\ncommander.</p>"},{"id":"text-678","type":"text","heading":"","plain_text":"In ksh and most newer versions of sh, &quot;[&quot; is replaced with a compatible internal command, but the\nargument parsing is performed as if it were an external command.\nKsh also provides the internal &quot;[[&quot; operator, with simplified syntax.","html":"<p>In ksh and most newer versions of sh, &quot;[&quot; is replaced with a compatible internal command, but the\nargument parsing is performed as if it were an external command.\nKsh also provides the internal &quot;[[&quot; operator, with simplified syntax.</p>"},{"id":"text-679","type":"text","heading":"","plain_text":"Stream Editing","html":"<p>Stream Editing</p>"},{"id":"text-680","type":"text","heading":"","plain_text":"awk *","html":"<p>awk *</p>"},{"id":"text-681","type":"text","heading":"","plain_text":"A pattern matching and data manipulation utility, which has its own scripting language.  It also duplicates\nmuch functionality from &#39;sed&#39;,&#39;grep&#39;,&#39;cut&#39;,&#39;wc&#39;, etc.","html":"<p>A pattern matching and data manipulation utility, which has its own scripting language.  It also duplicates\nmuch functionality from &#039;sed&#039;,&#039;grep&#039;,&#039;cut&#039;,&#039;wc&#039;, etc.</p>"},{"id":"text-682","type":"text","heading":"","plain_text":"Complex scripts can be written entirely using awk, but it is\nfrequently used just to extract fields from lines of a file (similar to &#39;cut&#39;).","html":"<p>Complex scripts can be written entirely using awk, but it is\nfrequently used just to extract fields from lines of a file (similar to &#039;cut&#039;).</p>"},{"id":"text-683","type":"text","heading":"","plain_text":"sed *","html":"<p>sed *</p>"},{"id":"text-684","type":"text","heading":"","plain_text":"Stream Editor.  A flexible editor which operates by applying editing rules to every line in a data stream\nin turn.","html":"<p>Stream Editor.  A flexible editor which operates by applying editing rules to every line in a data stream\nin turn.</p>"},{"id":"text-685","type":"text","heading":"","plain_text":"Since it makes a single pass through the file, keeping only a few lines in memory at once,\nit can be used with infinitely large data sets.  It is mostly used for global search and replace operations.\nIt is a superset of &#39;tr&#39;, &#39;grep&#39;, and &#39;cut&#39;, but is more complicated to use.","html":"<p>Since it makes a single pass through the file, keeping only a few lines in memory at once,\nit can be used with infinitely large data sets.  It is mostly used for global search and replace operations.\nIt is a superset of &#039;tr&#039;, &#039;grep&#039;, and &#039;cut&#039;, but is more complicated to use.</p>"},{"id":"text-686","type":"text","heading":"","plain_text":"tr","html":"<p>tr</p>"},{"id":"text-687","type":"text","heading":"","plain_text":"Transliterate &#8211; perform very simple single-character edits on a file.","html":"<p>Transliterate &#8211; perform very simple single-character edits on a file.</p>"},{"id":"text-688","type":"text","heading":"","plain_text":"Finding and comparing files","html":"<p>Finding and comparing files</p>"},{"id":"text-689","type":"text","heading":"","plain_text":"trouver *","html":"<p>trouver *</p>"},{"id":"text-690","type":"text","heading":"","plain_text":"Search the filesystem and find files matching certain criteria (name pattern, age, owner, size,\nlast modified etc.)","html":"<p>Search the filesystem and find files matching certain criteria (name pattern, age, owner, size,\nlast modified etc.)</p>"},{"id":"text-691","type":"text","heading":"","plain_text":"xargs *","html":"<p>xargs *</p>"},{"id":"text-692","type":"text","heading":"","plain_text":"Apply multiple filename arguments to a named command and run it.","html":"<p>Apply multiple filename arguments to a named command and run it.</p>"},{"id":"text-693","type":"text","heading":"","plain_text":"Xargs is often used in combination\nwith &quot;find&quot; to apply some command to all the files matching certain criteria.  Since &quot;find&quot; may result in a very\nlarge list of pathnames, using the results directly may overflow command line buffers.  Xargs avoids this problem,\nand is much more efficient than running a command on every pathname individually.","html":"<p>Xargs is often used in combination\nwith &quot;find&quot; to apply some command to all the files matching certain criteria.  Since &quot;find&quot; may result in a very\nlarge list of pathnames, using the results directly may overflow command line buffers.  Xargs avoids this problem,\nand is much more efficient than running a command on every pathname individually.</p>"},{"id":"text-694","type":"text","heading":"","plain_text":"diff *","html":"<p>diff *</p>"},{"id":"text-695","type":"text","heading":"","plain_text":"Compare two files and list the differences between them.","html":"<p>Compare two files and list the differences between them.</p>"},{"id":"text-696","type":"text","heading":"","plain_text":"basename pathname","html":"<p>basename pathname</p>"},{"id":"text-697","type":"text","heading":"","plain_text":"Returns the base filename portion of the named pathname, stripping off all the directories","html":"<p>Returns the base filename portion of the named pathname, stripping off all the directories</p>"},{"id":"text-698","type":"text","heading":"","plain_text":"dirname pathname","html":"<p>dirname pathname</p>"},{"id":"text-699","type":"text","heading":"","plain_text":"Returns the directory portion of the named pathname, stripping off the filename","html":"<p>Returns the directory portion of the named pathname, stripping off the filename</p>"},{"id":"text-700","type":"text","heading":"","plain_text":"Arithmetic and String Manipulation","html":"<p>Arithmetic and String Manipulation</p>"},{"id":"text-701","type":"text","heading":"","plain_text":"expr *","html":"<p>expr *</p>"},{"id":"text-702","type":"text","heading":"","plain_text":"The &quot;expr&quot; command takes an numeric or text pattern expression as an argument, evaluates it, and\nreturns a result to stdout.  The original Bourne shell had no built-in arithmetic operators.\nPar exemple.    expr 2 + 1      expr 2 &#39;*&#39; &#39;(&#39; 21 + 3 &#39;)&#39;  Used with text strings, &quot;expr&quot; can match regular expressions and extract sub expressions.  Similar functionality\ncan be achived with sed.\npar exemple.    expr SP99302L.Z00 : &#39;[A-Z0-9]4\\([0-9]3\\)L.*&#39;","html":"<p>The &quot;expr&quot; command takes an numeric or text pattern expression as an argument, evaluates it, and\nreturns a result to stdout.  The original Bourne shell had no built-in arithmetic operators.\nPar exemple.    expr 2 + 1      expr 2 &#039;*&#039; &#039;(&#039; 21 + 3 &#039;)&#039;  Used with text strings, &quot;expr&quot; can match regular expressions and extract sub expressions.  Similar functionality\ncan be achived with sed.\npar exemple.    expr SP99302L.Z00 : &#039;[A-Z0-9]4\\([0-9]3\\)L.*&#039;</p>"},{"id":"text-703","type":"text","heading":"","plain_text":"dc","html":"<p>dc</p>"},{"id":"text-704","type":"text","heading":"","plain_text":"Desk Calculator &#8211; an RPN calculator, using arbitrary precision arithmetic and\nuser-specified bases.  Useful for more complex arithmetic expressions than can be performed\ninternally or using expr","html":"<p>Desk Calculator &#8211; an RPN calculator, using arbitrary precision arithmetic and\nuser-specified bases.  Useful for more complex arithmetic expressions than can be performed\ninternally or using expr</p>"},{"id":"text-705","type":"text","heading":"","plain_text":"avant JC","html":"<p>avant JC</p>"},{"id":"text-706","type":"text","heading":"","plain_text":"A preprocessor for dc    which provides infix notation and a C-like syntax for\nexpressions and functions.","html":"<p>A preprocessor for dc    which provides infix notation and a C-like syntax for\nexpressions and functions.</p>"},{"id":"text-707","type":"text","heading":"","plain_text":"Merging files","html":"<p>Merging files</p>"},{"id":"text-708","type":"text","heading":"","plain_text":"coller","html":"<p>coller</p>"},{"id":"text-709","type":"text","heading":"","plain_text":"Merge lines from multiple files into tab-delimited columns.","html":"<p>Merge lines from multiple files into tab-delimited columns.</p>"},{"id":"text-710","type":"text","heading":"","plain_text":"joindre","html":"<p>joindre</p>"},{"id":"text-711","type":"text","heading":"","plain_text":"Perform a join (in the relational database sense) of lines in two sorted input files.","html":"<p>Perform a join (in the relational database sense) of lines in two sorted input files.</p>"},{"id":"text-712","type":"text","heading":"","plain_text":"(33)","html":"<p>(33)</p>"},{"id":"text-713","type":"text","heading":"","plain_text":"The standard man pages for sh    et ksh    are quite complete, but not easy to\nlearn from.  The following is a sampling of the many available books on the subject.  The Bolsky and Korn\nbook might be viewed as the standard &quot;reference&quot;.  The Blinn book is Bourne shell, but everything in it should\nwork for either shell.The links are to publisher&#39;s web sites, or Amazon.com. Some links are also given to the example\nscripts provided with the books.\nLivres","html":"<p>The standard man pages for sh    et ksh    are quite complete, but not easy to\nlearn from.  The following is a sampling of the many available books on the subject.  The Bolsky and Korn\nbook might be viewed as the standard &quot;reference&quot;.  The Blinn book is Bourne shell, but everything in it should\nwork for either shell.The links are to publisher&#039;s web sites, or Amazon.com. Some links are also given to the example\nscripts provided with the books.\nLivres</p>"},{"id":"text-714","type":"text","heading":"","plain_text":"The New KornShell Command And Programming Language, by Morris I. Bolsky, David G. Korn (Contributor).","html":"<p>The New KornShell Command And Programming Language, by Morris I. Bolsky, David G. Korn (Contributor).</p>"},{"id":"text-715","type":"text","heading":"","plain_text":"Plus d&#39;informations\nLearning the Korn Shell, 2nd Edn. by Bill Rosenblatt and Arnold Robbins.","html":"<p>Plus d&#039;informations\nLearning the Korn Shell, 2nd Edn. by Bill Rosenblatt and Arnold Robbins.</p>"},{"id":"text-716","type":"text","heading":"","plain_text":"Plus d&#39;informations\nKorn Shell Programming by Example, by Dennis O&#39;Brien, David Pitts (Contributor).","html":"<p>Plus d&#039;informations\nKorn Shell Programming by Example, by Dennis O&#039;Brien, David Pitts (Contributor).</p>"},{"id":"text-717","type":"text","heading":"","plain_text":"Plus d&#39;informations\nThe Korn Shell Linux and Unix Programming Manual (2nd Edn) by Anatole Olczak.","html":"<p>Plus d&#039;informations\nThe Korn Shell Linux and Unix Programming Manual (2nd Edn) by Anatole Olczak.</p>"},{"id":"text-718","type":"text","heading":"","plain_text":"Plus d&#39;informations\nPortable Shell Programming: An Extensive Collection of Bourne Shell Examples by Bruce Blinn.","html":"<p>Plus d&#039;informations\nPortable Shell Programming: An Extensive Collection of Bourne Shell Examples by Bruce Blinn.</p>"},{"id":"text-719","type":"text","heading":"","plain_text":"Plus d&#39;informationsExamples from this book can be downloaded for study.\nLinux Shell Scripting with Bash by Ken O. Burtch.","html":"<p>Plus d&#039;informationsExamples from this book can be downloaded for study.\nLinux Shell Scripting with Bash by Ken O. Burtch.</p>"},{"id":"text-720","type":"text","heading":"","plain_text":"Plus d&#39;informations\nUnix Shell Programming by Stephen Kochan and Patrick Wood (third Edition).","html":"<p>Plus d&#039;informations\nUnix Shell Programming by Stephen Kochan and Patrick Wood (third Edition).</p>"},{"id":"text-721","type":"text","heading":"","plain_text":"Plus d&#39;informations\nTeach yourself Shell Programming in 24 Hours,\nby S. Veeraraghavan. SAMS 2nd Edn. (2002)\nPlus d&#39;informations","html":"<p>Plus d&#039;informations\nTeach yourself Shell Programming in 24 Hours,\nby S. Veeraraghavan. SAMS 2nd Edn. (2002)\nPlus d&#039;informations</p>"},{"id":"text-722","type":"text","heading":"","plain_text":"Mastering Unix Shell Scripting\nby Randal K. Michael, Wiley (2003)\nPlus d&#39;informations\nLight on basics, but develops scripting through examples. Ksh only.\nExamples can be\ntéléchargé\nfrom the Wiley site (www.wiley.com/legacy/compbooks/michael/).","html":"<p>Mastering Unix Shell Scripting\nby Randal K. Michael, Wiley (2003)\nPlus d&#039;informations\nLight on basics, but develops scripting through examples. Ksh only.\nExamples can be\ntéléchargé\nfrom the Wiley site (www.wiley.com/legacy/compbooks/michael/).</p>"},{"id":"text-723","type":"text","heading":"","plain_text":"Wicked Cool Shell Scripts\nby Dave Taylor, No Starch Press (2004)\nPlus d&#39;informations\nDevelops scripting entirely through examples, drawn from Linux and OSX in addition to traditional Unix.\nRecommended, but not for beginners.\nExamples can be\ntéléchargé\nfrom the Intuitive site (www.intuitive.com/wicked/wicked-cool-shell-script-library.shtml).","html":"<p>Wicked Cool Shell Scripts\nby Dave Taylor, No Starch Press (2004)\nPlus d&#039;informations\nDevelops scripting entirely through examples, drawn from Linux and OSX in addition to traditional Unix.\nRecommended, but not for beginners.\nExamples can be\ntéléchargé\nfrom the Intuitive site (www.intuitive.com/wicked/wicked-cool-shell-script-library.shtml).</p>"},{"id":"text-724","type":"text","heading":"","plain_text":"Unix Power Tools, by S. Powers, J. Peek, T. O&#39;Reilly, M. Loudikes et al.","html":"<p>Unix Power Tools, by S. Powers, J. Peek, T. O&#039;Reilly, M. Loudikes et al.</p>"},{"id":"text-725","type":"text","heading":"","plain_text":"Plus d&#39;informations","html":"<p>Plus d&#039;informations</p>"},{"id":"text-726","type":"text","heading":"","plain_text":"Online Resources","html":"<p>Online Resources</p>"},{"id":"text-727","type":"text","heading":"","plain_text":"Shelldorado (http://www.shelldorado.com)Lots of links to scripting resources","html":"<p>Shelldorado (http://www.shelldorado.com)Lots of links to scripting resources</p>"},{"id":"text-728","type":"text","heading":"","plain_text":"Kornshell (http://www.kornshell.com)The official Korn shell home page, with download links.","html":"<p>Kornshell (http://www.kornshell.com)The official Korn shell home page, with download links.</p>"},{"id":"text-729","type":"text","heading":"","plain_text":"Mac OSX Unix tutorial (http://www.osxfaq.com/Tutorials/LearningCenter/)Good resource on advanced use of OSX and Unix shell scripting in general","html":"<p>Mac OSX Unix tutorial (http://www.osxfaq.com/Tutorials/LearningCenter/)Good resource on advanced use of OSX and Unix shell scripting in general</p>"},{"id":"text-730","type":"text","heading":"","plain_text":"Unix-like shells and utilities for Microsoft Windows","html":"<p>Unix-like shells and utilities for Microsoft Windows</p>"},{"id":"text-731","type":"text","heading":"","plain_text":"U/Win (http://www.research.att.com/sw/tools/uwin/)\nA free port of ksh and Unix command line utilities, plus Windows DLL for Unix compatability. Developed by AT&amp;T Research.","html":"<p>U/Win (http://www.research.att.com/sw/tools/uwin/)\nA free port of ksh and Unix command line utilities, plus Windows DLL for Unix compatability. Developed by AT&amp;T Research.</p>"},{"id":"text-732","type":"text","heading":"","plain_text":"Cygwin (http://www.cygwin.com/)\nA free Linux-like environment for Windows. Provides bash, command line utilities and DLLs. Developed by RedHat. Un\nX server is also available.","html":"<p>Cygwin (http://www.cygwin.com/)\nA free Linux-like environment for Windows. Provides bash, command line utilities and DLLs. Developed by RedHat. Un\nX server is also available.</p>"},{"id":"text-733","type":"text","heading":"","plain_text":"MKS Toolkit (http://www.mkssoftware.com/)\nA commercial ksh clone and command line utilities, plus DLL for Unix compatability.  An X server is also available.","html":"<p>MKS Toolkit (http://www.mkssoftware.com/)\nA commercial ksh clone and command line utilities, plus DLL for Unix compatability.  An X server is also available.</p>"},{"id":"text-734","type":"text","heading":"","plain_text":"Microsoft Services for UNIX (http://www.microsoft.com/windows/sfu/)\nA POSIX environment for Windows, with ksh, csh, command line tools, libraries and software development tools.\nDeveloped by Interix and bought by Microsoft.  Free download.","html":"<p>Microsoft Services for UNIX (http://www.microsoft.com/windows/sfu/)\nA POSIX environment for Windows, with ksh, csh, command line tools, libraries and software development tools.\nDeveloped by Interix and bought by Microsoft.  Free download.</p>"},{"id":"text-735","type":"text","heading":"","plain_text":"Unix shell scripting with ksh/bash: Course Handout[an error occurred while processing this directive]","html":"<p>Unix shell scripting with ksh/bash: Course Handout[an error occurred while processing this directive]</p>"},{"id":"text-736","type":"text","heading":"","plain_text":"(last update   22 March 2012)  ©Dartmouth College\n    http://www.dartmouth.edu/~rc/classes/ksh","html":"<p>(last update   22 March 2012)  ©Dartmouth College\n    http://www.dartmouth.edu/~rc/classes/ksh</p>"},{"id":"text-737","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Script shell Unix avec ksh / bash\n    Document du cours: (dernière mise à jour le 22 mars 2012) \nCes notes sont disponibles sur http://www.dartmouth.edu/~rc/classes/ksh. La version en ligne contient de nombreux liens vers des informations supplémentaires et peut être plus à jour que les notes imprimées."},{"id":"text-2","heading":"Text","content":"Les objectifs de cette classe sont de vous permettre de:"},{"id":"text-3","heading":"Text","content":"Découvrez quels types de problèmes conviennent aux scripts shell"},{"id":"text-4","heading":"Text","content":"Passez en revue les commandes Unix les plus couramment utilisées et utiles dans les scripts de shell."},{"id":"text-5","heading":"Text","content":"Écrire des scripts shell simples en utilisant les shells Bourne, Korn ou Bash"},{"id":"text-6","heading":"Text","content":"Ces notes sont destinées à être utilisées dans un cours en deux parties, d’une durée totale de 3 heures."},{"id":"text-7","heading":"Text","content":"Hypothèses:On suppose que vous savez déjà comment:"},{"id":"text-8","heading":"Text","content":"connectez-vous et obtenez une fenêtre de ligne de commande (n&#39;importe quel shell)"},{"id":"text-9","heading":"Text","content":"exécuter des commandes de base, naviguer dans les répertoires"},{"id":"text-10","heading":"Text","content":"utiliser une redirection simple d&#39;E / S et des tubes"},{"id":"text-11","heading":"Text","content":"utiliser un éditeur de texte (n&#39;importe lequel)"},{"id":"text-12","heading":"Text","content":"recherche des détails sur l&#39;utilisation des commandes dans les pages de manuel"},{"id":"text-13","heading":"Text","content":"Des exemples de commandes sont affichés comme ça. Beaucoup de commandes\nsont affichés avec des liens vers leurs pages de manuel complètes\n(sh)La sortie des commandes est affichée comme ça;\nles éléments optionnels sont [ in brackets ]."},{"id":"text-14","heading":"Text","content":"Certaines descriptions dans ces notes ont plus de détails disponibles,\net sont notés comme ceci:"},{"id":"text-15","heading":"Text","content":"Plus de détails sur cet article apparaissent ici. Les notes imprimées\ninclure toutes les informations supplémentaires"},{"id":"text-16","heading":"Text","content":"La permission est donnée de télécharger et d’utiliser ces notes et exemples de scripts, à condition que\ntous les avis de droits d&#39;auteur sont conservés intacts. Certains exemples sont tirés de textes\nou des ressources en ligne qui ont autorisé la redistribution."},{"id":"text-17","heading":"Text","content":"Ces notes sont mises à jour de temps en temps. Le développement&quot;\nensemble de notes sont\n http://northstar-www.dartmouth.edu/~richard/classes/ksh\n(Dartmouth seulement)"},{"id":"text-18","heading":"Text","content":"Richard Brittain, Services informatiques du Dartmouth College.\n© 2003,2004,2010 Dartmouth College.\nCommentaires et questions, contactez Richard.Brittain @ dartmouth.edu"},{"id":"text-19","heading":"Text","content":"Table des matières\n(1)"},{"id":"text-20","heading":"Text","content":"Un fichier texte contenant des commandes qui auraient pu être saisies directement dans le shell."},{"id":"text-21","heading":"Text","content":"Il n&#39;y a pas de différence de syntaxe entre l&#39;utilisation interactive de la ligne de commande et le placement des commandes\ndans un fichier. Certaines commandes ne sont utiles que lorsqu&#39;elles sont utilisées de manière interactive (par exemple, rappel de l&#39;historique en ligne de commande).\net les autres commandes sont trop complexes pour pouvoir être utilisées de manière interactive."},{"id":"text-22","heading":"Text","content":"Le shell lui-même a des capacités limitées &#8211; le pouvoir provient de son utilisation comme &quot;colle&quot;\nlangue pour combiner les utilitaires Unix standard et un logiciel personnalisé, pour produire un outil\nplus utile que les composants seuls."},{"id":"text-23","heading":"Text","content":"Tout shell peut être utilisé pour écrire un script shell. Pour permettre cela, la première ligne de chaque script\nest:#! / chemin / vers / shell        (par exemple. #! / bin / ksh)."},{"id":"text-24","heading":"Text","content":"le #!    les caractères indiquent au système de localiser le chemin suivant, de le démarrer et de\nalimentez le reste du fichier en entrée.\nTout programme capable de lire les commandes d’un fichier peut être démarré de cette manière, à condition que\nreconnaît le #    convention de commentaires. Le programme est lancé, puis le fichier de script\nest donné comme argument. Pour cette raison, le script doit être lisible et exécutable.\nLes exemples sont perl, awk, tcl et python."},{"id":"text-25","heading":"Text","content":"Tout fichier peut être utilisé comme entrée dans un shell en utilisant la syntaxe suivante:ksh myscript"},{"id":"text-26","heading":"Text","content":"Si le fichier est rendu exécutable avec chmod, cela devient une nouvelle commande\net disponible pour utilisation (sujet à la recherche habituelle de $ PATH).chmod + x myscript"},{"id":"text-27","heading":"Text","content":"Un script shell peut être aussi simple qu&#39;une séquence de commandes que vous tapez régulièrement. En mettant\nles dans un script, vous les réduisez à une seule commande."},{"id":"text-28","heading":"Text","content":"Exemple: ex0 affichage, texte"},{"id":"text-29","heading":"Text","content":"1: #! / bin / sh\n            2: rendez-vous amoureux\n   3: pwd\n            4: du -k"},{"id":"text-30","heading":"Text","content":"(2)"},{"id":"text-31","heading":"Text","content":"Combinez des séquences de commandes longues et répétitives en une seule commande simple."},{"id":"text-32","heading":"Text","content":"Généraliser une séquence d&#39;opérations sur un ensemble de données, en une procédure pouvant être\nappliqué à tout ensemble similaire de données.\n  \n(par exemple.\nappliquer la même analyse à chaque fichier de données sur un CD, sans avoir à répéter les commandes)"},{"id":"text-33","heading":"Text","content":"Créer de nouvelles commandes en utilisant des combinaisons d’utilitaires comme les auteurs originaux\njamais pensé à."},{"id":"text-34","heading":"Text","content":"Des scripts shell simples peuvent être écrits sous la forme d&#39;alias shell, mais le script peut être mis à la disposition de tous les utilisateurs.\net tous les processus. Les alias de shell s&#39;appliquent uniquement au shell actuel."},{"id":"text-35","heading":"Text","content":"Enveloppez les programmes sur lesquels vous n&#39;avez aucun contrôle dans un environnement que vous pouvez contrôler."},{"id":"text-36","heading":"Text","content":"par exemple. définir des variables d&#39;environnement, basculer vers un répertoire spécial, créer ou sélectionner un fichier de configuration,\nredirigez la sortie, enregistrez l’utilisation, puis exécutez le programme."},{"id":"text-37","heading":"Text","content":"Créez des jeux de données personnalisés à la volée et appelez des applications (par exemple, matlab, sas, idl, gnuplot) pour fonctionner\nsur eux, ou créer des commandes / procédures d’application personnalisées."},{"id":"text-38","heading":"Text","content":"Prototypage rapide (mais évitez de laisser les prototypes devenir production)"},{"id":"text-39","heading":"Text","content":"Utilisations typiques"},{"id":"text-40","heading":"Text","content":"Scripts de démarrage du système (/etc/init.d)"},{"id":"text-41","heading":"Text","content":"Administrateurs système, pour automatiser de nombreux aspects de la maintenance informatique, compte utilisateur\ncréation etc."},{"id":"text-42","heading":"Text","content":"Outils d&#39;installation du package d&#39;application\n \nD&#39;autres outils peuvent créer des installateurs plus sophistiqués (par exemple, tcl / tk), mais ne peuvent pas être considérés comme déjà installés. Les scripts shell sont utilisés car ils sont très portables. Certains logiciels sont livrés avec une installation complète de l&#39;outil qu&#39;il veut utiliser\n(tcl / tk / python) pour être autonome, mais cela conduit à un gonflement logiciel."},{"id":"text-43","heading":"Text","content":"Scripts de démarrage d&#39;application, en particulier\napplications sans surveillance (par exemple, à partir de cron    ou à)"},{"id":"text-44","heading":"Text","content":"Tout utilisateur ayant besoin d&#39;automatiser le processus de configuration et d&#39;exécution d&#39;applications commerciales,\nou leur propre code."},{"id":"text-45","heading":"Text","content":"AUTOMATISER, AUTOMATISER, AUTOMATISER\n(3)"},{"id":"text-46","heading":"Text","content":"sh"},{"id":"text-47","heading":"Text","content":"&quot;Bourne&quot;, écrit par Steve Bourne chez AT &amp; T Bell Labs pour Unix V7 (1979).\nPetit, simple et (à l&#39;origine) très peu de commandes internes, donc il a appelé des programmes externes pour même le plus simple\ndes tâches. Il est toujours disponible sur tout ce qui ressemble vaguement à Unix."},{"id":"text-48","heading":"Text","content":"csh\nLa coquille &quot;C&quot;. (Bill Joy, à Berkeley).\nBeaucoup de choses en commun\navec le shell Bourne, mais de nombreuses améliorations pour améliorer l’utilisation interactive. L&#39;interne\nles commandes utilisées uniquement dans les scripts sont très différent de &quot;sh&quot;, et\nsimilaire (par conception) à la syntaxe du langage &quot;C&quot;."},{"id":"text-49","heading":"Text","content":"tcsh\nLe shell &quot;TC&quot;. Librement disponible et basé sur &quot;csh&quot;.\nIl comporte de nombreuses fonctionnalités supplémentaires pour rendre l&#39;utilisation interactive plus pratique."},{"id":"text-50","heading":"Text","content":"Nous l&#39;utilisons comme shell interactif par défaut pour les nouveaux comptes sur tous nos systèmes publics.\nPeu de gens écrivent des scripts dans\nVoir la programmation de Csh considérée comme nuisible par\nTom Christiansen pour une discussion sur les problèmes de programmation des scripts csh."},{"id":"text-51","heading":"Text","content":"ksh"},{"id":"text-52","heading":"Text","content":"Le &quot;Korn&quot; shell, écrit par David Korn de AT &amp; T Bell Labs (maintenant AT &amp; T Research).\nÉcrit comme une mise à niveau majeure vers &quot;sh&quot; et une compatibilité ascendante avec celui-ci, mais possède de nombreuses commandes internes pour le\nfonctions les plus fréquemment utilisées. Il intègre également de nombreuses fonctionnalités de tcsh qui améliorent\nutilisation interactive (rappel de l&#39;historique de ligne de commande, etc.)."},{"id":"text-53","heading":"Text","content":"L’acceptation a été lente, car les versions précédentes étaient grevées de licences AT &amp; T.\nCe shell est maintenant disponible gratuitement sur tous les systèmes, mais n&#39;est parfois pas installé par défaut sur Unix &quot;libre&quot;.\nIl existe deux versions principales. ksh88 était la version intégrée à AT &amp; T SVR4 Unix, et peut encore être installé\npar certains des vendeurs Unix commerciaux. ksh93 a ajouté plus de fonctionnalités, principalement pour la programmation, et une meilleure conformité POSIX."},{"id":"text-54","heading":"Text","content":"POSIX 1003.2 Standard Shell."},{"id":"text-55","heading":"Text","content":"Les comités de normalisation ont travaillé sur le shell Bourne et ont ajouté de nombreuses fonctionnalités au shell Korn (ksh88).\nC shell pour définir un ensemble standard de fonctionnalités que doivent posséder tous les shells conformes."},{"id":"text-56","heading":"Text","content":"Sur la plupart des systèmes, / bin / sh est maintenant un shell compatible POSIX.\nKorn shell et Bash sont compatibles POSIX, mais possèdent de nombreuses fonctionnalités qui vont au-delà de la norme.\nSous Solaris, les commandes POSIX / XPG4 qui diffèrent\nlégèrement dans le comportement des commandes SunOS traditionnelles se trouvent dans / usr / xpg4 / bin"},{"id":"text-57","heading":"Text","content":"frapper"},{"id":"text-58","heading":"Text","content":"La coquille &quot;Bourne again&quot;. Ecrit dans le cadre de l’effort Open Source GNU / Linux et du shell par défaut pour Linux et\nMac OS X. C&#39;est un clone fonctionnel de sh, avec des fonctionnalités supplémentaires pour améliorer l&#39;utilisation interactive,\najouter la conformité POSIX et la compatibilité partielle de ksh."},{"id":"text-59","heading":"Text","content":"zsh"},{"id":"text-60","heading":"Text","content":"Un clone fonctionnel gratuit de sh, avec des éléments de ksh, bash et une conformité POSIX complète, et\nnombreuses nouvelles fonctionnalités d&#39;édition en ligne de commande interactives.\nIl a été installé en tant que shell par défaut sur les anciens systèmes MacOSX."},{"id":"text-61","heading":"Text","content":"(4)"},{"id":"text-62","heading":"Text","content":"Tous les shells énumérés ci-dessus partagent certaines caractéristiques communes et les différences majeures de syntaxe.\ngénéralement, n&#39;affectent que les scénaristes. Ce n&#39;est pas inhabituel\nutiliser un shell (par exemple, tcsh) pour une utilisation interactive, mais un autre (sh ou ksh)\npour écrire des scripts.\nPrincipales similitudes (et récapitulation de l&#39;utilisation de base de la ligne de commande)\nChacun de ces éléments est traité plus en détail ultérieurement."},{"id":"text-63","heading":"Text","content":"Analyser les lignes par des espaces, rechercher des commandes externes à l&#39;aide de $ PATH."},{"id":"text-64","heading":"Text","content":"Peut exécuter un script shell en utilisant shellname scriptfile, ou exécuter un seul\n    commande en utilisant shellname -c &quot;commande&quot;"},{"id":"text-65","heading":"Text","content":"Transmettez les arguments de ligne de commande développés aux programmes; récupérer le statut de sortie."},{"id":"text-66","heading":"Text","content":"Passer des variables d&#39;environnement aux programmes."},{"id":"text-67","heading":"Text","content":"Développez les jokers de nom de fichier en utilisant []*?. Chaque coquille a quelques autres\nmétacaractères génériques, mais ceux-ci sont communs à tous les shells."},{"id":"text-68","heading":"Text","content":"Redirection I / O standard et tuyauterie avec , &gt;&gt;, |"},{"id":"text-69","heading":"Text","content":"Quelques fonctions internes (CD)"},{"id":"text-70","heading":"Text","content":"Commandes d&#39;arrière-plan avec Et"},{"id":"text-71","heading":"Text","content":"Règles de cotation: les &quot;guillemets&quot; protègent la plupart des choses, mais permettent $ var    interprétation;\nLes &quot;guillemets simples&quot; protègent tous les métacaractères de l&#39;interprétation."},{"id":"text-72","heading":"Text","content":"Extension du répertoire personnel à l&#39;aide de ~ utilisateur    (à l&#39;exception de sh)"},{"id":"text-73","heading":"Text","content":"#    commentaires"},{"id":"text-74","heading":"Text","content":"Substitution de commande en utilisant `commande`    (backtics)"},{"id":"text-75","heading":"Text","content":"Développez les variables en utilisant $ varname    syntaxe"},{"id":"text-76","heading":"Text","content":"Exécution conditionnelle utilisant &amp;&amp;    et ||"},{"id":"text-77","heading":"Text","content":"Suite de ligne avec &quot;&quot;"},{"id":"text-78","heading":"Text","content":"Principales différences\nentre sh (+ dérivés) et csh (+ dérivés)."},{"id":"text-79","heading":"Text","content":"Syntaxe de toutes les constructions de contrôle de flux et des tests conditionnels."},{"id":"text-80","heading":"Text","content":"Syntaxe de manipulation des chaînes dans les scripts"},{"id":"text-81","heading":"Text","content":"Syntaxe pour la manipulation arithmétique à l&#39;intérieur des scripts"},{"id":"text-82","heading":"Text","content":"Syntaxe de définition des variables locales (utilisées uniquement dans le script) et des variables d’environnement\npassé aux processus enfants). setenv    contre exportation"},{"id":"text-83","heading":"Text","content":"Syntaxe de redirection des flux d&#39;E / S autres que stdin / stdout"},{"id":"text-84","heading":"Text","content":"Fichiers de démarrage de connexion (.cshrc    et .s&#39;identifier, contre .profil) et les options par défaut"},{"id":"text-85","heading":"Text","content":"Lecture d’autres scripts shell dans le shell actuel (nom de fichier source, contre . nom de fichier)"},{"id":"text-86","heading":"Text","content":"Traitement des signaux (interruptions)"},{"id":"text-87","heading":"Text","content":"(5)"},{"id":"text-88","heading":"Text","content":"Il existe de nombreux autres programmes qui lisent un fichier de commandes et exécutent\nune séquence d&#39;actions. le &quot;#! / chemin / à / programme&quot;    convention\npermet à n&#39;importe lequel d&#39;entre eux d&#39;être utilisé comme langage de script pour créer de nouvelles commandes.\nCertains sont hautement spécialisés, et certains sont beaucoup plus efficaces que leurs équivalents\nscripts shell à certaines tâches. Il n&#39;y a jamais qu&#39;un seul moyen d&#39;effectuer une fonction,\net souvent, le choix dépend de facteurs tels que:"},{"id":"text-89","heading":"Text","content":"ce qui est déjà installé &#8211; beaucoup d&#39;autres langages de script ne sont pas disponibles par défaut"},{"id":"text-90","heading":"Text","content":"quel code similaire existe déjà"},{"id":"text-91","heading":"Text","content":"ce que vous connaissez et pouvez utiliser de la manière la plus efficace.\nVotre temps est toujours plus coûteux que les cycles informatiques."},{"id":"text-92","heading":"Text","content":"Certains des principaux acteurs (tous disponibles gratuitement) dans les langages de script à usage général sont:"},{"id":"text-93","heading":"Text","content":"awk"},{"id":"text-94","heading":"Text","content":"Un outil de correspondance de modèle et de manipulation de données (texte et numérique). Prédate perl. Installé sur\ntous les systèmes Unix. Souvent utilisé en combinaison avec des scripts shell."},{"id":"text-95","heading":"Text","content":"perl"},{"id":"text-96","heading":"Text","content":"Le langage de script le plus utilisé pour les applications Web CGI et les tâches d&#39;administration système. Perl\nest plus difficile à apprendre et est généralement installé par défaut maintenant.\nIl est plus efficace et dispose d’une énorme bibliothèque de fonctions. Vous pouvez utiliser Perl pour\npresque toutes les tâches de script, mais la syntaxe est très différente de la ligne de commande du shell"},{"id":"text-97","heading":"Text","content":"python"},{"id":"text-98","heading":"Text","content":"Un langage de script orienté objet. Communément installé par défaut sur les systèmes modernes."},{"id":"text-99","heading":"Text","content":"tcl/tk"},{"id":"text-100","heading":"Text","content":"Langage de commande de l&#39;outil. Un autre langage de script à usage général. Le composant &quot;tk&quot; est un\ninterface scriptée vers les composants graphiques X-windows standard, la combinaison est donc souvent utilisée\ncréer des interfaces utilisateur graphiques."},{"id":"text-101","heading":"Text","content":"Ksh93 peut être étendu en se connectant à des bibliothèques partagées fournissant des commandes internes supplémentaires. Un exemple\nd&#39;une coquille étendue est\ntksh\nqui intègre Tcl / Tk avec ksh et permet la génération de\nscripts utilisant les deux langues. Il peut être utilisé pour le prototypage d&#39;applications d&#39;interface graphique."},{"id":"text-102","heading":"Text","content":"(6)"},{"id":"text-103","heading":"Text","content":"Ksh et bash sont les deux super-ensembles de sh. Pour une portabilité maximale, même très ancienne\nordinateurs, vous devriez vous en tenir aux commandes trouvées dans sh. Si possible, fonctionnalités spécifiques à ksh ou bash\nsera noté dans les pages suivantes. En général, les nouveaux obus courent un peu plus vite\net les scripts sont souvent plus lisibles, car la logique peut être exprimée plus proprement au plus récent\nsyntaxe. De nombreuses commandes et tests conditionnels sont maintenant internes."},{"id":"text-104","heading":"Text","content":"La philosophie des outils Unix séparés effectuant chacun un seul\nopération a été suivie de près par les concepteurs de la coque d&#39;origine, de sorte qu&#39;il\navait très peu de commandes internes et\nutilisé des outils externes pour des opérations très triviales\n(comme écho    et [[[[). Ksh et bash en interne\neffectue un grand nombre de manipulations numériques et de chaînes de base et de tests conditionnels. Problèmes occasionnels\nse pose parce que les versions internes de certaines commandes comme écho    ne sont pas entièrement compatibles avec\nl&#39;utilitaire externe ils ont remplacé."},{"id":"text-105","heading":"Text","content":"L&#39;action entreprise chaque fois qu&#39;un shell doit exécuter un programme externe consiste à localiser le programme.\n(via $ PATH), fourchette(), qui crée une deuxième copie du shell,\najustez l&#39;entrée / sortie standard pour le\nprogramme externe, et exec (), qui remplace le second shell par le programme externe.\nCe processus est onéreux en termes de calcul (relativement), donc lorsque le script fait quelque chose de trivial\nplusieurs fois dans une boucle, cela fait gagner beaucoup de temps si la fonction est gérée en interne."},{"id":"text-106","heading":"Text","content":"Si vous suivez des manuels sur la programmation du shell Bourne, tous les conseils doivent être valables\nlequel des coquillages dérivés de Bourne que vous utilisez. Malheureusement, de nombreux fournisseurs ont ajouté des fonctionnalités au fil des ans\net atteindre la portabilité complète peut être un défi. Écrire explicitement pour ksh (ou bash) et insister\nsur ce shell en cours d&#39;installation, peut souvent être plus simple."},{"id":"text-107","heading":"Text","content":"Le sh et le ksh homme les pages utilisent le terme commande spéciale    pour les commandes internes &#8211; gérées par le shell\nlui-même.\n(7)"},{"id":"text-108","heading":"Text","content":"Le script shell le plus élémentaire est une liste de commandes exactement telles qu’elles pourraient être.\ndactylographié de manière interactive, préfacé par le #!    en-tête magique.\nToutes les règles d&#39;analyse, les caractères génériques de nom de fichier, les recherches $ PATH, etc., qui ont été résumés\nci-dessus, appliquer.\nEn outre:"},{"id":"text-109","heading":"Text","content":"#    en tant que premier caractère non blanc sur une ligne"},{"id":"text-110","heading":"Text","content":"marque la ligne en tant que commentaire et le reste de la ligne est complètement ignoré. Utilisation\ncommente librement dans vos scripts, comme dans toutes les autres formes de programmation."},{"id":"text-111","heading":"Text","content":"comme dernier caractère d&#39;une ligne"},{"id":"text-112","heading":"Text","content":"provoque la jointure logique de la ligne suivante avant interprétation. Ceci permet\ncommandes très longues à saisir dans le script de manière plus lisible. Tu peux continuer\nla ligne autant de fois que nécessaire."},{"id":"text-113","heading":"Text","content":"Ceci est en fait juste un cas particulier de     Être à échapperou supprimer\nla signification spéciale de, le caractère suivant."},{"id":"text-114","heading":"Text","content":";    comme séparateur entre les mots d&#39;une ligne"},{"id":"text-115","heading":"Text","content":"est interprété comme une nouvelle ligne. Il vous permet de placer plusieurs commandes sur une seule ligne. Il y a\nquelques occasions où vous doit faire cela, mais souvent il est utilisé pour améliorer la mise en page\ndes commandes composées."},{"id":"text-116","heading":"Text","content":"Exemple: affichage ex1, texte"},{"id":"text-117","heading":"Text","content":"1: #! / bin / ksh\n            2: # Aux fins d’affichage, certaines parties du script ont \n            3: # été rendu en technicolor glorieux.\n            4: ## Certains commentaires sont en gras pour signaler les sections spéciales\n            5: \n            6: # Les numéros de ligne à gauche ne font pas partie du script.\n            7: # Ils sont simplement ajoutés au HTML pour référence.\n            8: \n            9: # Les commandes intégrées et les mots-clés (par exemple, print) sont en bleu\n        dix: # Les substitutions de commandes sont violettes. Les variables sont noires\n        11: impression &quot;Résumé de l&#39;utilisation du disque pour $ USER sur `rendez-vous amoureux`&quot;\n  12: \n        13: # Tout le reste est rouge - ce qui est principalement externe \n        14: # commandes et les arguments de toutes les commandes.\n        15: impression Ce sont mes fichiers       # commentaire de fin de ligne pour impression\n        16: # Liste les fichiers en colonnes\n        17: ls -C\n  18: # Résumer l&#39;utilisation du disque\n        19: impression\n        20: impression Utilisation de l&#39;espace disque\n  21: du -k \n  22: sortie 0"},{"id":"text-118","heading":"Text","content":"Statut de sortie\nChaque commande (programme) a un valeur ou statut de sortie\nqu&#39;il retourne au programme appelant. Ce\nest séparé de toute sortie générée. Le statut de sortie d&#39;un script shell peut être défini explicitement à l&#39;aide de\nsortie Nou la valeur par défaut de la dernière commande exécutée."},{"id":"text-119","heading":"Text","content":"Le statut de sortie est un entier compris entre 0 et 255. Conventionnellement 0 = succès et\ntoute autre valeur indique un problème. Pensez-y comme à un seul moyen pour que tout\ntravailler, mais de nombreuses façons d’échouer. Si la commande s&#39;est terminée par un signal, la valeur est 128 plus\nla valeur du signal."},{"id":"text-120","heading":"Text","content":"(8)"},{"id":"text-121","heading":"Text","content":"Le shell interprète les caractères suivants comme des caractères génériques de nom de fichier, et\ntout mot les contenant est remplacé par une liste triée de tous les fichiers correspondants."},{"id":"text-122","heading":"Text","content":"Les caractères génériques peuvent être utilisés dans les parties de répertoire d&#39;un chemin ainsi que dans la partie de nom de fichier.\nSi aucun fichier ne correspond au caractère générique, celui-ci reste inchangé.\nLes caractères génériques ne sont pas des expressions régulières complètes. Sed, grep, awk etc. fonctionnent avec plus de souplesse (et plus\ncomplexes) opérateurs de correspondance de chaînes."},{"id":"text-123","heading":"Text","content":"*"},{"id":"text-124","heading":"Text","content":"Correspond à zéro ou plusieurs caractères."},{"id":"text-125","heading":"Text","content":"?"},{"id":"text-126","heading":"Text","content":"Correspondre à n&#39;importe quel personnage"},{"id":"text-127","heading":"Text","content":"[...]"},{"id":"text-128","heading":"Text","content":"Faites correspondre n&#39;importe quel caractère de l&#39;ensemble entre crochets. Une plage de caractères peut être spécifiée\navec [  -  ]"},{"id":"text-129","heading":"Text","content":"[!...]"},{"id":"text-130","heading":"Text","content":"Associez n&#39;importe quel caractère non inclus dans l&#39;ensemble entre crochets."},{"id":"text-131","heading":"Text","content":"Une initiale &quot;.&quot; dans un nom de fichier ne correspond pas à un caractère générique, sauf si explicitement\ndonné dans le motif. En ce sens, les noms de fichiers commençant par &quot;.&quot; sont cachés.\nUNE &quot;.&quot; ailleurs dans le nom de fichier n&#39;est pas spécial."},{"id":"text-132","heading":"Text","content":"Les opérateurs de modèle peuvent être combinés"},{"id":"text-133","heading":"Text","content":"Exemple:chapitre[1-5]. *    pourrait correspondre chapitre1.tex, chapitre4.tex, chapitre5.tex.old.\nCela ne correspond pas chapitre10.tex    ou chapitre 1\n(9)"},{"id":"text-134","heading":"Text","content":"Les scripts ne sont pas très utiles si toutes les commandes, options et noms de fichiers sont explicitement\ncodé. En utilisant des variables, vous pouvez créer un script générique et l’appliquer à différents\ndes situations. Les noms de variables sont composés de lettres, de chiffres et de traits de soulignement\n ([a-zA-Z0-9_], ne peut pas commencer par un nombre, et sont des cas\nsensible. Plusieurs variables spéciales (toujours des noms en majuscule) sont utilisées par le système &#8211; en les réinitialisant.\npeut provoquer un comportement inattendu. Certaines variables spéciales peuvent être en lecture seule.\nL&#39;utilisation de noms minuscules pour vos propres variables est la plus sûre.\nDéfinition et exportation de variables"},{"id":"text-135","heading":"Text","content":"srcfile = dataset1"},{"id":"text-136","heading":"Text","content":"Crée (si elle n’existait pas) une variable nommée &quot;srcfile&quot; et lui attribue la valeur &quot;dataset1&quot;. Si la\nLa variable existait déjà, elle est écrasée. Les variables sont traitées comme des chaînes de texte, sauf si le contexte\nimplique une interprétation numérique. Vous pouvez faire en sorte qu&#39;une variable soit toujours traitée comme un nombre. Notez ici\ndoit être sans espaces autour du &quot;=&quot;."},{"id":"text-137","heading":"Text","content":"ensemble"},{"id":"text-138","heading":"Text","content":"Afficher toutes les variables actuellement définies dans le shell"},{"id":"text-139","heading":"Text","content":"non fixé srcfile"},{"id":"text-140","heading":"Text","content":"Supprimer la variable &quot;srcfile&quot;"},{"id":"text-141","heading":"Text","content":"srcfile ="},{"id":"text-142","heading":"Text","content":"Donnez à la variable une valeur nulle (ce n&#39;est pas la même chose que de la supprimer)."},{"id":"text-143","heading":"Text","content":"exportation srcfile"},{"id":"text-144","heading":"Text","content":"Ajout de srcfile à la liste des variables qui seront mises à la disposition du programme externe via\nl&#39;environnement. Si vous ne le faites pas, la variable est locale pour cette instance de shell."},{"id":"text-145","heading":"Text","content":"exportation"},{"id":"text-146","heading":"Text","content":"Répertorie toutes les variables en cours d’exportation &#8211; c’est l’environnement qui sera transmis.\naux programmes externes."},{"id":"text-147","heading":"Text","content":"En utilisant des variables"},{"id":"text-148","heading":"Text","content":"$ srcfile"},{"id":"text-149","heading":"Text","content":"Préfacer le nom de la variable avec $ provoque la valeur de la variable à\nêtre substitué à la place du nom."},{"id":"text-150","heading":"Text","content":"$ srcfile"},{"id":"text-151","heading":"Text","content":"Si la variable n&#39;est pas entourée d&#39;espaces (ou d&#39;autres caractères qui ne peuvent pas être dans un nom),\nle nom doit être entouré d&#39;accolades &quot;&quot;\nafin que le shell sache quels caractères vous voulez faire partie du nom."},{"id":"text-152","heading":"Text","content":"Exemple:"},{"id":"text-153","heading":"Text","content":"fichier de données = recensement2000\n# Essaie de trouver $ datafile_part1, qui n&#39;existe pas\necho $ datafile_part1.sas\n# C&#39;est ce que nous voulions\necho $ datafile _part1.sas"},{"id":"text-154","heading":"Text","content":"Modificateurs conditionnels\nIl existe différentes manières d’utiliser conditionnellement une variable dans une commande."},{"id":"text-155","heading":"Text","content":"$ datafile-default"},{"id":"text-156","heading":"Text","content":"Substituez la valeur de $ fichier de données, s’il a été défini, sinon utilisez la chaîne &quot;default&quot;. C&#39;est facile\nmoyen de permettre des variables optionnelles, et avoir des valeurs par défaut raisonnables si elles n’ont pas été définies. Si fichier de données    était\nindéfini, il en reste ainsi."},{"id":"text-157","heading":"Text","content":"$ datafile = default"},{"id":"text-158","heading":"Text","content":"Similaire à ce qui précède, sauf si fichier de données    n&#39;a pas été défini, définissez-le sur la chaîne &quot;default&quot;."},{"id":"text-159","heading":"Text","content":"$ datafile + default"},{"id":"text-160","heading":"Text","content":"Si variable fichier de données    a été défini, utilisez la chaîne &quot;default&quot;, sinon utilisez null. Dans ce cas, le\nvaleur actuelle $ fichier de données    N&#39;est pas utilisé."},{"id":"text-161","heading":"Text","content":"$ datafile? &quot;message d&#39;erreur&quot;"},{"id":"text-162","heading":"Text","content":"Substituez la valeur de $ fichier de données, s&#39;il a été défini, sinon affichez datafile: message d&#39;erreur.\nCeci est utilisé pour les diagnostics lorsqu&#39;une variable aurait dû être définie et qu&#39;il n&#39;y a pas de valeur par défaut raisonnable à utiliser."},{"id":"text-163","heading":"Text","content":"Placer un colon (:) avant que le caractère opérateur dans ces constructions ait pour effet de compter un\nnul valeur identique à une variable non définie. Les variables peuvent recevoir une valeur nulle en les définissant\nen une chaîne vide, par exemple fichier de données = .\nExemple:\necho $ datafile: -mydata.datÉcho de la valeur de variable fichier de données    s&#39;il a été défini et est non nul, sinon\necho &quot;mydata.dat&quot;."},{"id":"text-164","heading":"Text","content":"Préfixe de commande d&#39;attribution de variable\nIl est possible d’exporter une variable pour la durée d’une seule commande en utilisant le\nsyntaxe:\nvar = valeur commande args\n(dix)"},{"id":"text-165","heading":"Text","content":"Le système utilise plusieurs variables spéciales. Vous pouvez les utiliser, mais vous ne pourrez peut-être pas\npour les changer.\nLes variables spéciales utilisent des noms en majuscules ou des caractères de ponctuation.\nCertaines variables sont définies par le processus de connexion et héritées par le shell (par exemple, $ USER),\ntandis que d&#39;autres ne sont utilisés que par le shell.  Essayez de courir ensemble    ou env Voici quelques-uns des plus couramment utilisés:\nEnvironnement de connexion"},{"id":"text-166","heading":"Text","content":"$ USER, $ LOGNAME"},{"id":"text-167","heading":"Text","content":"Prédéfini sur le nom d&#39;utilisateur actuellement connecté."},{"id":"text-168","heading":"Text","content":"$ PATH"},{"id":"text-169","heading":"Text","content":"La liste des répertoires qui seront recherchés pour les commandes externes. Vous pouvez changer cela dans un script\npour vous assurer que vous obtenez les programmes que vous avez l&#39;intention, et ne pas obtenir accidentellement d&#39;autres versions qui pourraient avoir été\ninstallée."},{"id":"text-170","heading":"Text","content":"$ TERM"},{"id":"text-171","heading":"Text","content":"Le type de terminal dans lequel la session shell est en cours d&#39;exécution. Habituellement, &quot;xterm&quot; ou &quot;vt100&quot;. Beaucoup de programmes\nVous devez savoir cela pour savoir quelles séquences de caractères spéciaux envoyer pour obtenir des effets spéciaux."},{"id":"text-172","heading":"Text","content":"$ PAGER"},{"id":"text-173","heading":"Text","content":"S&#39;il est défini, il contient le nom du programme que l&#39;utilisateur préfère utiliser pour afficher les fichiers texte. habituellement\nrégler sur &quot;plus&quot; ou &quot;moins&quot; ou quelque chose de similaire. De nombreux programmes devant présenter des informations sur plusieurs pages\nl&#39;utilisateur respectera ce paramètre (par exemple, homme). Ce n&#39;est pas réellement utilisé par le shell lui-même, mais\nLes scripts shell doivent l’honorer s’ils doivent émettre une page vers l’utilisateur."},{"id":"text-174","heading":"Text","content":"$ EDITEUR"},{"id":"text-175","heading":"Text","content":"Si défini, ceci contient le nom du programme que l&#39;utilisateur préfère utiliser pour l&#39;édition de fichier texte. Un programme\nqui doit obliger l’utilisateur à éditer manuellement un fichier peut choisir de démarrer ce programme au lieu de\npar défaut intégré (par exemple &quot;crontab -e&quot;. Ceci détermine également la modification de la ligne de commande par défaut.\ncomportement dans des coquilles interactives."},{"id":"text-176","heading":"Text","content":"Paramètres internes du shell"},{"id":"text-177","heading":"Text","content":"$ PWD"},{"id":"text-178","heading":"Text","content":"Toujours définir le répertoire de travail actuel (en lecture seule)"},{"id":"text-179","heading":"Text","content":"$ OLDPWD"},{"id":"text-180","heading":"Text","content":"Le répertoire précédent (avant le plus récent CD    commander). Cependant, changer de répertoire\ndans un script est souvent dangereux."},{"id":"text-181","heading":"Text","content":"$?    (lecture seulement)"},{"id":"text-182","heading":"Text","content":"Définissez le statut de sortie de la dernière commande exécutée afin de pouvoir tester le succès ou l&#39;échec. Chaque commande réinitialise cette\nil faut donc le sauvegarder immédiatement si vous voulez l’utiliser plus tard."},{"id":"text-183","heading":"Text","content":"$ -"},{"id":"text-184","heading":"Text","content":"Définissez les options actuellement définies."},{"id":"text-185","heading":"Text","content":"$ IFS"},{"id":"text-186","heading":"Text","content":"Séparateurs de champs internes: ensemble de caractères (normalement des espaces et des tabulations) utilisés pour analyser\nune ligne de commande en arguments séparés. Ceci peut être défini par l&#39;utilisateur à des fins spéciales, mais\nles choses deviennent très déroutantes si rien n&#39;est changé."},{"id":"text-187","heading":"Text","content":"Variables d&#39;ID de processus"},{"id":"text-188","heading":"Text","content":"$$    (lecture seulement)"},{"id":"text-189","heading":"Text","content":"Défini sur l&#39;ID de processus du shell actuel &#8211; utile pour créer des fichiers temporaires uniques, par exemple. /tmp/$0.$$"},{"id":"text-190","heading":"Text","content":"$ PPID    (lecture seulement)"},{"id":"text-191","heading":"Text","content":"Défini sur l&#39;ID de processus du processus parent de ce shell &#8211; utile pour découvrir comment le script a été appelé."},{"id":"text-192","heading":"Text","content":"$!    (lecture seulement)"},{"id":"text-193","heading":"Text","content":"Défini sur l&#39;ID de processus de la dernière commande démarrée en arrière-plan &#8211; utile pour vérifier les processus en arrière-plan."},{"id":"text-194","heading":"Text","content":"ksh / bash fonctionnalités supplémentaires"},{"id":"text-195","heading":"Text","content":"$ SECONDES    (lecture seulement)"},{"id":"text-196","heading":"Text","content":"Nombre entier de secondes depuis le démarrage de ce shell. Peut être utilisé pour les commandes de chronométrage."},{"id":"text-197","heading":"Text","content":"$ RANDOM"},{"id":"text-198","heading":"Text","content":"Chaque fois qu&#39;il est valorisé, $ RANDOM    renvoie un entier aléatoire compris entre 0 et 32k.  AU HASARD\npeut être réglé sur &quot;semer&quot; le générateur de nombres aléatoires."},{"id":"text-199","heading":"Text","content":"$ LINENO    (lecture seulement)"},{"id":"text-200","heading":"Text","content":"Evalue toujours le numéro de ligne actuel du script en cours d&#39;exécution &#8211; utile pour le débogage."},{"id":"text-201","heading":"Text","content":"(11)"},{"id":"text-202","heading":"Text","content":"Pour personnaliser le comportement d&#39;un script au moment de l&#39;exécution,\nvous pouvez lui donner un nombre quelconque d&#39;arguments sur la commande\nligne."},{"id":"text-203","heading":"Text","content":"Ce sont souvent des noms de fichiers, mais peuvent être interprétés par le script de quelque manière que ce soit. Les options\nsont souvent spécifiés en utilisant la convention &quot;-flag&quot; utilisée par la plupart des programmes Unix, et une commande ksh\ngetopts    est disponible pour aider à les analyser."},{"id":"text-204","heading":"Text","content":"Le shell développe les caractères génériques et rend variable et\nsubstitutions de commandes comme d&#39;habitude, puis analyse les mots obtenus par des espaces (en réalité\nvariable spéciale $ IFS) et place les chaînes de texte résultantes dans\nvariables de position\ncomme suit:"},{"id":"text-205","heading":"Text","content":"0 $, 1 $, 2 $, ... 9 $"},{"id":"text-206","heading":"Text","content":"Les 9 premiers arguments sont disponibles directement sous forme de $ 1-9 $. Pour accéder à plus de 9, utilisez\ndécalage, ou $ *, $ @. La variable 0 $    contient le nom du\nscript lui-même."},{"id":"text-207","heading":"Text","content":"$ 10, $ 11, ..."},{"id":"text-208","heading":"Text","content":"Les arguments positionnels supérieurs à 9 sont définis par ksh et bash. N&#39;oubliez pas d&#39;utiliser des accolades pour vous y référer."},{"id":"text-209","heading":"Text","content":"décalage"},{"id":"text-210","heading":"Text","content":"ignore $ 1 et renumérote toutes les autres variables. &quot;décalage N&quot;déplacera N arguments à la fois."},{"id":"text-211","heading":"Text","content":"$ #"},{"id":"text-212","heading":"Text","content":"contient le nombre d&#39;arguments définis (non compris $ 0)."},{"id":"text-213","heading":"Text","content":"$ *"},{"id":"text-214","heading":"Text","content":"contient tous les arguments dans une seule chaîne, avec un espace les séparant."},{"id":"text-215","heading":"Text","content":"$ @"},{"id":"text-216","heading":"Text","content":"semblable à $ *, mais s&#39;il est utilisé entre guillemets, il cite efficacement chaque argument et les maintient séparés.\nSi un argument contient des espaces, la distinction est importante."},{"id":"text-217","heading":"Text","content":"par exemple. si la liste d&#39;arguments est:  a1 a2 &quot;a3 qui contient des espaces&quot; a4alors: $ 1 = a1, $ 2 = a2, $ 3 = a3 qui contient des espaces, $ 4 = a4et: $ * = a1 a2 a3 qui contient des espaces a4et: &quot;$ @&quot; = &quot;a1&quot; &quot;a2&quot; &quot;a3 qui contient des espaces&quot; &quot;a4&quot;\nUtiliser uniquement le formulaire &quot;$ @&quot; préserve les arguments cités. Si les arguments sont passés du script\ndirectement à un autre programme, cela peut faire une grande différence quant à la signification."},{"id":"text-218","heading":"Text","content":"Exemple: affichage ex7, texte"},{"id":"text-219","heading":"Text","content":"1: #! / bin / sh\n            2: #\n            3: # Vérifier la gestion des arguments de position\n            4: écho &quot;Nombre d&#39;arguments: $ #&quot;\n   5: écho &quot;0 $ = 0 $&quot;\n   6: \n            7: écho &quot;Boucle sur $ *&quot;\n   8: pour un dans $ *; faire\n            9:    écho  &quot;$ a &quot;\n  dix: terminé\n        11: \n        12: écho &quot;Boucle sur &quot; $ @ &quot;&quot;\n  13: pour un dans &quot;$ @&quot;; faire\n        14:    écho  &quot;$ a &quot;\n  15: terminé"},{"id":"text-220","heading":"Text","content":"Définir de nouveaux arguments de position\nle ensemble    commande, suivie d&#39;un ensemble d&#39;arguments, crée un nouvel ensemble de\narguments de position. Ceci est souvent utilisé, en supposant que les arguments originaux ne sont plus nécessaires, pour analyser\nun ensemble de mots (en utilisant éventuellement des séparateurs de champs différents). Les arguments peuvent être réinitialisés autant de fois que nécessaire."},{"id":"text-221","heading":"Text","content":"Exemple: affichage ex2, texte"},{"id":"text-222","heading":"Text","content":"1: #! / bin / sh\n            2: # Trouver une entrée dans le fichier de mots de passe\n            3: pwent =`grep &#39;^ root:&#39; / etc / passwd`\n   4: # Turn off globbing - les lignes de mot de passe contiennent souvent &#39;*&#39;\n            5: set -o noglob\n   6: # Le &quot;nom complet&quot; et les autres commentaires sont en\n            7: # champ 5, délimité par deux points. Obtenir ce champ en utilisant le fractionnement des mots de passe\n            8: OIFS =$ IFS; IFS =:; ensemble $ pwent; IFS =$ OIFS\n            9: écho 5 $"},{"id":"text-223","heading":"Text","content":"Exemple: affichage pickrandom, texteSélectionne un fichier aléatoire dans un répertoire.\nUtilise la fonctionnalité ksh RANDOM."},{"id":"text-224","heading":"Text","content":"1: #! / bin / ksh\n            2: \n            3: # Sélectionnez une image aléatoire dans la collection de logos en arrière-plan.\n            4: # Ceci pourrait être utilisé pour configurer un économiseur d&#39;écran, par exemple.\n            5: #\n            6: # Cela fonctionne même si les noms de fichiers contiennent des espaces.\n            7: \n            8: # passer au répertoire des logos pour éviter les longs chemins\n            9: logos =/ afs / northstar / commun / usr / lib / X11 / logos / arrière-plans\n  dix: CD logos $\n        11: \n        12: # &#39;*&#39; est un joker de nom de fichier qui correspond à tous les fichiers du répertoire en cours.\n        13: ensemble *\n  14: \n        15: # Utilisez la syntaxe pour les expressions arithmétiques. &quot;%&quot; est l&#39;opérateur modulo\n        16: # Décale les arguments d&#39;un nombre aléatoire entre 0 et le nombre de fichiers\n        17: décalage $ (($ RANDOM % $ #))\n        18: \n        19: # Affiche le premier argument résultant\n        20: écho &quot;logos $/1 $&quot;"},{"id":"text-225","heading":"Text","content":"(12)"},{"id":"text-226","heading":"Text","content":"Options de démarrage. ksh -options scriptname"},{"id":"text-227","heading":"Text","content":"-X"},{"id":"text-228","heading":"Text","content":"echo ligne stderr avant de l&#39;exécuter"},{"id":"text-229","heading":"Text","content":"-n"},{"id":"text-230","heading":"Text","content":"lit les commandes et vérifie les erreurs de syntaxe, mais ne les exécute pas."},{"id":"text-231","heading":"Text","content":"-une"},{"id":"text-232","heading":"Text","content":"toutes les variables sont automatiquement exportées"},{"id":"text-233","heading":"Text","content":"-F"},{"id":"text-234","heading":"Text","content":"désactiver l&#39;expansion des noms de fichiers génériques (globbing)"},{"id":"text-235","heading":"Text","content":"set -x"},{"id":"text-236","heading":"Text","content":"Définir une option dans un script shell"},{"id":"text-237","heading":"Text","content":"$ -"},{"id":"text-238","heading":"Text","content":"contient les lettres d&#39;option actuellement définies"},{"id":"text-239","heading":"Text","content":"Il y a beaucoup d&#39;autres options, pas souvent nécessaires. Les options en ksh et bash peuvent aussi être\ndéfinir en utilisant des noms longs (par exemple -o noglob    au lieu de -F). De nombreuses options\nsont uniques à ksh ou bash.\n(13)"},{"id":"text-240","heading":"Text","content":"syntaxe sh"},{"id":"text-241","heading":"Text","content":"`commande`"},{"id":"text-242","heading":"Text","content":"Une commande (plus des arguments optionnels) entourés de backticks est exécutée et la sortie standard\nde cette commande est substitué. Si la commande produit une sortie multiligne, les nouvelles lignes sont conservées.\nSi la chaîne résultante est affichée, sans guillemets, en utilisant écho, les nouvelles lignes et les espaces multiples seront supprimés."},{"id":"text-243","heading":"Text","content":"syntaxe ksh / bash"},{"id":"text-244","heading":"Text","content":"$ (commande)"},{"id":"text-245","heading":"Text","content":"Cette syntaxe est fonctionnellement identique à celle des backticks, mais les commandes peuvent être plus facilement imbriquées."},{"id":"text-246","heading":"Text","content":"$ (&lt;fichier)"},{"id":"text-247","heading":"Text","content":"Ceci est équivalent à `cat file`, mais mis en œuvre en interne pour plus d&#39;efficacité."},{"id":"text-248","heading":"Text","content":"Exemple: affichage ex3, texte"},{"id":"text-249","heading":"Text","content":"1: #! / bin / ksh\n            2: \n            3: écho Aujourd&#39;hui c&#39;est `rendez-vous amoureux`\n   4: \n            5: fichier =/ etc / hosts\n   6: écho Le fichier fichier $ a $ (wc -l &lt; fichier $) lignes\n   7: \n            8: nom_hôte -s&gt; nom_hôte\n   9: écho Ce système a le nom d’hôte $ (&lt;monhôte)"},{"id":"text-250","heading":"Text","content":"(14)"},{"id":"text-251","heading":"Text","content":"Toute commande simple (ou fonction shell, ou commande composée) peut avoir son entrée et sa sortie\nredirigé à l&#39;aide des opérateurs suivants. Ceci est effectué par le shell avant\nla commande est exécutée.\nRedirection de sortie"},{"id":"text-252","heading":"Text","content":"&gt; nom de fichier"},{"id":"text-253","heading":"Text","content":"La sortie standard (descripteur de fichier 1) est redirigée vers le fichier nommé. Le fichier est écrasé\nà moins que le noclobber    l&#39;option est définie. Le fichier est créé s&#39;il n&#39;existe pas."},{"id":"text-254","heading":"Text","content":"Le fichier de périphérique spécial / dev / null    peut être utilisé pour ignorer explicitement les sorties indésirables.\nLa lecture de / dev / null entraîne un statut de fin de fichier."},{"id":"text-255","heading":"Text","content":"&gt;&gt; nom de fichier"},{"id":"text-256","heading":"Text","content":"La sortie standard est ajoutée au fichier nommé. Le fichier est créé s&#39;il n&#39;existe pas."},{"id":"text-257","heading":"Text","content":"&gt; | nom de fichier"},{"id":"text-258","heading":"Text","content":"Sortie redirection, et remplacer le noclobber option, si définie."},{"id":"text-259","heading":"Text","content":"Redirection d&#39;entrée"},{"id":"text-260","heading":"Text","content":"&lt; nom de fichier"},{"id":"text-261","heading":"Text","content":"L&#39;entrée standard (descripteur de fichier 0) est redirigée vers le fichier nommé. Le fichier doit déjà\nexister."},{"id":"text-262","heading":"Text","content":"Pipelines de commande"},{"id":"text-263","heading":"Text","content":"commande | commander [ | command ...]"},{"id":"text-264","heading":"Text","content":"Pipe plusieurs commandes ensemble. La sortie standard de la première commande devient la norme\nentrée de la deuxième commande. Toutes les commandes sont exécutées simultanément et le transfert de données s&#39;effectue via la mémoire.\ndes tampons. C&#39;est l&#39;une des constructions les plus puissantes d&#39;Unix. Composé les commandes peuvent aussi être\nutilisé avec des tuyaux. Les pipes jouent très bien avec les systèmes multiprocesseurs."},{"id":"text-265","heading":"Text","content":"Un seul pipeline dans un pipeline doit être interactif (tentative de lecture depuis\nle terminal). Cette construction est beaucoup plus efficace que l’utilisation de fichiers temporaires, et la plupart des\nLes utilitaires Unix sont conçus pour fonctionner correctement dans les pipelines."},{"id":"text-266","heading":"Text","content":"L&#39;état de sortie d&#39;un pipeline est l&#39;état de sortie de la dernière commande. Dans les commandes composées, un pipeline\npeut être utilisé n&#39;importe où une simple commande pourrait être utilisée."},{"id":"text-267","heading":"Text","content":"(15)"},{"id":"text-268","heading":"Text","content":"Les scripts shell peuvent générer directement des sorties ou lire des entrées dans des variables à l&#39;aide des commandes suivantes:\nSortie de script"},{"id":"text-269","heading":"Text","content":"écho"},{"id":"text-270","heading":"Text","content":"Imprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nUtilisez des guillemets pour préserver l’espacement. Echo comprend également les conventions d’échappement de type C."},{"id":"text-271","heading":"Text","content":"Attention ça\nle shell peut traiter les barres obliques inverses avant écho    les voit (peut avoir besoin de doubler la barre oblique inverse).\nInterne dans la plupart des coquilles, mais était à l&#39;origine externe."},{"id":"text-272","heading":"Text","content":"b \n        retour arrière \n     c \n        ligne d&#39;impression sans nouvelle ligne (certaines versions)"},{"id":"text-273","heading":"Text","content":"F \n        formulaire d&#39;alimentation \n n \n        nouvelle ligne"},{"id":"text-274","heading":"Text","content":"r \n        retour chariot\n     t \n        languette"},{"id":"text-275","heading":"Text","content":"v \n        onglet vertical \n\\  \n    barre oblique inverse"},{"id":"text-276","heading":"Text","content":"0n où n est le caractère de 8 bits dont le code ASCII\n      code est le nombre octal à 1, 2 ou 3 chiffres\n      représentant ce personnage."},{"id":"text-277","heading":"Text","content":"-n \nsupprimer newline"},{"id":"text-278","heading":"Text","content":"impression    (ksh interne)"},{"id":"text-279","heading":"Text","content":"Imprimez les arguments, séparés par des espaces, et terminés par une nouvelle ligne, sur stdout.\nPrint observe les mêmes conventions d&#39;échappement que l&#39;écho."},{"id":"text-280","heading":"Text","content":"-n"},{"id":"text-281","heading":"Text","content":"supprimer newline"},{"id":"text-282","heading":"Text","content":"-r"},{"id":"text-283","heading":"Text","content":"mode brut &#8211; ignore les conventions  -escape"},{"id":"text-284","heading":"Text","content":"-R"},{"id":"text-285","heading":"Text","content":"mode brut &#8211; ignore les conventions et les options  -escape sauf -n."},{"id":"text-286","heading":"Text","content":"Entrée de script"},{"id":"text-287","heading":"Text","content":"lis var1 var2 reste"},{"id":"text-288","heading":"Text","content":"lit une ligne de stdin, analyse de $ IFS et place les mots dans les variables nommées.\nTous les mots restants entrent tous dans la dernière variable. Un &#39;&#39; comme dernier caractère d&#39;une ligne\nsupprime l’importance de la nouvelle ligne et l’entrée continue avec la ligne suivante."},{"id":"text-289","heading":"Text","content":"-r"},{"id":"text-290","heading":"Text","content":"mode brut &#8211; ignore les conventions  -escape"},{"id":"text-291","heading":"Text","content":"Exemple: affichage ex4a, texte"},{"id":"text-292","heading":"Text","content":"1: #! / bin / sh\n            2: écho &quot;Test de la saisie utilisateur interactive: saisissez quelques touches et appuyez sur la touche Retour&quot;\n   3: lis x plus\n   4: écho &quot;Le premier mot était &quot;$ x &quot;&quot;\n   5: écho &quot;Le reste de la ligne (le cas échéant) était &quot;$ plus &quot;&quot;"},{"id":"text-293","heading":"Text","content":"(16)"},{"id":"text-294","heading":"Text","content":"La plupart des opérateurs de contrôle de flux utiles impliquent de faire des tests conditionnels et\nbranchement sur le résultat (vrai / faux). Le test peut être soit le tester\ncommande, ou son alias, [[[[, ou le ksh / bash intégré [[[[[ ... ]]\ncommande, qui a des options légèrement différentes, ou il peut être toute commande qui retourne\nun statut de sortie approprié. Zéro est considéré comme &quot;vrai&quot;, tandis que toute valeur autre que zéro est &quot;faux&quot;.\nNotez que ceci est inversé par rapport à la convention du langage C.\nTests de fichiers"},{"id":"text-295","heading":"Text","content":"-e fichier"},{"id":"text-296","heading":"Text","content":"Vrai si fichier existe (peut être de tout type)."},{"id":"text-297","heading":"Text","content":"-F fichier"},{"id":"text-298","heading":"Text","content":"Vrai si fichier existe et est un fichier ordinaire."},{"id":"text-299","heading":"Text","content":"-ré fichier"},{"id":"text-300","heading":"Text","content":"Vrai si fichier existe et est un répertoire."},{"id":"text-301","heading":"Text","content":"-r fichier"},{"id":"text-302","heading":"Text","content":"Vrai si fichier existe et est lisibleDe même, -w    = accessible en écriture, -X    = exécutable, -L    = est un lien symbolique."},{"id":"text-303","heading":"Text","content":"-s fichier"},{"id":"text-304","heading":"Text","content":"Vrai si fichier existe et a une taille supérieure à zéro"},{"id":"text-305","heading":"Text","content":"-t archiveur de notes"},{"id":"text-306","heading":"Text","content":"Vrai si l&#39;ouvert archiveur de notes est associé à un terminal. Par exemple. c&#39;est\nutilisé pour déterminer si la sortie standard a été redirigée vers un fichier."},{"id":"text-307","heading":"Text","content":"Tests de chaînes de caractères"},{"id":"text-308","heading":"Text","content":"-n &quot;chaîne&quot;"},{"id":"text-309","heading":"Text","content":"vrai si chaîne a une longueur non nulle"},{"id":"text-310","heading":"Text","content":"-z &quot;chaîne&quot;"},{"id":"text-311","heading":"Text","content":"vrai si chaîne a une longueur nulle"},{"id":"text-312","heading":"Text","content":"Avec [[[[, l&#39;argument doit être cité, car s&#39;il s&#39;agit d&#39;une variable\na une valeur nulle, l&#39;expansion résultante ( [ -z ] ) est une erreur de syntaxe. Un\nles extensions générant &quot;&quot; comptent comme une chaîne nulle.  Pour [[[[    seulement, un cité\nla chaîne seule est équivalente au test -n, par ex. [ « $var » ]. Dans les coquilles plus anciennes pour lesquelles\n[[[[    est un programme externe, le seul moyen de tester une chaîne nulle est:si [ \"X€var\" = \"X\" ]C&#39;est rarement nécessaire maintenant, mais on le trouve encore souvent."},{"id":"text-313","heading":"Text","content":"$ variable = texte"},{"id":"text-314","heading":"Text","content":"Vrai si $ variable allumettes texte."},{"id":"text-315","heading":"Text","content":"$ variable &lt; texte"},{"id":"text-316","heading":"Text","content":"Vrai si $ variable vient avant (lexicalement) texteDe même, &gt;    = vient après"},{"id":"text-317","heading":"Text","content":"(17)"},{"id":"text-318","heading":"Text","content":"Arithmetic tests"},{"id":"text-319","heading":"Text","content":"$variable -eq  nombre"},{"id":"text-320","heading":"Text","content":"True if $variable, interpreted as a number, is equal to nombre."},{"id":"text-321","heading":"Text","content":"$variable -ne  nombre"},{"id":"text-322","heading":"Text","content":"True if $variable, interpreted as a number, is ne pas égal à nombre.De même, -lt    = less than, -le    = less than or equal,\n-gt    = greater than, -ge    = greater than or equal"},{"id":"text-323","heading":"Text","content":"Additional tests for [[&#8230;]](ksh and bash)"},{"id":"text-324","heading":"Text","content":"$variable = modèle"},{"id":"text-325","heading":"Text","content":"True if $variable allumettes modèle. Si modèle contains no wildcards,\nthen this is just an exact text match.  The same wildcards as used for filename matching are used."},{"id":"text-326","heading":"Text","content":"le modèle must not be quoted. Puisque [[&#8230;]]is internal to the shell, the pattern in this case is\ntreated differently and not filename-expanded as an external command would require."},{"id":"text-327","heading":"Text","content":"file1 -nt file2"},{"id":"text-328","heading":"Text","content":"True if file1 is newer than file2.  De même -ot    = older than"},{"id":"text-329","heading":"Text","content":"file1 -ef file2"},{"id":"text-330","heading":"Text","content":"true if file1 is effectively the same as file2, after following\nsymlinks and hard links."},{"id":"text-331","heading":"Text","content":"Negating and Combining tests\nTests may be negated by prepending the !    operator, and combined with boolean\nET et OU operators using the syntax:"},{"id":"text-332","heading":"Text","content":"conditionnel -a conditionnel, conditionnel -o conditionnel"},{"id":"text-333","heading":"Text","content":"ET et OU syntax for tester    et [[[["},{"id":"text-334","heading":"Text","content":"conditionnel &amp;&amp; conditionnel, conditionnel || conditionnel"},{"id":"text-335","heading":"Text","content":"ET et OU syntax for [[[[[ ... ]]"},{"id":"text-336","heading":"Text","content":"Parentheses may be inserted to resolve ambiguities or override the default operator precedence rules."},{"id":"text-337","heading":"Text","content":"Exemples:"},{"id":"text-338","heading":"Text","content":"si [[  -x /usr/local/bin/lserve && \n       -w /var/logs/lserve.log ]]; puis\n   /usr/local/bin/lserve &gt;&gt; /var/logs/lserve.log &amp;\nfi"},{"id":"text-339","heading":"Text","content":"pwent=`grep &#39;^richard:&#39; /etc/passwd`\nsi [ -z \"$pwent\" ]; puis\n   echo richard not found\nfi"},{"id":"text-340","heading":"Text","content":"(18)"},{"id":"text-341","heading":"Text","content":"UNE liste in these descriptions is a simple command, or a pipeline.\nThe value of the liste is the value of the last simple command run in it."},{"id":"text-342","heading":"Text","content":"UNE liste can also be a set of simple commands or\npipelines separated by &quot;;,&amp;,&amp;&amp;,||,|&amp;&quot;.\nFor the compound commands which branch on the success or failure\nde certaines liste,  it is usually [[[[    ou [[[[[[[[, but can be anything."},{"id":"text-343","heading":"Text","content":"Conditional execution: if/else"},{"id":"text-344","heading":"Text","content":"liste &amp;&amp; liste"},{"id":"text-345","heading":"Text","content":"Execute the first liste. If true (success), execute the second one."},{"id":"text-346","heading":"Text","content":"liste || liste"},{"id":"text-347","heading":"Text","content":"Execute the first liste. If false (failure), execute the second one."},{"id":"text-348","heading":"Text","content":"Exemple:"},{"id":"text-349","heading":"Text","content":"mkdir tempdir &amp;&amp; cp workfile tempdir"},{"id":"text-350","heading":"Text","content":"sshd || echo &quot;sshd failed to start&quot;"},{"id":"text-351","heading":"Text","content":"You can use both forms together (with care) &#8211; they are processed left to right, and &amp;&amp; must come first.\nExemple:"},{"id":"text-352","heading":"Text","content":"mkdir tempdir &amp;&amp; cp workfile tempdir || \n echo &quot;Failed to create tempdir&quot;"},{"id":"text-353","heading":"Text","content":"si liste; puis liste ; elif liste; puis liste; autre liste; fi"},{"id":"text-354","heading":"Text","content":"Execute the first liste, and if true (success), execute the &quot;then&quot; list, otherwise\nexecute the &quot;else&quot; list.  The &quot;elif&quot;  and &quot;else&quot; lists are optional."},{"id":"text-355","heading":"Text","content":"Exemple:"},{"id":"text-356","heading":"Text","content":"si [ -r $myfile ]\npuis\n   cat $myfile\nautre\n   echo $myfile not readable\nfi"},{"id":"text-357","heading":"Text","content":"Looping: &#39;while&#39; and &#39;for&#39; loops"},{"id":"text-358","heading":"Text","content":"tandis que liste; faire liste; terminé\njusqu&#39;à ce que liste; faire liste; terminé"},{"id":"text-359","heading":"Text","content":"Execute the first liste and if true (success), execute the second liste. Repeat as\nlong as the first liste est vrai. le jusqu&#39;à ce que    form just negates the test."},{"id":"text-360","heading":"Text","content":"Exemple: ex4 display, text"},{"id":"text-361","heading":"Text","content":"1: #!/bin/ksh\n            2: count=0\n   3: max=dix\n   4: tandis que [[[[[[[[$count -lt $max ]]\n   5: faire \n            6:   écho $count\n            7:   count=$((count + 1))\n            8: terminé\n            9: écho &quot;Value of count after loop is: $count&quot;"},{"id":"text-362","heading":"Text","content":"pour identifiant [in[in[in[inmots ]; do; liste; terminé"},{"id":"text-363","heading":"Text","content":"Ensemble identifiant in turn to each word in  mots and execute the liste.\nOmitting the &quot;in mots&quot; clause implies using $@, i.e. the identifiant est mis en\nturn to each positional argument."},{"id":"text-364","heading":"Text","content":"Exemple:"},{"id":"text-365","heading":"Text","content":"for file in *.dat\nfaire\n    echo Processing $file\nterminé"},{"id":"text-366","heading":"Text","content":"As with most programming languages, there are often several ways to express the same action.\nRunning a command and then explicitly examining $?    can be used instead of some of the above."},{"id":"text-367","heading":"Text","content":"Compound commands can be thought of as running in an implicit subshell. Ils\ncan have I/O redirection independant of the rest of the script.  Setting of variables in a real subshell does not\nleave them set in the parent script.  Setting variables in implicit subshells varies in behaviour among shells.\nOlder sh    could not set variables in an implicit subshell and then use them later,\nbut current ksh    can do this (mostly)."},{"id":"text-368","heading":"Text","content":"Exemple: ex11 display, textReading a file line by line.  The book by Randal Michael contains 12 example ways to read a file line by line,\nwhich vary tremendously in efficiency.  This example shows the simplest and fastest way."},{"id":"text-369","heading":"Text","content":"1: #!/bin/sh\n            2: \n            3: # Demonstrate reading a file line-by-line, using I/O\n            4: # redirection in a compound command\n            5: # Also test variable setting inside an implicit subshell.\n            6: # Test this under sh and ksh and compare the output.\n            7: \n            8: line=&quot;TEST&quot;\n   9: save=\n        10: \n        11: si [-z&quot;[-z&quot;[-z\"[-z\"$1&quot; ]; puis\n        12:    écho &quot;Usage: 0 $ filename&quot;\n  13: autre\n        14:    si [-r[-r[-r[-r$1 ]; puis\n        15:       tandis que read line; faire\n        16:          écho &quot;$line&quot;\n  17:          save=$line\n        18:       terminé &lt; $1\n        19:    fi\n        20: fi\n        21: écho &quot;End value of $line est $line&quot;\n  22: écho &quot;End value of $save est $save&quot;"},{"id":"text-370","heading":"Text","content":"(19)"},{"id":"text-371","heading":"Text","content":"Case statement: pattern matching"},{"id":"text-372","heading":"Text","content":"Cas mot dans modèle) liste;; esac"},{"id":"text-373","heading":"Text","content":"Comparer mot avec chaque modèle) in turn, and executes the first liste\npour lequel le mot allumettes. le les patrons follow the same rules as for filename\nwildcards."},{"id":"text-374","heading":"Text","content":"(ksh and bash only)\nA pattern-list is a list of one or more  patterns  separated\nfrom  each  other with a |. Composite patterns can be formed\nwith one or more of the following:"},{"id":"text-375","heading":"Text","content":"?(pattern-list)"},{"id":"text-376","heading":"Text","content":"Optionally matches any one of the given patterns."},{"id":"text-377","heading":"Text","content":"*(pattern-list)"},{"id":"text-378","heading":"Text","content":"Matches  zero  or  more  occurrences  of   the   given  patterns."},{"id":"text-379","heading":"Text","content":"+(pattern-list)"},{"id":"text-380","heading":"Text","content":"Matches one or more occurrences of the given patterns."},{"id":"text-381","heading":"Text","content":"@(pattern-list)"},{"id":"text-382","heading":"Text","content":"Matches exactly one of the given patterns."},{"id":"text-383","heading":"Text","content":"!(pattern-list)"},{"id":"text-384","heading":"Text","content":"Matches anything, except one of the given patterns."},{"id":"text-385","heading":"Text","content":"Exemple:"},{"id":"text-386","heading":"Text","content":"case $filename in\n    *.dat)\n        echo Processing a .dat file\n        ;;\n    *.sas)\n        echo Processing a .sas file\n        ;;\n    *)\n        # catch anything else that doesn&#39;t match patterns\n        echo &quot;Don&#39;t know how to deal with $filename&quot;\n        ;;\n    esac"},{"id":"text-387","heading":"Text","content":"Miscellaneous flow control and subshells\nPause [n]"},{"id":"text-388","heading":"Text","content":"Break out of the current (or n&#39;th) enclosing loop.  Control jumps to the next statement\nafter the loop"},{"id":"text-389","heading":"Text","content":"continuer [n];"},{"id":"text-390","heading":"Text","content":"Resume iteration of the current (or n&#39;th) enclosing loop.  Control jumps to the top of the loop,\nwhich generally causes re-evaluation of a tandis que    or processing the next element of a\npour."},{"id":"text-391","heading":"Text","content":". nom de fichier"},{"id":"text-392","heading":"Text","content":"Read the contents of the named file into the current shell and execute as if in line.  Uses $PATH\nto locate the file, and can be passed positional parameters.  This is often used to read in shell\nfunctions that are common to multiple scripts.  There are security implications if the pathname is not\nfully specified."},{"id":"text-393","heading":"Text","content":"( ... )    Command grouping"},{"id":"text-394","heading":"Text","content":"Commands grouped in &quot;( )&quot; are executed in a subshell, with a separate environment\n(can not affect the variables in the rest of the script).  \n(20)"},{"id":"text-395","heading":"Text","content":"As with most aspects of shell scripting, there are usually several possible ways to accomplish\na task.  Certain idioms show up commonly.  These are five ways to examine and branch on the\ninitial character of a string."},{"id":"text-396","heading":"Text","content":"Utilisation Cas    with a pattern:"},{"id":"text-397","heading":"Text","content":"case $var in/*) echo &quot;starts with /&quot; ;; \nWorks in all shells, and uses no extra processes"},{"id":"text-398","heading":"Text","content":"Utilisation `cut`:"},{"id":"text-399","heading":"Text","content":"si [ \"`echo $var | cut -c1`\" = \"/\" ] ; puis .\nWorks in all shells, but inefficiently uses a pipe and external process for a trivial task."},{"id":"text-400","heading":"Text","content":"Use POSIX variable truncation:"},{"id":"text-401","heading":"Text","content":"si [ \"$var%$var#?\" = \"/\" ]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Not obvious if you have not seen\nthis one before.  Fails on old Bourne shells.\nDave Taylor in &quot;Wicked Cool Shell Scripts&quot; likes this one."},{"id":"text-402","heading":"Text","content":"Use POSIX  pattern match inside of [[&#8230;]]:"},{"id":"text-403","heading":"Text","content":"si [[ $var = /* ]]; puis\nWorks with ksh, bash and other POSIX-compliant shells.  Note that you must use [[&#8230;]]and no quotes around the pattern."},{"id":"text-404","heading":"Text","content":"le [[&#8230;]]syntax is handled internally by the shell and can therefore interpret &quot;wildcard&quot; patterns\ndifferently than an external command.  An unquoted wildcard is interpreted as a pattern to be matched,\nwhile a quoted wildcard is taken literally. le [&#8230;] syntax, even if handled internally, is treated\nas though it were external for backward compatability.  This requires that wildcard patterns be expanded\nto matching filenames."},{"id":"text-405","heading":"Text","content":"Use ksh (93 and later) and bash variable substrings:"},{"id":"text-406","heading":"Text","content":"si [ \"$var:0:1\" = \"/\" ]; puis\nksh93 and later versions, and bash, have a syntax for directly extracting substrings by character\nposition. $varname:start:length"},{"id":"text-407","heading":"Text","content":"Exemple: ex17 display, text\n(21)"},{"id":"text-408","heading":"Text","content":"The shells (ksh in particular) have many more internal commands.  Some are used more in interactive\nshells.  The commands listed here are used in scripts, but don&#39;t conveniently fit elsewhere in the\nclasse."},{"id":"text-409","heading":"Text","content":"eval args"},{"id":"text-410","heading":"Text","content":"The args are read as input to the shell and the resulting command executed.  Allows &quot;double&quot; expansion\nof some constructs.  For example, constructing a variable name out of pieces, and then obtaining the value\nof that variable."},{"id":"text-411","heading":"Text","content":"netdev=NETDEV_ \nNETDEV_1=hme0         # As part of an initialization step defining multiple devices"},{"id":"text-412","heading":"Text","content":"devnum=1              # As part of a loop over those devices\nifname=$netdev€devnum # construct a variable name NETDEV_1\neval device=$$ifname # evaluate it - device is set to hme0"},{"id":"text-413","heading":"Text","content":"exec command args"},{"id":"text-414","heading":"Text","content":"The command is executed au lieu de the current shell.  There is no return from an exec.\nI/O redirection may be used.  This is also used to change the I/O for the current shell."},{"id":"text-415","heading":"Text","content":":"},{"id":"text-416","heading":"Text","content":"The line is variable-expanded, but otherwise treated as a comment. parfois\nused as a synonym for &quot;true&quot; in a loop."},{"id":"text-417","heading":"Text","content":"while :; faire\n  # this loop will go forever until broken by \n  # a conditional test inside, or a signal\nterminé"},{"id":"text-418","heading":"Text","content":"unset var ..."},{"id":"text-419","heading":"Text","content":"Remove the named variables.  This is not the same as setting their values to null."},{"id":"text-420","heading":"Text","content":"composer [+/- options]    [[[[prénom[=[=[=[=valeur]]...    (ksh only,\nbash uses déclarer    for similar functions)"},{"id":"text-421","heading":"Text","content":"Set attributes and values for shell variables and functions.  When used inside a function, a local\nvariable is created.  Some of the options are:"},{"id":"text-422","heading":"Text","content":"-L[n]"},{"id":"text-423","heading":"Text","content":"Left justify and remove leading blanks.  The variable always has length n if specified."},{"id":"text-424","heading":"Text","content":"-R[n]"},{"id":"text-425","heading":"Text","content":"Right justify and fill with leading blanks. The variable always has length n if specified."},{"id":"text-426","heading":"Text","content":"-l"},{"id":"text-427","heading":"Text","content":"The named variable is always treated as an integer.  This makes arithmetic faster.  The reserved word\n entier    is an alias for typeset -i."},{"id":"text-428","heading":"Text","content":"-Z[n]"},{"id":"text-429","heading":"Text","content":"As for -R, but fill with zeroes if the value is a number"},{"id":"text-430","heading":"Text","content":"-je"},{"id":"text-431","heading":"Text","content":"Lower-case convert the named variables"},{"id":"text-432","heading":"Text","content":"-u"},{"id":"text-433","heading":"Text","content":"Upper-case convert the named variables"},{"id":"text-434","heading":"Text","content":"-r"},{"id":"text-435","heading":"Text","content":"Mark the variables as readonly"},{"id":"text-436","heading":"Text","content":"-x"},{"id":"text-437","heading":"Text","content":"Export the named variables to the enviroment"},{"id":"text-438","heading":"Text","content":"-ft"},{"id":"text-439","heading":"Text","content":"The variables are taken as function names.  Turn on execution tracing."},{"id":"text-440","heading":"Text","content":"(22)"},{"id":"text-441","heading":"Text","content":"Text variables\nle modèle in the following uses the same wildcards as for filename matching."},{"id":"text-442","heading":"Text","content":"$#var"},{"id":"text-443","heading":"Text","content":"returns the length of $var in characters"},{"id":"text-444","heading":"Text","content":"$var%pattern"},{"id":"text-445","heading":"Text","content":"removes the shortest suffix of $var patching modèle"},{"id":"text-446","heading":"Text","content":"$var%%pattern"},{"id":"text-447","heading":"Text","content":"removes the longest suffix of $var patching modèle"},{"id":"text-448","heading":"Text","content":"$var#pattern"},{"id":"text-449","heading":"Text","content":"removes the shortest prefix of $var patching modèle"},{"id":"text-450","heading":"Text","content":"$var##pattern"},{"id":"text-451","heading":"Text","content":"removes the longest prefix of $var patching modèle"},{"id":"text-452","heading":"Text","content":"Numeric variables"},{"id":"text-453","heading":"Text","content":"$((  integer expression  ))"},{"id":"text-454","heading":"Text","content":"The $(( &#8230; )) construction interprets the contents as an arithmetic\nexpression (integer only).  Variables are referenced by name without the &quot;$&quot;.  Most of the arithmetic\nsyntax of the &#39;C&#39; language is supported, including bit manipulations\n (*,/,+,-,|,&amp;,&lt;&gt;. Use parentheses for changing precedence)."},{"id":"text-455","heading":"Text","content":"Exemples\ndatapath=/data/public/project/trials/set1/datafile.dat"},{"id":"text-456","heading":"Text","content":"filename=$datapath##*/"},{"id":"text-457","heading":"Text","content":"nom de fichier    is set to &quot;datafile.dat&quot; since the longest préfixe\npattern matching &quot;*/&quot; is the\nleading directory path (compare basename)"},{"id":"text-458","heading":"Text","content":"path=$datapath%/*"},{"id":"text-459","heading":"Text","content":"chemin    is set to &quot;/data/public/project/trials/set1&quot; since the shortest suffixe\npattern matching &quot;/*&quot; is the\nfilename in the last directory (compare dirname)"},{"id":"text-460","heading":"Text","content":"i=$((i+1))"},{"id":"text-461","heading":"Text","content":"often used in tandis que    boucles"},{"id":"text-462","heading":"Text","content":"(23)"},{"id":"text-463","heading":"Text","content":"All but the earliest versions of sh    allow you define shell functions, which are visible only\nto the shell script and can be used like any other command.  Shell functions take precedence over\nexternal commands if the same name is used.  Functions execute in the same process as the caller,\nand must be defined before use (appear earlier in the file).  They allow a script to be broken\ninto maintainable chunks, and encourage code reuse between scripts.\nDefining functions"},{"id":"text-464","heading":"Text","content":"identifiant()  liste;"},{"id":"text-465","heading":"Text","content":"POSIX syntax for shell functions.  Such functions do not restrict scope of variables\nor signal traps.\nThe identifier follows the rules for variable names,\nbut uses a separate namespace."},{"id":"text-466","heading":"Text","content":"une fonction identifiant  liste;"},{"id":"text-467","heading":"Text","content":"Ksh and bash optional syntax for defining a function.  These functions may define local\nvariables and local signal\ntraps and so can more easily avoid side effects and be reused by multiple scripts."},{"id":"text-468","heading":"Text","content":"A function may read or modify any shell variable that exists in the calling script.  Such variables\nsont global."},{"id":"text-469","heading":"Text","content":"(ksh and bash only) Functions may also declare local variables in the function using composer    ou\ndéclarer.\nLocal variables are visible to the current function and any functions called by it."},{"id":"text-470","heading":"Text","content":"revenir [n], sortie [n]"},{"id":"text-471","heading":"Text","content":"Return from a function with the given value, or exit the whole script with the given value."},{"id":"text-472","heading":"Text","content":"Sans un revenir, the function returns when it reaches the end, and the value is the\nexit status of the last command it ran."},{"id":"text-473","heading":"Text","content":"Exemple:"},{"id":"text-474","heading":"Text","content":"die()"},{"id":"text-475","heading":"Text","content":"   # Print an error message and exit with given status\n   # call as: die status &quot;message&quot; [\"message\" ...]\n   exitstat=$1; décalage\n   for i in &quot;$@&quot;; faire\n      print -R &quot;$i&quot;\n   terminé\n   exit $exitstat"},{"id":"text-476","heading":"Text","content":"Calling functions.\nFunctions are called like any other command.  The output may be redirected independantly of the\nscript, and arguments passed to the function.  Shell option flags like -x are unset in a function &#8211; you\nmust explicitly set them in each function to trace the execution.  Shell functions may even be backgrounded\nand run asynchronously, or run as coprocesses (ksh)."},{"id":"text-477","heading":"Text","content":"Exemple:"},{"id":"text-478","heading":"Text","content":"[ -w $filename ]    || \n  die 1 &quot;$file not writeable&quot; &quot;check permissions&quot;"},{"id":"text-479","heading":"Text","content":"Exemple: Backgrounded function call. ex12 display, text"},{"id":"text-480","heading":"Text","content":"1: #!/bin/sh\n            2: \n            3: background()\n   4: \n   5:    sleep 10\n   6:    écho &quot;Background&quot;\n   7:    sleep 10\n   8:    # Function will return here - if backgrounded, the subprocess will exit.\n            9: \n  10: \n        11: écho &quot;ps before background function&quot;\n  12: ps\n  13: background &amp;\n  14: écho &quot;My PID=$$&quot;\n  15: écho &quot;Background function PID=$!&quot;\n  16: écho &quot;ps after background function&quot;\n  17: ps\n  18: sortie 0"},{"id":"text-481","heading":"Text","content":"Exemple:"},{"id":"text-482","heading":"Text","content":"vprint()"},{"id":"text-483","heading":"Text","content":"   # Print or not depending on global &quot;$verbosity&quot;\n   # Change the verbosity with a single variable.\n   # Arg. 1 is the level for this message.\n   level=$1; décalage\n   si [[ $level -le $verbosity ]]; puis\n      print -R $*\n   fi"},{"id":"text-484","heading":"Text","content":"verbosity=2\nvprint 1 This message will appear\nvprint 3 This only appears if verbosity is 3 or higher"},{"id":"text-485","heading":"Text","content":"Reuseable functions\nBy using only command line arguments, not global variables, and taking care to minimise the side\neffects of functions, they can be made reusable by multiple scripts.  Typically they would be\nplaced in a separate file and read with the &quot;.&quot; operator."},{"id":"text-486","heading":"Text","content":"Functions may generate output to stdout, stderr, or any other file or filehandle.  Messages to stdout\nmay be captured by command substitution (`myfunction`, which provides another way for a function to\nreturn information to the calling script.  Beware of side-effects (and reducing reusability)\nin functions which perform I/O.\n(24)"},{"id":"text-487","heading":"Text","content":"Unix I/O is performed by assigning file descriptors to files or devices, and then\nusing those descriptors for reading and writing.  Descriptors 0, 1, and 2 are always\nused for stdin, stdout and stderr respectively.  Stdin defaults to the keyboard,\nwhile stdout and stderr both default to the current terminal window.\nRedirecting for the whole script\nRedirecting stdout, stderr and other file descriptors for the whole script\ncan be done with the exec    commander."},{"id":"text-488","heading":"Text","content":"exec     &gt; outfile &lt; infile \n \nwith no command, the exec    just reassigns the I/O of the current shell.\n \nexec n&gt;outfile\n \nThe form n opens file descriptor n instead of the default stdin/stdout.\nThis can then be used with read -u    ou print -u."},{"id":"text-489","heading":"Text","content":"Explicitly opening or duplicating file descriptors\nOne reason to do this is to save the current\nstate of stdin/stdout, temporarily reassign them, then restore them."},{"id":"text-490","heading":"Text","content":"&gt;&amp;n\n \nstandard output is moved to whatever file descriptor n is currently pointing to\n \n&lt;&amp;n\n \nstandard input is moved to whatever file descriptor n is currently pointing to\n \nn&gt;fichier\n \nfile descriptor n is opened for writing on the named fichier.\n \nn&gt;&amp;1\n \nfile descriptor n is set to whatever file descriptor 1 is currently pointing to."},{"id":"text-491","heading":"Text","content":"Exemple Sending messages to stderr (2) instead of stdout (1)"},{"id":"text-492","heading":"Text","content":"echo &quot;Error: program failed&quot; &gt;&amp;2"},{"id":"text-493","heading":"Text","content":"Echo always writes to stdout, but stdout can be temporarily reassigned to duplicate stderr (or other file\ndescriptors).\nConventionally Unix programs send error messages to stderr to keep them separated from stdout.\nInput and output to open file descriptors (ksh)\nPrinting to file descriptors (usually more efficient than open/append/close):"},{"id":"text-494","heading":"Text","content":"impression     -u n args\n \nprint to file descriptor n.\n \n-p\n \nwrite to the pipe to a coprocess (opened by |&amp;)"},{"id":"text-495","heading":"Text","content":"Reading from file descriptors other than stdin:"},{"id":"text-496","heading":"Text","content":"lis     -u n var1 var2 rest\n \nread a line from file descriptor n, parsing by $IFS, and placing the words into\nthe named variables.  Any left over words all go into the last variable.\n \n-p\n \nread from the pipe to a coprocess (opened by |&amp;)"},{"id":"text-497","heading":"Text","content":"Closing file handles"},{"id":"text-498","heading":"Text","content":"&lt;&amp;-\n \nstandard input is explicitly closed\n \n&gt;&amp;-\n \nstandard output is explicitly closed"},{"id":"text-499","heading":"Text","content":"For example, to indicate to another program downstream in a pipeline that no more\ndata will be coming.  All file descriptors are closed when a script exits."},{"id":"text-500","heading":"Text","content":"I/O redirection operators are evaluated left-to-right.  This makes a difference in a\nstatement like:\n&quot;&gt;filename 2&gt;&amp;1&quot;.  (Many books with example scripts get this wrong)\n&quot;Here&quot; documents"},{"id":"text-501","heading":"Text","content":"&lt;&amp;lt [-]chaîne"},{"id":"text-502","heading":"Text","content":"redirect input to the temporary file formed by everything up the matching chaîne\nat the start of a line.  Allows for placing file content inline in a script."},{"id":"text-503","heading":"Text","content":"Exemple: ex5 display, text"},{"id":"text-504","heading":"Text","content":"1: #!/bin/sh\n            2: écho &quot;Example of unquoted here document, with variable and command substitution&quot;\n   3: \n            4: cat &lt;&lt;EOF\n   5:  This text will be fed to the &quot;cat&quot; program as \n   6:  standard input.  It will also have variable\n   7:  and command substitutions performed.\n   8:  I am logged in as $USER and today is `rendez-vous amoureux`\n   9: EOF\n  10: écho\n        11: écho &quot;Example of quoted here document, with no variable or command substitution&quot;\n  12: # The terminating string must be at the start of a line.\n        13: cat &lt;&lt;&quot;EndOfInput&quot;\n  14:  This text will be fed to the &quot;cat&quot; program as standard\n  15:  input.  Since the text string marking the end was quoted, it does not get \n  16:  variable and command subsitutions.\n  17:  I am logged in as $USER and today is `rendez-vous amoureux`\n  18: EndOfInput"},{"id":"text-505","heading":"Text","content":"Exemple: duplex display, text"},{"id":"text-506","heading":"Text","content":"1: #!/bin/sh\n            2: # Add in the magic postscript preface to perform\n            3: # duplex printer control for Xerox docuprint.\n            4: \n            5: # To have this script send the files directly to the printer, use \n            6: # a subshell to collect the output of the two &#39;cat&#39; commands.\n            7: \n            8: ## (\n            9: cat &lt;&lt; EOP\n  10: %!PS\n  11: %%BeginFeature: *Duplex DuplexTumble\n  12: &lt;&gt; setpagedevice\n  13: %%EndFeature\n  14: EOP\n  15: cat &quot;$@&quot;\n  16: ## ) | lpr"},{"id":"text-507","heading":"Text","content":"(25)"},{"id":"text-508","heading":"Text","content":"More complicated manipulations of file descriptors can be arranged.\nTwo such examples are shown here:"},{"id":"text-509","heading":"Text","content":"This short test script can be used to generate suitable output.ex13: display, text"},{"id":"text-510","heading":"Text","content":"echo &quot;This goes to stdout&quot;\necho &quot;This goes to stdout and has foo in the line&quot;\necho &quot;This goes to stderr&quot; &gt;&amp;2\nexit 99"},{"id":"text-511","heading":"Text","content":"Pass stderr of a command into a pipeline for further processing\nExemple: ex14 display, text"},{"id":"text-512","heading":"Text","content":"exec 3&gt;&amp;1 ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#39;s/stderr/STDERR/&#39; 1&gt;&amp;2"},{"id":"text-513","heading":"Text","content":"We duplicate stdout to another file descriptor (3), then run the first command with stderr redirected\nto stdout and stdout redirected to the saved descriptor (3). The result is piped into other commands\ncomme requis. The output of the pipeline is redirected back to stderr, so that stdout and stderr of the script\nas a whole are what we expect."},{"id":"text-514","heading":"Text","content":"1: #!/bin/sh\n            2: # Example 14\n            3: # Take stderr from a command and pass it into a pipe\n            4: # for further processing.\n            5: \n            6: # Uses ex13.sh to generate some output to stderr\n            7: # stdout of ex13 is processed normally\n            8: \n            9: # Save a copy of original stdout\n        10: exec 3&gt;&amp;1\n  11: \n        12: # stdout from ex13.sh is directed to the original stdout (3)\n        13: # stderr is passed into the pipe for further processing.\n        14: # stdout from the pipe is redirected back to stderr\n        15: ./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-  | sed &#39;s/stderr/STDERR/&#39; 1&gt;&amp;2\n  16: \n        17: # 3 is closed before running the command, just in case it cares\n        18: # about inheriting open file descriptors."},{"id":"text-515","heading":"Text","content":"Capture the exit status of a command in the middle of a pipeline\nExemple: ex15 display, text"},{"id":"text-516","heading":"Text","content":"exec 3&gt;&amp;1     ex13stat=`((./ex13.sh; echo $? &gt;&amp;4) | grep &#39;foo&#39; 1&gt;&amp;3) 4&gt;&amp;1` \nThis script uses nested subshells captured in backtics.\nAgain we first duplicate stdout to another file descriptor (3).\nThe inner subshell runs the first command, then writes the exit status\nto fd 4.  The outer subshell redirects 4 to stdout so that it is\ncaptured by the backtics.  Standard output from the first command\n(inner subshell) is passed into the pipeline as normal, but the final output\nof the pipeline is redirected to 3 so that it appears on the original stdout\nand is not captured by the backtics."},{"id":"text-517","heading":"Text","content":"If any of the commands really care about inheriting open file\ndescriptors that they don&#39;t need then a more correct command line\ncloses the descriptors before running the commands."},{"id":"text-518","heading":"Text","content":"1: #!/bin/sh\n            2: # Example 15\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into $ex13stat.  \n            8: # stdout of ex13 is processed normally\n            9: \n        10: # Save a copy of stdout\n        11: exec 3&gt;&amp;1\n  12: # Run a subshell, with 4 duplicated to 1 so we get it in stdout.  \n        13: # Capture the output in ``\n        14: # ex13stat=`( ...  ) 4&gt;&amp;1`\n        15: # Inside the subshell, run another subshell to execute ex13, \n        16: # and echo the status code to 4\n        17: # (./ex13.sh; écho $? &gt;&amp;4)\n        18: # stdout from the inner subshell is processed normally, but the \n        19: # subsequent output must be directed to 3 so it goes to the \n        20: # original stdout and not be captured by the ``\n        21: ex13stat=`((./ex13.sh; écho $? &gt;&amp;4) | grep &#39;foo&#39; 1&gt;&amp;3) 4&gt;&amp;1`\n  22: \n        23: écho Last command status=$?\n  24: écho ex13stat=$ex13stat\n        25: \n        26: # If any of the commands really care about inheriting open file \n        27: # descriptors that they don&#39;t need then a more correct command line \n        28: # closes the descriptors before running the commands\n        29: exec 3&gt;&amp;1\n  30: ex13stat=`((./ex13.sh 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  31:    grep &#39;foo&#39;  1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  32: écho Last command status=$?\n  33: écho ex13stat=$ex13stat"},{"id":"text-519","heading":"Text","content":"Combine the above two techniques:"},{"id":"text-520","heading":"Text","content":"Exemple: ex16 display, text"},{"id":"text-521","heading":"Text","content":"exec 3&gt;&amp;1 ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; echo $? &gt;&amp;4) |          sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`"},{"id":"text-522","heading":"Text","content":"1: #!/bin/sh\n            2: # Example 16\n            3: \n            4: # Uses ex13.sh to generate some output and give us an \n            5: # exit status to capture.\n            6: \n            7: # Get the exit status of ex13 into ex13stat. \n            8: # stderr of ex13 is processed by the pipe, stdout\n            9: # is left alone.\n        10: \n        11: # Save a copy of stdout\n        12: exec 3&gt;&amp;1\n  13: \n        14: # Run a subshell, with 4 copied to 1 so we get it in stdout.  \n        15: # Capture the output in backtics`\n        16: # ex13stat=`(    ) 4&gt;&amp;1`\n        17: \n        18: # In the subshell, run another subshell to execute ex13, and \n        19: # echo the status code to 4\n        20: # (./ex13.sh; écho $? &gt;&amp;4)\n        21: \n        22: # stdout from the inner subshell is directed to the original stdout (3)\n        23: # stderr is passed into the pipe for further processing.\n        24: # stdout from the pipe is redirected back to stderr\n        25: \n        26: # Close the extra descriptors before running the commands\n        27: exec 3&gt;&amp;1\n  28: ex13stat=`((./ex13.sh 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;- 4&gt;&amp;- ; écho $? &gt;&amp;4) | \n  29:   sed s/err/ERR/ 1&gt;&amp;2 3&gt;&amp;- 4&gt;&amp;- ) 4&gt;&amp;1`\n  30: \n        31: écho Last command status=$?\n  32: écho ex13stat=$ex13stat\n        33:"},{"id":"text-523","heading":"Text","content":"A practical application of this would be running a utility such as dd\nwhere the exit status is important to capture, but the error output is overly chatty and\nmay need to be filtered before delivering to other parts of a script.\n(26)"},{"id":"text-524","heading":"Text","content":"Scripts can start any number of background jobs (any external command),\nwhich run in parallel with the\nparent script, and asynchronously.  Processes which require no further interaction\nor synchronization (fire and forget) are easy.\nInteraction with background jobs is tricky. Vous pouvez\nuse signals, pipes, named pipes, or disk files for communication."},{"id":"text-525","heading":"Text","content":"commander Et"},{"id":"text-526","heading":"Text","content":"Début commander as a background process.  Control returns immediately to the shell."},{"id":"text-527","heading":"Text","content":"bgpid=$!"},{"id":"text-528","heading":"Text","content":"The special variable $!    contains the process ID of the last background job\nthat was started.  You can save that and examine the process later\n(ps -p $bgpid) or send it a signal (kill -HUP $bgpid)."},{"id":"text-529","heading":"Text","content":"ksh coprocesses\nCoprocesses are a way of starting a separate process which\nruns asychronously, but has stdin/stdout connected to the parent script via pipes."},{"id":"text-530","heading":"Text","content":"commander |&amp;"},{"id":"text-531","heading":"Text","content":"Start a coprocess with a 2-way pipe to it"},{"id":"text-532","heading":"Text","content":"lis -p var"},{"id":"text-533","heading":"Text","content":"Read from the pipe to the coprocess, instead of standard input"},{"id":"text-534","heading":"Text","content":"impression -p args"},{"id":"text-535","heading":"Text","content":"Write to the pipe connected to the coprocess, instead of standard output"},{"id":"text-536","heading":"Text","content":"Multiple coprocesses can be handled by moving the special file descriptors connected\nto the pipes onto standard input and output, and or to explicitly specified file descriptors."},{"id":"text-537","heading":"Text","content":"exec &lt;&amp;p"},{"id":"text-538","heading":"Text","content":"The input from the coprocess is moved to standard input"},{"id":"text-539","heading":"Text","content":"exec &gt;&amp;p"},{"id":"text-540","heading":"Text","content":"The output from the coprocess is moved to standard output"},{"id":"text-541","heading":"Text","content":"Exemple: ex9 display, textA script wants to save a copy of all output in a file, but also wants a copy\nà l&#39;écran. This is equivalent to always running the script asscénario | tee outfile"},{"id":"text-542","heading":"Text","content":"1: #!/bin/ksh\n            2: \n            3: # If we have not redirected standard output, save a copy of\n            4: # the output of this script into a file, but still send a\n            5: # copy to the screen.\n            6: \n            7: si [[ -t 1 ]]; puis\n            8:   # Only do this if fd 1 (stdout) is still connected\n            9:   # to a terminal\n        10: \n        11:   # We want the standard output of the &quot;tee&quot; process\n        12:   # to go explicitly to the screen (/dev/tty)\n        13:   # and the second copy goes into a logfile named $0.out\n        14: \n        15:   tee 0 $.out &gt;/dev/tty |&amp;\n  16: \n        17:   # Our stdout all goes into this coprocess\n        18:   exec 1&gt;&amp;p\n  19: fi\n        20: \n        21: # Now generate some output\n        22: impression &quot;User activity snapshot on $(hostname) at $(date)&quot;\n  23: impression\n        24: qui"},{"id":"text-543","heading":"Text","content":"Exemple: ex10 display, textStart a coprocess to look up usernames in some database.\nIt is faster to run a single process than to run a separate\nlookup for each user."},{"id":"text-544","heading":"Text","content":"1: #!/bin/ksh\n            2: # This example uses a locally written tool for Dartmouth Name Directory lookups\n            3: \n            4: # Start the dndlookup program as a coprocess\n            5: # Tell it to output only the canonical full name, and to not print multiple matches\n            6: dndlookup -fname -u |&amp;\n   7: \n            8: # move the input/output streams so we \n            9: # can use other coprocesses too\n        10: exec 4&gt;&amp;p\n  11: exec 5&lt;&amp;p\n  12: \n        13: écho &quot;Name file contents:&quot;\n  14: cat namefile\n  15: écho\n        16: \n        17: # read the names from a file &quot;namefile&quot;\n        18: tandis que read uname; faire\n        19:   impression -u4 $uname\n        20:   lis  -u5 dndname\n  21:   Cas $dndname dans\n  22:   *many matches*)\n  23:     # handle case where the name wasn&#39;t unique\n        24:     impression &quot;Multiple matches to &quot;$uname&quot; in DND&quot;\n  25:     ;;\n  26:   *no match*)\n  27:     # handle case where the name wasn&#39;t found\n        28:     impression &quot;No matches to &quot;$uname&quot; in DND&quot;\n  29:     ;;\n  30:   *)\n  31:     # we seem to have a hit - process the\n        32:     # canonical named retrieved from dndlookup\n        33:     impression &quot;Unique DND match: full name for &quot;$uname&quot; is &quot;$dndname&quot;&quot;\n  34:     ;; \n  35:   esac\n        36:   sleep 2\n  37: terminé &lt; namefile\n  38: \n        39: # We&#39;ve read all the names, but the coprocess\n        40: # is still running.  Close the pipe to tell it\n        41: # we have finished.\n        42: exec 4&gt;&amp;-"},{"id":"text-545","heading":"Text","content":"(27)"},{"id":"text-546","heading":"Text","content":"Both ksh and bash implement arrays of variables, but in somewhat different ways."},{"id":"text-547","heading":"Text","content":"ksh distinguishes between numerically indexed (small) arrays, and string indexed (associative) arrays.\nbash uses integers for all array indexing, but the integers need not be consecutive and unassigned array elements\ndo not exist.  Arrays must be declared before use, e,g. typeset -A myarray    (ksh associative array), or\ntypeset -a myarray    (bash)."},{"id":"text-548","heading":"Text","content":"Array elements are set with the syntax:\nmyarray[index]=value\nand referenced with the syntax $myarray[index]"},{"id":"text-549","heading":"Text","content":"This example shows use of an array indexed by IP addresses, as strings in ksh or as non-consecutive numbers in bash.\nIt also demonstrates use of getopt for options processing"},{"id":"text-550","heading":"Text","content":"Exemple: getauthlogs display, text"},{"id":"text-551","heading":"Text","content":"1: #! / bin / bash\n            2: # $Header: $\n            3: # First attempt at a consolidated auth log collection from kaserver\n            4: # Timestamps in the raw files are NOT designed for easy sorting.\n            5: #\n            6: # Options:\n            7: #  -i  -- translate hex IP addresses to dotted-decimal (relatively quick)\n            8: #  -h  -- translate hex IP addresses to DNS names (somewhat slower - DNS lookups)\n            9: #  -u user -- filter for the named user before translating addresses\n        10: \n        11: hextodec()\n  12: \n  13:    # convert the IP address in reverse-hex to dotted-decimal\n        14:    écho $((0x$1:6:2)).$((0x$1:4:2)).$((0x$1:2:2)).$((0x$1:0:2))\n        15: \n  16: \n        17: hostlookup()\n  18:  tr &#39;A-Z&#39; &#39;a-z&#39;\n  30:       ;;\n  31:    esac\n        32: \n  33: \n        34: # Options\n        35: iptranslate=0\n  36: gethostnames=0\n  37: filter=chat\n  38: tandis que getopts ihu: o ; faire\n        39:    Cas $o dans\n  40:    i) iptranslate=1 ;;\n  41:    h) gethostnames=1; iptranslate=1 ;;\n  42:    u) filter=&quot;grep $OPTARG&quot; ;;\n  43:    esac\n        44: terminé\n        45: décalage $(($OPTIND-1))\n        46: \n        47: # We could get the DB server names from &#39;fs checkservers&#39;, but it isn&#39;t obvious what is from our cell. nous\n        48: # could also grep CellServDB.  I cop out and hard code one known DB server and get the others from it.\n        49: masterserver=halley.dartmouth.edu\n  50: serverlist=$(bos listhosts -server $masterserver| grep &#39;Host .* is &#39; | awk &#39;print 4 $&#39;)\n  51: \n        52: # If we want to filter usernames, it is more efficient to do it inline, before sorting, translation and hostname lookups\n        53: \n        54: # Array to hold IP address/name conversions (associative array, ksh only)\n        55: # ksh - use -A for associative array.  bash - use -a and numeric array\n        56: composer -a hostnames\n  57: \n        58: (\n  59: pour dbserver in $serverlist; faire\n        60:    bos getlog -server $dbserver -file /usr/afs/logs/AuthLog\n  61: terminé\n        62: ) | grep -v &#39;Fetching log file&#39; | $filter | sed -e &#39;s/^... //&#39; -e &#39;s/  ([1-9]) / 01 /&#39; | sort --month-sort | \n  63:     sed &#39;-e s/ ([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])$/ 01/&#39; |\n  64:     tandis que read line; faire\n        65:    si [[[[[[[[$iptranslate == 1 ]]; puis\n        66:       # Ugly!\n        67:       # Sometimes we get a 7-digit hex code in the log - the kaserver apparently drops leading zeros.\n        68:       # The second &#39;sed&#39; in the pipe catches these are fixes them.\n        69:       Cas $line dans\n  70:       * from [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])\n  71:          # translate the reverse-hex address\n        72:          iphex=$line##* from \n        73:          # bash version - index by numeric value only, but can be sparse array -- use the raw IP \n        74:          ipdec=$((0x$iphex))\n        75:          frontpart=$line% from *\n        76:          si [[[[[[[[$gethostnames == 1 ]]; puis\n        77:             # ksh - index on hex value as a string (iphex)\n        78:             # bash - index on numeric value (ipdec)\n        79:             index=$ipdec\n        80:             si [[-z&quot;[[-z&quot;[[-z\"[[-z\"$hostnames[[[[$index]&quot; ]]; puis\n        81:                hostnames[[[[$index]=&quot;$(hostlookup $(hextodec $iphex))&quot; \n  82:             fi\n        83:             écho &quot;$frontpart de $hostnames[[[[$index]&quot;\n  84:          autre\n        85:             écho &quot;$frontpart from $(hextodec $iphex)&quot;\n  86:          fi\n        87:          ;;\n  88:       *)\n  89:          écho &quot;$line&quot;\n  90:          ;;\n  91:       esac\n        92:    autre\n        93:       # No ip translation, just echo the whole line\n        94:       écho &quot;$line&quot;\n  95:    fi   \n        96: terminé\n        97:"},{"id":"text-552","heading":"Text","content":"(28)"},{"id":"text-553","heading":"Text","content":"Unix signals (software interrupts) can be sent as asynchronous events to shell scripts, just\nas they can to any other program.  The default behaviour is to ignore some signals and immediately\nexit on others.  Scripts may detect signals and divert control to a handler function or external\nprogramme. This is often used to perform clean-up actions before exiting, or restart certain\nprocedures.  Execution resumes where it left off, if the signal handler returns.  Signal traps\nmust be set separately inside of shell functions.  Signals can be sent to a process with\ntuer."},{"id":"text-554","heading":"Text","content":"piège gestionnaire sig ..."},{"id":"text-555","heading":"Text","content":"gestionnaire is a command to be read (evaluated first) and executed on receipt of\nle spécifié sigs. Signals can be specified by name or number (see kill(1))\npar exemple. HUP, INT, QUIT, TERM. A Ctrl-C at the terminal generates a INT."},{"id":"text-556","heading":"Text","content":"A handler of -    resets the signals to their default values"},{"id":"text-557","heading":"Text","content":"A handler of &#39;&#39;    (null) ignores the signals"},{"id":"text-558","heading":"Text","content":"Special signal values are as follows:"},{"id":"text-559","heading":"Text","content":"EXIT"},{"id":"text-560","heading":"Text","content":"the handler is called when the function exits, or when the whole script exits. le\nexit signal has value 0."},{"id":"text-561","heading":"Text","content":"ERR    (ksh)"},{"id":"text-562","heading":"Text","content":"the handler is called when any command has a non-zero exit status"},{"id":"text-563","heading":"Text","content":"DEBUG    (ksh)"},{"id":"text-564","heading":"Text","content":"the handler is called after chaque commander."},{"id":"text-565","heading":"Text","content":"Exemple: ex8 display, text"},{"id":"text-566","heading":"Text","content":"1: #! / bin / bash\n            2: # Try this under bash, ksh and sh\n            3: \n            4: piège huphandler  HUP\n   5: piège &#39;&#39;          QUIT\n   6: piège exithandler TERM INT\n   7: \n            8: huphandler()\n   9: \n  10:    écho &#39;Received SIGHUP&#39;\n  11:    écho &quot;continuing&quot;\n  12: \n  13: \n        14: exithandler()\n  15: \n  16:    écho &#39;Received SIGTERM or SIGINT&#39;\n  17:    sortie 1\n  18: \n  19: ## Execution starts here - infinite loop until interrupted\n        20: # Use &quot;:&quot; or &quot;true&quot; for infinite loop\n        21: # SECONDS is built-in to bash and ksh.  It is number of seconds since script started\n        22: : is like a comment, but it is evaluated for side effects and evaluates to true\n  23: seconds=0\n  24: tandis que : ; faire\n        25: # while true; faire\n        26:    sleep 5\n  27:    seconds=$((seconds + 5))\n        28:    écho -n &quot;$SECONDS $seconds - &quot;\n  29: terminé"},{"id":"text-567","heading":"Text","content":"Exit handlers can be defined to clean up temporary files or reset the state of devices. Ce\ncan be useful if the script has multiple possible exit points.\n(29)"},{"id":"text-568","heading":"Text","content":"Shell scripts are often used by system administrators and are run as a priviledged user."},{"id":"text-569","heading":"Text","content":"Don&#39;t use set-UID scripts."},{"id":"text-570","heading":"Text","content":"Most systems don&#39;t even allow a script to be made set-UID.  It is\nimpossible (due to inherent race conditions) to ensure that a set-uid script cannot be compromised.\nUse wrapper programs like sudo    instead."},{"id":"text-571","heading":"Text","content":"Always explicitly set $PATH    at the start of a script, so that you know exactly\nwhich external programs will be used."},{"id":"text-572","heading":"Text","content":"If possible, don&#39;t use temporary files.  If they cannot be avoided, use $TMPDIR,\nand create files safely (e.g. mktemp)."},{"id":"text-573","heading":"Text","content":"Often scripts will write to a fixed, or trivially generated temporary filename in /tmp.  If the\nfile already exists and you don&#39;t have permission to overwrite it, the script will fail. Si vous\ndo have permission to overwrite it, you will delete the previous contents.  Since /tmp is public write,\nanother user may create files in it, or possibly fill it completely.\nExemple:"},{"id":"text-574","heading":"Text","content":"A link is created by an unprivileged user in /tmp:     /tmp/scratch  -&gt; /vmunix"},{"id":"text-575","heading":"Text","content":"A root user runs a script that blindly writes a scratch file to /tmp/scratch, and overwrites the\noperating system."},{"id":"text-576","heading":"Text","content":"Environment variable $TMPDIR    is often used to indicate a preferred location for\ntemporary files (e.g., a per-user directory).  Some systems may use $TMP    ou $TEMP.\nSafe scratch files can be made by creating a new directory, owned\nand writeable only by you, then creating files in there.\nExemple:"},{"id":"text-577","heading":"Text","content":"(umask 077 &amp;&amp; mkdir /tmp/tempdir.$$) || exit 1"},{"id":"text-578","heading":"Text","content":"or (deluxe version)"},{"id":"text-579","heading":"Text","content":"tmp=$TMPDIR:-/tmp\ntmp=$tmp/tempdir.$RANDOM.$RANDOM.$RANDOM.$$\n(umask 077 &amp;&amp; mkdir $tmp) || \n    echo &quot;Could not create temporary directory&quot; 1&gt;&amp;2\n    exit 1"},{"id":"text-580","heading":"Text","content":"Alternatively, many systems have mktemp    to safely create a temporary file and return\nthe filename, which can be used by the script and then deleted."},{"id":"text-581","heading":"Text","content":"Check exit status of everything you do."},{"id":"text-582","heading":"Text","content":"Don&#39;t trust user input"},{"id":"text-583","heading":"Text","content":"contents of files\n  \ndata piped from other programs\n  \nfichier des noms. Output of filename generation with wildcards, or directly from\n     ls    ou trouver"},{"id":"text-584","heading":"Text","content":"Exemple:\nConsider the effects of a file named &quot;myfile;cd /;rm *&quot; if processed,\nunquoted, by your script."},{"id":"text-585","heading":"Text","content":"One possible way to protect against weirdo characters in file names:"},{"id":"text-586","heading":"Text","content":"# A function to massage a list of filenames \n# to protect weirdo characters\n# e.g. find ... | protect_filenames | xargs command\n#\n# We are backslash-protecting the characters &#39;&quot; ?*;\nprotect_filenames()"},{"id":"text-587","heading":"Text","content":"   sed -es/\\\\/\\\\\\\\/g \n       -es/\\&#39;/\\\\&#39;/g   \n       -es/\\&quot;/\\\\&quot;/g   \n       -es/\\;/\\\\;/g   \n       -es/\\?/\\\\?/g   \n       -es/\\*/\\\\*/g   \n       -es/\\ /\\\\ /g"},{"id":"text-588","heading":"Text","content":"If using GNU trouver    et xargs, there is a much cleaner option\nto null-terminate generated pathnames."},{"id":"text-589","heading":"Text","content":"(30)"},{"id":"text-590","heading":"Text","content":"Shell scripts are very frequently written quickly for a single purpose, used once and discarded.\nThey are also as frequently kept and used many times, and migrate into other uses, but often\ndo not receive the same level of testing and debugging that other software would be given\nin the same situation. Il est possible to apply general principles of good software\nengineering to shell scripts."},{"id":"text-591","heading":"Text","content":"Preface scripts with a statement of purpose, author, date and revision notes"},{"id":"text-592","heading":"Text","content":"Use a revision control system for complex scripts with a long lifetime"},{"id":"text-593","heading":"Text","content":"Assume your script volonté have a long lifetime unless you are certain it won&#39;t"},{"id":"text-594","heading":"Text","content":"Document any non-standard external utilities which your script needs"},{"id":"text-595","heading":"Text","content":"Document your scripts with inline comments &#8211; you&#39;ll need them in a few months when you edit it."},{"id":"text-596","heading":"Text","content":"Treat standard input and output in the normal way, so that your script can be used\nin combination with other programs (the Unix toolkit philosophy)"},{"id":"text-597","heading":"Text","content":"Be consistent in the format of your output, so that other programs can rely on it"},{"id":"text-598","heading":"Text","content":"Use options to control behaviour such as verbosity of output.  Overly chatty programs are\nvery hard to combine with other utilities"},{"id":"text-599","heading":"Text","content":"Use interactive features (prompting the user for information) très parcimonieusement.\nDoing so renders the script unuseable in pipeline combinations with other programs, or in unattended\noperations."},{"id":"text-600","heading":"Text","content":"Test (a lot)"},{"id":"text-601","heading":"Text","content":"When not to use shell scripts"},{"id":"text-602","heading":"Text","content":"If an existing tool already does what you need &#8211; use it."},{"id":"text-603","heading":"Text","content":"If the script is more than a few hundred lines, you are probably using the wrong tool."},{"id":"text-604","heading":"Text","content":"If performance is horrible, and the script is used a lot, you might want to consider another language."},{"id":"text-605","heading":"Text","content":"(31)"},{"id":"text-606","heading":"Text","content":"The class accounts have directories with all of the examples from the books by Blinn,\nMichael, Rosenblatt, and Taylor.  These can also be downloaded (see the References page).\nSome of these are linked below (but not included in the printed notes), with additional comments."},{"id":"text-607","heading":"Text","content":"Download a compressed tar file of all example scripts used in these notes."},{"id":"text-608","heading":"Text","content":"postprint display, textA wrapper script for printing a mix of text and postscript files"},{"id":"text-609","heading":"Text","content":"checkpath display,\ntexteCheck all the directories in the $PATH    for possibly conflicting programs."},{"id":"text-610","heading":"Text","content":"run-with-timeout display,\ntexteRun a command with a timeout.  Kill the command if it hasn&#39;t finished when the timeout expires."},{"id":"text-611","heading":"Text","content":"MailPkg display, textTar, compress, split and uuendcode a set of files for mailing. (Blinn)"},{"id":"text-612","heading":"Text","content":"Ptree (original) display, text\nPtree (ksh version) display, textRuns &quot;ps&quot; to get a process listing and then\nreformats to show the process family hierarchies.  The original example is pure Bourne shell\nand inefficient.  The ksh version is a fairly simple translation to use ksh internal commands\nwhere possible, and avoid writing scratch files,  and runs very much faster.  (Blinn)."},{"id":"text-613","heading":"Text","content":"This entire tutorial was created from individual HTML pages using a content management system written\nas ksh scripts (heavily using sed to edit the pages), coordinated by faire.\n&lt;! &#8211;"},{"id":"text-614","heading":"Text","content":"buildhtml afficher, texte\nTurns a stand-alone HTML file into a component of the tutorial, with navigation links and frames.\nbuildslidelist afficher, texte\nCreates the slide list which appears as the left frame of the tutorial.\nbuildframeset afficher, texte\nCreates a top level frameset to call the slide list and content pages.\nksh2html afficher, texte\nCreates the colourized HTML page of a shell script.\nMakefile texte\nMakefile used to build the site using the above tools"},{"id":"text-615","heading":"Text","content":"-&gt;"},{"id":"text-616","heading":"Text","content":"You can even write an entire web server as a shell script.  This one is part of the\nLEAF\n(Linux Embedded Appliance Firewall) project.  This wouldn&#39;t be suitable for much load, but handles occasional queries on\nstatic HTML and CGI scripts.\n(www.nisi.ab.ca/lrp/Packages/weblet.htm)"},{"id":"text-617","heading":"Text","content":"(32)"},{"id":"text-618","heading":"Text","content":"The following commands are very frequently used in shell scripts.  Many of them are used\nin the examples in these notes.  This is just a brief recap &#8212; see the man pages for details on usage.\nThe most useful are flagged with *."},{"id":"text-619","heading":"Text","content":"Most of these commands will operate on a one or more named files, or will operate on a stream of\ndata from standard input if no files are named.\nListing, copying and moving files and directories"},{"id":"text-620","heading":"Text","content":"ls *"},{"id":"text-621","heading":"Text","content":"list contents of a directory, or list details of files and directories."},{"id":"text-622","heading":"Text","content":"mkdir; rmdir *"},{"id":"text-623","heading":"Text","content":"Make and Remove directories."},{"id":"text-624","heading":"Text","content":"rm; cp; mv *"},{"id":"text-625","heading":"Text","content":"Remove (delete), Copy and Move (rename) files and directories"},{"id":"text-626","heading":"Text","content":"toucher *"},{"id":"text-627","heading":"Text","content":"Update the last modifed timestamp on a file, to make it appear to have just been written."},{"id":"text-628","heading":"Text","content":"If the file does not exist, a new zero-byte file is created, which is often useful to signify that\nan event has occurred."},{"id":"text-629","heading":"Text","content":"tee"},{"id":"text-630","heading":"Text","content":"Make a duplicate copy of a data stream &#8211; used in pipelines to send one copy to a log file\nand a second copy on to another program.  (Think plumbing)."},{"id":"text-631","heading":"Text","content":"Displaying text, files or parts of files"},{"id":"text-632","heading":"Text","content":"écho *"},{"id":"text-633","heading":"Text","content":"Echo the arguments to standard output &#8212; used for messages from scripts.\nSome versions of &quot;sh&quot;, and all csh/ksh/bash shells internalized &quot;echo&quot;."},{"id":"text-634","heading":"Text","content":"Conflicts\nsometimes arise over the syntax for echoing a line with no trailing CR/LF.\nSome use &quot;c&quot; and some use option &quot;-n&quot;.  To avoid these problems, ksh also provides the &quot;print&quot;\ncommand for output."},{"id":"text-635","heading":"Text","content":"chat *"},{"id":"text-636","heading":"Text","content":"Copy and concatenate files; display contents of a file"},{"id":"text-637","heading":"Text","content":"tête, queue *"},{"id":"text-638","heading":"Text","content":"Display the beginning of a file, or the end of it."},{"id":"text-639","heading":"Text","content":"Couper"},{"id":"text-640","heading":"Text","content":"Extract selected fields from each line of a file.  Often awk is easier to use, even though it is\na more complex program."},{"id":"text-641","heading":"Text","content":"toilettes"},{"id":"text-642","heading":"Text","content":"Count lines, words and characters in the input."},{"id":"text-643","heading":"Text","content":"Compression and archiving"},{"id":"text-644","heading":"Text","content":"compresse; gzip, Zip *: français; le goudron *"},{"id":"text-645","heading":"Text","content":"Various utilities to compress/uncompress individual files, combine multiple files into a single archive, or\ndo both."},{"id":"text-646","heading":"Text","content":"Sorting and searching for patterns"},{"id":"text-647","heading":"Text","content":"Trier *"},{"id":"text-648","heading":"Text","content":"Sort data alphabetically or numerically."},{"id":"text-649","heading":"Text","content":"grep *"},{"id":"text-650","heading":"Text","content":"Search a file for lines containing character patterns.  The patterns can be simple fixed text, or very complex\nregular expressions."},{"id":"text-651","heading":"Text","content":"The name comes from &quot;Global Regular Expression and Print&quot; &#8212; a function from\nthe Unix editors which was used frequently enough to warrant getting its own program."},{"id":"text-652","heading":"Text","content":"uniq *"},{"id":"text-653","heading":"Text","content":"Remove duplicate lines, and generate a count of repeated lines."},{"id":"text-654","heading":"Text","content":"toilettes *"},{"id":"text-655","heading":"Text","content":"Count lines, words and characters in a file."},{"id":"text-656","heading":"Text","content":"System information (users, processes, time)"},{"id":"text-657","heading":"Text","content":"rendez-vous amoureux *"},{"id":"text-658","heading":"Text","content":"Display the current date and time (flexible format).  Useful for conditional execution based on\ntime, and for timestamping output."},{"id":"text-659","heading":"Text","content":"ps *"},{"id":"text-660","heading":"Text","content":"List the to a running processes."},{"id":"text-661","heading":"Text","content":"tuer *"},{"id":"text-662","heading":"Text","content":"Send a signal (interrupt) to a running process."},{"id":"text-663","heading":"Text","content":"identifiant"},{"id":"text-664","heading":"Text","content":"Print the user name and UID and group of the current user (e.g. to distinguish priviledged users before\nattempting to run programs which may fail with permission errors)"},{"id":"text-665","heading":"Text","content":"qui"},{"id":"text-666","heading":"Text","content":"Display who is logged on the system, and from where they logged in."},{"id":"text-667","heading":"Text","content":"uname *"},{"id":"text-668","heading":"Text","content":"Display information about the system, OS version, hardware architecture etc."},{"id":"text-669","heading":"Text","content":"courrier *"},{"id":"text-670","heading":"Text","content":"Send mail, from a file or standard input, to named recipients.  Since scripts are often used to automate\nlong-running background jobs, sending notification of completion by mail is a common trick."},{"id":"text-671","heading":"Text","content":"enregistreur"},{"id":"text-672","heading":"Text","content":"Place a message in the central system logging facility.  Scripts can submit messages\nwith all the facilities available to compiled programs."},{"id":"text-673","heading":"Text","content":"nom d&#39;hôte"},{"id":"text-674","heading":"Text","content":"Display the hostname of the current host &#8211; usful to keep track of where your programs are running"},{"id":"text-675","heading":"Text","content":"Conditional tests"},{"id":"text-676","heading":"Text","content":"tester; [[[[ *"},{"id":"text-677","heading":"Text","content":"The conditional test, used extensively in scripts, is also an external program which evaluates\nthe expression given as an argument and returns true (0) or false (1) exit status.  The name &quot;[&quot; is a\nlink to the &quot;test&quot; program, so a line like:si [ -w logfile ] actually runs a program &quot;[« , with arguments « -w logfile ]&quot;, and returns a true/false value to the &quot;if&quot;\ncommander."},{"id":"text-678","heading":"Text","content":"In ksh and most newer versions of sh, &quot;[&quot; is replaced with a compatible internal command, but the\nargument parsing is performed as if it were an external command.\nKsh also provides the internal &quot;[[&quot; operator, with simplified syntax."},{"id":"text-679","heading":"Text","content":"Stream Editing"},{"id":"text-680","heading":"Text","content":"awk *"},{"id":"text-681","heading":"Text","content":"A pattern matching and data manipulation utility, which has its own scripting language.  It also duplicates\nmuch functionality from &#39;sed&#39;,&#39;grep&#39;,&#39;cut&#39;,&#39;wc&#39;, etc."},{"id":"text-682","heading":"Text","content":"Complex scripts can be written entirely using awk, but it is\nfrequently used just to extract fields from lines of a file (similar to &#39;cut&#39;)."},{"id":"text-683","heading":"Text","content":"sed *"},{"id":"text-684","heading":"Text","content":"Stream Editor.  A flexible editor which operates by applying editing rules to every line in a data stream\nin turn."},{"id":"text-685","heading":"Text","content":"Since it makes a single pass through the file, keeping only a few lines in memory at once,\nit can be used with infinitely large data sets.  It is mostly used for global search and replace operations.\nIt is a superset of &#39;tr&#39;, &#39;grep&#39;, and &#39;cut&#39;, but is more complicated to use."},{"id":"text-686","heading":"Text","content":"tr"},{"id":"text-687","heading":"Text","content":"Transliterate &#8211; perform very simple single-character edits on a file."},{"id":"text-688","heading":"Text","content":"Finding and comparing files"},{"id":"text-689","heading":"Text","content":"trouver *"},{"id":"text-690","heading":"Text","content":"Search the filesystem and find files matching certain criteria (name pattern, age, owner, size,\nlast modified etc.)"},{"id":"text-691","heading":"Text","content":"xargs *"},{"id":"text-692","heading":"Text","content":"Apply multiple filename arguments to a named command and run it."},{"id":"text-693","heading":"Text","content":"Xargs is often used in combination\nwith &quot;find&quot; to apply some command to all the files matching certain criteria.  Since &quot;find&quot; may result in a very\nlarge list of pathnames, using the results directly may overflow command line buffers.  Xargs avoids this problem,\nand is much more efficient than running a command on every pathname individually."},{"id":"text-694","heading":"Text","content":"diff *"},{"id":"text-695","heading":"Text","content":"Compare two files and list the differences between them."},{"id":"text-696","heading":"Text","content":"basename pathname"},{"id":"text-697","heading":"Text","content":"Returns the base filename portion of the named pathname, stripping off all the directories"},{"id":"text-698","heading":"Text","content":"dirname pathname"},{"id":"text-699","heading":"Text","content":"Returns the directory portion of the named pathname, stripping off the filename"},{"id":"text-700","heading":"Text","content":"Arithmetic and String Manipulation"},{"id":"text-701","heading":"Text","content":"expr *"},{"id":"text-702","heading":"Text","content":"The &quot;expr&quot; command takes an numeric or text pattern expression as an argument, evaluates it, and\nreturns a result to stdout.  The original Bourne shell had no built-in arithmetic operators.\nPar exemple.    expr 2 + 1      expr 2 &#39;*&#39; &#39;(&#39; 21 + 3 &#39;)&#39;  Used with text strings, &quot;expr&quot; can match regular expressions and extract sub expressions.  Similar functionality\ncan be achived with sed.\npar exemple.    expr SP99302L.Z00 : &#39;[A-Z0-9]4\\([0-9]3\\)L.*&#39;"},{"id":"text-703","heading":"Text","content":"dc"},{"id":"text-704","heading":"Text","content":"Desk Calculator &#8211; an RPN calculator, using arbitrary precision arithmetic and\nuser-specified bases.  Useful for more complex arithmetic expressions than can be performed\ninternally or using expr"},{"id":"text-705","heading":"Text","content":"avant JC"},{"id":"text-706","heading":"Text","content":"A preprocessor for dc    which provides infix notation and a C-like syntax for\nexpressions and functions."},{"id":"text-707","heading":"Text","content":"Merging files"},{"id":"text-708","heading":"Text","content":"coller"},{"id":"text-709","heading":"Text","content":"Merge lines from multiple files into tab-delimited columns."},{"id":"text-710","heading":"Text","content":"joindre"},{"id":"text-711","heading":"Text","content":"Perform a join (in the relational database sense) of lines in two sorted input files."},{"id":"text-712","heading":"Text","content":"(33)"},{"id":"text-713","heading":"Text","content":"The standard man pages for sh    et ksh    are quite complete, but not easy to\nlearn from.  The following is a sampling of the many available books on the subject.  The Bolsky and Korn\nbook might be viewed as the standard &quot;reference&quot;.  The Blinn book is Bourne shell, but everything in it should\nwork for either shell.The links are to publisher&#39;s web sites, or Amazon.com. Some links are also given to the example\nscripts provided with the books.\nLivres"},{"id":"text-714","heading":"Text","content":"The New KornShell Command And Programming Language, by Morris I. Bolsky, David G. Korn (Contributor)."},{"id":"text-715","heading":"Text","content":"Plus d&#39;informations\nLearning the Korn Shell, 2nd Edn. by Bill Rosenblatt and Arnold Robbins."},{"id":"text-716","heading":"Text","content":"Plus d&#39;informations\nKorn Shell Programming by Example, by Dennis O&#39;Brien, David Pitts (Contributor)."},{"id":"text-717","heading":"Text","content":"Plus d&#39;informations\nThe Korn Shell Linux and Unix Programming Manual (2nd Edn) by Anatole Olczak."},{"id":"text-718","heading":"Text","content":"Plus d&#39;informations\nPortable Shell Programming: An Extensive Collection of Bourne Shell Examples by Bruce Blinn."},{"id":"text-719","heading":"Text","content":"Plus d&#39;informationsExamples from this book can be downloaded for study.\nLinux Shell Scripting with Bash by Ken O. Burtch."},{"id":"text-720","heading":"Text","content":"Plus d&#39;informations\nUnix Shell Programming by Stephen Kochan and Patrick Wood (third Edition)."},{"id":"text-721","heading":"Text","content":"Plus d&#39;informations\nTeach yourself Shell Programming in 24 Hours,\nby S. Veeraraghavan. SAMS 2nd Edn. (2002)\nPlus d&#39;informations"},{"id":"text-722","heading":"Text","content":"Mastering Unix Shell Scripting\nby Randal K. Michael, Wiley (2003)\nPlus d&#39;informations\nLight on basics, but develops scripting through examples. Ksh only.\nExamples can be\ntéléchargé\nfrom the Wiley site (www.wiley.com/legacy/compbooks/michael/)."},{"id":"text-723","heading":"Text","content":"Wicked Cool Shell Scripts\nby Dave Taylor, No Starch Press (2004)\nPlus d&#39;informations\nDevelops scripting entirely through examples, drawn from Linux and OSX in addition to traditional Unix.\nRecommended, but not for beginners.\nExamples can be\ntéléchargé\nfrom the Intuitive site (www.intuitive.com/wicked/wicked-cool-shell-script-library.shtml)."},{"id":"text-724","heading":"Text","content":"Unix Power Tools, by S. Powers, J. Peek, T. O&#39;Reilly, M. Loudikes et al."},{"id":"text-725","heading":"Text","content":"Plus d&#39;informations"},{"id":"text-726","heading":"Text","content":"Online Resources"},{"id":"text-727","heading":"Text","content":"Shelldorado (http://www.shelldorado.com)Lots of links to scripting resources"},{"id":"text-728","heading":"Text","content":"Kornshell (http://www.kornshell.com)The official Korn shell home page, with download links."},{"id":"text-729","heading":"Text","content":"Mac OSX Unix tutorial (http://www.osxfaq.com/Tutorials/LearningCenter/)Good resource on advanced use of OSX and Unix shell scripting in general"},{"id":"text-730","heading":"Text","content":"Unix-like shells and utilities for Microsoft Windows"},{"id":"text-731","heading":"Text","content":"U/Win (http://www.research.att.com/sw/tools/uwin/)\nA free port of ksh and Unix command line utilities, plus Windows DLL for Unix compatability. Developed by AT&amp;T Research."},{"id":"text-732","heading":"Text","content":"Cygwin (http://www.cygwin.com/)\nA free Linux-like environment for Windows. Provides bash, command line utilities and DLLs. Developed by RedHat. Un\nX server is also available."},{"id":"text-733","heading":"Text","content":"MKS Toolkit (http://www.mkssoftware.com/)\nA commercial ksh clone and command line utilities, plus DLL for Unix compatability.  An X server is also available."},{"id":"text-734","heading":"Text","content":"Microsoft Services for UNIX (http://www.microsoft.com/windows/sfu/)\nA POSIX environment for Windows, with ksh, csh, command line tools, libraries and software development tools.\nDeveloped by Interix and bought by Microsoft.  Free download."},{"id":"text-735","heading":"Text","content":"Unix shell scripting with ksh/bash: Course Handout[an error occurred while processing this directive]"},{"id":"text-736","heading":"Text","content":"(last update   22 March 2012)  ©Dartmouth College\n    http://www.dartmouth.edu/~rc/classes/ksh"},{"id":"text-737","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":""},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2019/05/03/script-shell-unix-avec-ksh-bash-serveur-dimpression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/05/03/script-shell-unix-avec-ksh-bash-serveur-dimpression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/05/03/script-shell-unix-avec-ksh-bash-serveur-dimpression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}