> 
> hobbit:~$ var='garçon'
> hobbit:~$ echo "${var^^}"
> GARÇON
> 
But, UTF-8 is a kind of nightmare:

  var1=$'gar\303\247on'
  var2=$'garc\314\247on'
  printf '%q\n' "$var1" "$var2"
  garçon
  garçon

(nfd vs nfc) https://en.wikipedia.org/wiki/Unicode_equivalence

Trying to upper all letter from A to F:
  printf '%s\n' "${var1^^[a-f]}" "${var2^^[a-f]}"
  gArçon
  gArÇon

You have to do something counterintuitive like:

  printf '%s\n' "${var1^^[^g-z]}" "${var2^^[^g-z]}"
  gArÇon
  gArÇon

If you want to upper 1st alphanumeric character, you could
build a little function (using `shopt -s extglob`), like:

  up1stAlpha() {
    local tmp; local -n var=$1
    printf -v tmp '\%o' {32..64} {91..96} {123..127}
    printf -v tmp '%b' "$tmp"
    tmp=${var/#*([$tmp])}
    var=${var%$tmp}${tmp^}
  }

This could upgrade both:

  var1=$'./1234/\303\247a marche.'
  var2=$'./1234/c\314\247a marche.'
  up1stAlpha var1
  up1stAlpha var2
  printf '%s\n' "$var1" "$var2"
  ./1234/Ça marche.
  ./1234/Ça marche.

So you could obtain two different entries with same name, in same directory:

  mkdir -p "${var1}" "${var2}"
  ls -dig 1234/*
  1572965 drwxr-xr-x 2 user 4096 18 jan 12:13 '1234/Ça marche.'
  1572964 drwxr-xr-x 2 user 4096 18 jan 12:13 '1234/Ça marche.'

-- 
 Félix Hauri  -  <fe...@f-hauri.ch>  -  http://www.f-hauri.ch

Reply via email to