Search code examples
linuxbashascii

How to iterate through all ASCII characters in Bash?


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?


Solution

  • 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