2011-03-07 4 views
1

J'utilise la variable IFS dans un script shell pour analyser certaines données (les données me sont déjà fournies dans un format donné). Comme l'IFS par défaut est whitespace/tab/etc, j'utilise le caractère '¬' pour délimiter les champs dans les lignes de fichier d'entrée. Les données sont quelque chose commeProblème de variable IFS dans le script avec Unicode

14352345¬AFSFDG1234¬text¬(http://www.google.com,3)(http://www.test.com,2)¬(www.test2.com,4)¬123-23432 

J'ai créé un script qui tuyaux le fichier dans une boucle en utilisant la variable IFS en utilisant:

#!/bin/bash; 
while IFS=¬ read -r sessionId qId testResults realResults queryId; 
do echo $sessionId; done < inputFile 

(dans cette boucle je fais en fait un peu de traitement de awk avec un autre fichier).

Ce qui se passe, c'est que si je lance ce fichier manuellement (juste ./fichier), cela fonctionne parfaitement. Si je l'exécute dans le cadre d'un script (cron) ou dans un autre script, j'obtiens des erreurs d'analyse qui suggèrent que ma variable IFS n'est pas utilisée. J'ai essayé de copier l'ancienne variable IFS et de la réinitialiser après analyse ainsi que différentes façons de passer dans la variable IFS (¬, '¬', $'¬', etc, mais ne semble pas aider).

Tout pointeur/conseil serait grandement apprécié.


Mise à jour: Après un certain débogage supplémentaire, se révèle le problème est avec l'énoncé de awk plutôt que le séparateur

Répondre

5

Vous êtes soit un problème avec Unicode, ou avec le shell que vous essayez de utiliser, le premier étant plus probable. Le caractère que vous avez choisi comme séparateur (¬) est en dehors de l'ensemble ASCII, et peut être (généralement) représenté de deux manières différentes par un ordinateur: Soit il sera codé comme latin1 ou similaire, où le personnage occupe un octet, ou il sera codé en UTF-8 et utilisera deux octets. Il y a d'autres possibilités, mais ces deux sont les plus probables, alors supportez-moi.

Si vous avez enregistré votre script codé en UTF-8 et que vous essayez de l'exécuter dans un environnement local non-unicode, le shell recevra deux (mauvais) caractères comme séparateur au lieu d'un. Pour tester cela, essayez d'utiliser un caractère ASCII comme séparateur, par exemple ~. Si vous constatez que l'utilisation de ~ fonctionne correctement, vous devez vérifier la configuration globale de votre système et vous assurer que les paramètres régionaux sont les mêmes dans l'environnement que vous avez utilisé pour créer votre script. dans l'environnement où le script s'exécute. Vous pouvez le faire en exécutant la commande locale. Vous pouvez créer un script qui exécute cette commande et stocke sa sortie dans un fichier:

#!/bin/sh 
locale > /tmp/locale-env 

Ensuite, vous faites courir à partir Cron, par exemple, et jeter un oeil au fichier /tmp/locale-env. Comparez son contenu avec la sortie de locale lorsque vous l'exécutez à partir de votre shell interactif. Selon votre distribution, vous pouvez définir vos paramètres régionaux globaux dans /etc/environment, /etc/profile ou un autre emplacement. Vous voudrez peut-être aller l'ensemble du système UTF-8:

LANG=en_US.UTF-8 
export LANG 

C'est un piège que nous les utilisateurs internationaux ont tendance à connaître mieux que les anglophones, puisque ASCII et UTF-8 est exactement la même chose pour les caractères anglais, et ces problèmes passent inaperçus le plus souvent.

+1

Merci pour cela.J'ai en fait pris votre suggestion différemment et utilisé des délimiteurs non-unicode! – DOS