export LC_ALL=en_US.UTF-8 a=$'\303\251' echo "$a" echo ${#a} b=$'A\303\251B' echo "$b" echo ${b: -1} c=AeB echo ${c: -1} unset a a=$(printf '%b' 'A\303\251B') IFS=$(printf '%b' '\303\251') case "$a" in "A${IFS}B") echo ok 1 ;; *) echo bad 1 ;; esac set $a case $1 in A) echo ok 2 ;; *) echo bad 2 ;; esac set a b printf '%s\n' "$*" # squeeze out blanks to avoid white space differences in od implementations printf '%s' "$*" | od -b | ( IFS=$' \t\n' ; while read line; do echo $line; done; ) # display differences make this problematic ${THIS_SH} ./intl1.sub # this tests both international handling in printf and temporary environments ${THIS_SH} ./intl2.sub