Comment puis-je obtenir la valeur ASCII de l'alphabet?
Par exemple, 97
pour a
?
bash
bash-script
ascii
Xmpirate
la source
la source
"'A"
est correcte alors que si vous utilisez"A"
ce dira:A: invalid number
. Il semble que cela soit fait du côté de printf (c’est-à-dire que, dans le shell, il"'A"
y a bien 2 caractères, a'
et aA
. Ceux-ci sont passés à printf. Et dans le contexte de printf, il est converti en valeur ascii de A, en décimal grâce à l ''%d'
. Utilisez - le'Ox%x'
pour l' afficher en hexa ou'0%o'
pour l 'avoir en octal))printf "\\$(printf '%03o' "$1")"
,'%03o'
,LC_CTYPE=C
et la citation unique"'$1"
do?Vous pouvez voir l'ensemble avec:
Vous obtiendrez des tableaux en octal, hex et décimal.
la source
Si vous souhaitez l'étendre aux caractères UTF-8:
Avec
bash
,ksh
ouzsh
intégré:la source
iceweasel
surDebian sid
. La police a confirmé que par la console Web de Iceweasel est "Sans DejaVu" et j'ai TTF-dejavu TTF-dejavu-core packages supplémentaires TTF-dejavu installés qui viennent de Debian avec en amont à dejavu-fonts.orgctbl()
semble me permettre de l' afficher correctement, et de couper l'omble chevalier de la tête d'une chaîne avecprintf
, mais il met4*((o1=360)>=(d1=240)|(o2=237)>=(d2=159)|(o3=230)>=(d3=152)|(o4=210)>=(d4=136))
en$OPTARG
pour les valeurs d'octets.Ça marche bien,
exactement équivalent à:
la source
echo -n
supprime le retour à la ligne, éliminant ainsi le besoin detr -d "\n"
echo
, pas en échos compatibles Unix par exemple.printf %s A
serait le portable.Je vais pour la solution simple (et élégante?) Bash:
Dans un script, vous pouvez utiliser les éléments suivants:
Notez le guillemet simple avant CharValue. C'est obligé ...
la source
printf "%d"
.Le premier
ctbl()
- au sommet là-bas - ne court jamais qu'une seule fois. Il génère la sortie suivante (qui a été filtrée à dessed -n l
fins d’imprimabilité) :... qui sont tous des octets de 8 bits (moins
NUL
) , divisés en quatre chaînes citées par le shell, divisées de manière égale à des limites de 64 octets. Les chaînes peuvent être représentées avec des gammes octal aiment\200\1-\77
,\100-\177
,\200-\277
,\300-\377
où l' octet 128 est utilisé comme lieu porte pourNUL
.Le but premier de
ctbl()
la première existence est de générer ces chaînes de manière àeval
pouvoir définir la secondectbl()
fonction avec elles incorporées littéralement par la suite. De cette manière, ils peuvent être référencés dans la fonction sans avoir à les générer à chaque fois que nécessaire. Quandeval
définit-on la deuxièmectbl()
fonction, la première cessera d'être.La moitié supérieure de la seconde
ctbl()
fonction est principalement auxiliaire ici - elle est conçue pour sérialiser de manière portable et en toute sécurité tout état de coque actuel qu'il pourrait affecter lors de son appel. La boucle supérieure citera les guillemets dans les valeurs des variables qu’elle voudra utiliser, puis empilera tous les résultats dans ses paramètres de position.Les deux premières lignes, cependant, retournent immédiatement immédiatement 0 et sont
$OPTARG
identiques si le premier argument de la fonction ne contient pas au moins un caractère. Et si tel est le cas, la deuxième ligne tronque immédiatement son premier argument en son premier caractère uniquement, car la fonction ne traite qu'un caractère à la fois. Il est important de noter que cela se produit dans le contexte local actuel, ce qui signifie que si un caractère peut comprendre plus d’un octet, le shell supportera correctement les caractères multi-octets, il ne supprimera aucun octet, à l’exception de ceux qui ne figurent pas dans la liste. premier caractère de son premier argument.Il effectue ensuite la boucle de sauvegarde si nécessaire, puis redéfinit le contexte local en cours en fonction du paramètre régional C pour chaque catégorie en lui affectant une
LC_ALL
variable. À partir de ce moment, un caractère ne peut être composé que d'un seul octet. Par conséquent, s'il y avait plusieurs octets dans le premier caractère de son premier argument, il devrait désormais s'agir chacun d'adresses adressables comme des caractères individuels à part entière.C'est pour cette raison que la seconde moitié de la fonction est une
while
boucle , par opposition à une séquence à exécution unique. Dans la plupart des cas, il ne sera probablement exécuté qu'une seule fois par appel, mais si le shell dans lequelctbl()
est défini correctement gère les caractères multi-octets, il risque de se répéter.Notez que la
$(ctbl)
substitution de commande ci-dessus n'est évaluée qu'une seule fois -eval
lorsque la fonction est définie pour la première fois - et que ce jeton est remplacé pour toujours par la sortie littérale de cette substitution de commande, telle qu'elle est enregistrée dans la mémoire du shell. Il en va de même pour lescase
substitutions de commande de deux motifs. Cette fonction n'appelle jamais un sous-shell ou une autre commande. Il ne tentera jamais non plus de lire ou d’écrire des entrées / sorties (sauf dans le cas d’un message de diagnostic du shell - qui indique probablement un bogue) .Notez également que le test de la continuité de la boucle n’est pas simplement
[ -n "$a" ]
, car, comme j’ai trouvé ma frustration, pour une raison quelconque, unbash
shell ne:... et je compare donc explicitement
$a
len à 0 pour chaque itération, ce qui, de manière inexplicable, se comporte différemment (lire: correctement) .Le
case
vérifie si le premier octet est inclus dans l’une de nos quatre chaînes et stocke une référence à l’octet défini dans$b
. Ensuite, les quatre premiers paramètres de position du shellset
concernent les chaînes incorporéeseval
et écrites parctbl()
le prédécesseur de.Ensuite, tout ce qui reste du premier argument est de nouveau temporairement tronqué au premier caractère - qui devrait maintenant être assuré d'être un simple octet. Ce premier octet est utilisé comme référence pour extraire la fin de la chaîne à laquelle il correspond et que la référence
$b
esteval
'd pour représenter un paramètre de position afin que tout, de l'octet de référence au dernier octet de la chaîne, puisse être remplacé. Les trois autres chaînes sont entièrement supprimées des paramètres de position.À ce stade, la valeur de l'octet (modulo 64) peut être référencée comme len de la chaîne:
Un peu de calcul est ensuite effectué pour réconcilier le module en fonction de la valeur entrée
$b
, le premier octet entré$a
est supprimé de façon permanente et la sortie du cycle en cours est ajoutée à une pile en attente d’achèvement avant que la boucle ne soit recyclée pour vérifier si elle$a
est réellement vide.Lorsqu'il
$a
est définitivement vide, tous les noms et tous les états, à l'exception de ce$OPTARG
que la fonction affectée tout au long de son exécution, sont restaurés à leur état précédent (qu'ils soient définis et non nuls, définis et nuls ou non définis) et la sortie est enregistrée. pour$OPTARG
que la fonction retourne. La valeur de retour réelle est inférieure au nombre total d'octets dans le premier caractère de son premier argument - ainsi, tout caractère sur un octet renvoie zéro et tout caractère multi-octets renverra plus que zéro - et son format de sortie est un peu étrange.La valeur
ctbl()
sauve à$OPTARG
un shell valide expression arithmétique que, si une évaluation, seront les noms de variables mis en même temps que des formes$o1
,$d1
,$o2
,$d2
à valeurs décimales et octal de tous les octets respectifs dans le premier caractère de son premier argument, mais finalement évaluer au total nombre d'octets dans son premier argument. J'avais un type de flux de travail spécifique à l'esprit lorsque j'ai écrit ceci, et je pense qu'une démonstration est peut-être nécessaire.Je trouve souvent une raison de séparer une chaîne de caractères avec
getopts
:Je fais probablement un peu plus que simplement imprimer un caractère par ligne, mais tout est possible. Dans tous les cas, je ne l' ai pas encore trouvé
getopts
qui bien faire (grève -dash
« est legetopts
fait carboniser par char, maisbash
ne certainement pas) :D'accord. Alors j'ai essayé ...
Ce type de flux de travail - l'octet pour octet / caractère pour caractère de caractère - est celui dans lequel je m'engage souvent lorsque je fais des choses difficiles. Au début de la saisie, vous devez connaître les valeurs des caractères dès que vous les lisez et leur taille (en particulier lors du comptage de colonnes) , ainsi que des caractères entiers .
Et maintenant j'ai
ctbl()
:Notez que
ctbl()
cela ne définit pas réellement les$[od][12...]
variables - cela n’a aucun effet durable sur un état, mais$OPTARG
- mais ne met que la chaîne$OPTARG
qui peut être utilisée pour les définir - c’est ainsi que je récupère la deuxième copie de chaque caractère ci-dessusprintf "\\$o1\\$o2"
parce que ils sont définis chaque fois que j'évalue$(($OPTARG))
. Mais là où je le fais je déclare également un modificateur de longueur du champ àprintf
l »%s
format argument de chaîne, et parce que l'expression évalue toujours au nombre total d'octets dans un caractère, je reçois tout le caractère de la sortie quand je fais:la source
[ "$(printf \\1)" ]|| ! echo but its not null!
attendant , veuillez vous reporter à la question , n'hésitez pas à mieux vous familiariser avec la pratique des commentaires significatifs, à moins que vous ne recommandiez un tel concours ...?sh
langage de commande POSIX .bash
est encore une fois un élément suprême de la même chose, et en grande partie un facteur de motivation précipité pour la plupart des soins apportés ci-dessus à des tailles de caractère largement portables, expansibles et honorables en espace de nommage de toute sorte.bash
devrait en gérer une grande partie déjà, mais lec
langageprintf
était, et est peut-être, déficient de la capacité fournie ci-dessus.Pas un script shell, mais fonctionne
Échantillon de sortie
la source
konsole
xxd<press enter>
<SHIFT+INSERT><CTRL+D>
vous obtenez quelque chose comme:
vous connaissez le symbole que vous avez collé a un code hexadécimal
0xfb
la source