nhận giá trị ASCII số cho một ký tự


10

Tôi đang cố gắng viết một tập lệnh shell yêu cầu một ký tự ASCII trong phạm vi AZ hoặc az và trả về giá trị số tương đương của nó. Ví dụ: đầu ra có thể trông như sau:

scarlet$ Please type a character between A and Z or between a and z:
scarlet$ A       
scarlet$ The decimal value of A is: 65 

Nỗ lực của tôi:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "

Tôi đã chỉnh sửa câu hỏi thứ hai của bạn vì nó không liên quan; bạn nên đăng nó một cách riêng biệt (bạn có thể lấy văn bản gốc ở đây )
Michael Mrozek

Ví dụ của bạn làm việc cho tôi. Bạn có thể dán đầu ra cho thấy những gì xảy ra và mô tả lỗi là gì? Có echo -n Alàm những gì bạn mong đợi? Nếu không, hãy thử printfthay thế. Có od -ilàm những gì bạn mong đợi? Nếu không, hãy thử od -t d1.
Mikel

1
Tôi đã thử od -t d1 hoạt động rất tốt ... Cảm ơn
Host Post

Câu trả lời:


8

POSIX: printf a | od -A n -t d1

Perl: perl -e 'print ord($ARGV[0])' a

Perl, đối phó với UTF-8 nếu ở địa phương UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ


8

POSIX:

$ printf %d\\n \'a
97

Nó cũng hoạt động với các ký tự không phải ASCII trong bash 4.0 trở lên và trong zsh:

$ printf %x\\n \'あ
3042

Bạn cũng có thể sử dụng recode ..dumpđể xem các điểm mã thập lục phân:

$ printf aあ|recode ..dump
UCS2   Mne   Description

0061   a     latin small letter a
3042   a5    hiragana letter a

2
Để làm cho nó bớt "tối nghĩa" hơn một chút, người ta cũng có thể sử dụng ví dụ A=a ; printf '%d\n' "'$A'"và trên ksh một cái gì đó như A=a; integer N=$(("'$A'")); print $N(in hoặc printf là không cần thiết).
jelmd

3

Có lẽ:

#!/bin/bash

echo -n "Enter a letter:"
read A
echo ${A}|od -t d1|awk '{printf "%s",$2}';echo

Chúc mừng


Tôi sẽ chỉ sử dụng awk, chứ không phải nawk. Đây là tiêu chuẩn khá cho bất kỳ phiên bản awk.
asoundmove

Đã chỉnh sửa, là thói quen của tôi khi sử dụng 'nawk' vì tôi chưa
tỉnh táo

vâng, giải pháp của bạn cũng có hiệu quả với tôi .. cảm ơn
Host Post

1

Một giải pháp ít mùi, chỉ cần bash, và chỉ chữ thường, cho đến nay. zlà nhân vật được tìm kiếm, ở đây slà tìm kiếm. i=97vì ascii (a) = 97. Phần còn lại là rõ ràng.

z=s 
i=97
for c in {a..z}
do 
    [ "$c" = "$z" ] && echo $i && break || ((i+=1))
done

Bạn có thể đặt nó vào một dòng duy nhất của khóa học. Dưới đây là một số semmicolon: ;;;;;(nên là đủ)


Tôi đã kiểm tra mã trên .. nhưng nó không hoạt động với tôi .. Tôi nhận được một thông báo nói rằng "i + = 1" không được tìm thấy!
Bài đăng trên máy chủ

Điều này hoạt động trong bash. Bạn có thể cần i = $ ((i + 1)) thay thế.
người dùng không xác định

Trong một dòng và với việc đọc một phím từ bàn phím:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik

0

Hãy thử od -t d1nếu bạn có nó. Các định dạng đầu ra khác là khá kỳ lạ.

Bạn cũng không cần đầu và cắt, ví dụ:

printf "A" | od -t d1 | read addr num && echo $num

0

Nếu bạn chỉ muốn một chương trình thực hiện điều này và bạn không thực hiện điều này như một bài tập thì có một chương trình được gọi là asciithực hiện điều này. Bản phân phối của bạn có thể cung cấp gói dưới dạng gói, nếu không nhận được từ http://www.catb.org/~esr/ascii/ .


0
# Get one character per loop, until the user presses <Enter>
while true ; do 
    read -n 1 c
    (( ${#c} == 0 )) && break # Exit the loop. Input length is 0  
                              # ie. The user has pressed Enter
    #
    if [   \( ! "$c" \< "a" -a  ! "$c" \> "z" \) \
        -o \( ! "$c" \< "A" -a  ! "$c" \> "Z" \) ]
    then
        val=($(ascii -s $c)) # build an array of ascii info for this char 
        echo " ... The decimal value of $c is: ${val[1]}"
    else
        echo -n  $'\r \r' # overwrite the invalid character
    fi 
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.