Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to iterate through all ASCII characters in Bash?

Tags:

linux

bash

ascii

I know how to iterate through alphabets:

for c in {a..z}; do ...; done

But I can't figure out how to iterate through all ASCII characters. Does anyone know how?

like image 667
Shamdor Avatar asked Oct 29 '12 18:10

Shamdor


2 Answers

What you can do is to iterate from 0 to 127 and then convert the decimal value to its ASCII value(or back).

You can use these functions to do it:

# POSIX
# chr() - converts decimal value to its ASCII character representation
# ord() - converts ASCII character to its decimal value

chr() {
  [ ${1} -lt 256 ] || return 1
  printf \\$(printf '%03o' $1)
}

# Another version doing the octal conversion with arithmetic
# faster as it avoids a subshell
chr () {
  [ ${1} -lt 256 ] || return 1
  printf \\$(($1/64*100+$1%64/8*10+$1%8))
}

# Another version using a temporary variable to avoid subshell.
# This one requires bash 3.1.
chr() {
  local tmp
  [ ${1} -lt 256 ] || return 1
  printf -v tmp '%03o' "$1"
  printf \\"$tmp"
}

ord() {
  LC_CTYPE=C printf '%d' "'$1"
}

# hex() - converts ASCII character to a hexadecimal value
# unhex() - converts a hexadecimal value to an ASCII character

hex() {
   LC_CTYPE=C printf '%x' "'$1"
}

unhex() {
   printf \\x"$1"
}

# examples:

chr $(ord A)    # -> A
ord $(chr 65)   # -> 65
like image 155
Milan Avatar answered Oct 31 '22 23:10

Milan


A possibility using only echos octal escape sequences:

for n in {0..7}{0..7}{0..7}; do echo -ne "\\0$n"; done
like image 5
mata Avatar answered Oct 31 '22 23:10

mata