Se você executar o comando como sh ip.sh , ele será executado usando sh , não com bash (tornando a linha shebang sem sentido). Ou execute-o com bash:
bash ip.sh
Ou torne-o executável e execute-o diretamente:
./ip.sh
O shell Bourne tradicional ( sh ) não suporta a palavra-chave function para definição de função .
Além disso, "echo $IP | grep -o ." não executa esse comando, simplesmente é essa cadeia. Você precisa fazer:
for i in $(echo $IP | grep -o .)
Pode ser mais fácil ler em um caractere por vez:
hostname -I | while read -n1 i
do
hx=$(hex $i)
i2cset -y 1 0x3e 0x40 $hx
done