O que jimmij disse. Seu último exemplo é o mais próximo que você pode chegar do que está tentando em sua expressão canalizada.
Aqui está uma variante desse tema:
echo 'hello world'|echo $(read s;s=${s^^};echo ${s// /_})
Eu estaria inclinado a usar tr
, pois é bastante rápido.
echo 'hello world'|tr ' [:lower:]' '_[:upper:]'
Acho que é uma pena que o bash não permita a expansão de parâmetros aninhados; OTOH, o uso de tais expressões aninhadas pode facilmente levar a códigos que são difíceis de ler. A menos que você realmente precise que as coisas sejam executadas o mais rápido possível, é melhor escrever um código que seja fácil de ler, entender e manter, em vez de um código inteligente que depure. E se você realmente fizer precisar que as coisas sejam feitas em alta velocidade, você deve usar código compilado, não um script.