Come posso ottenere $ (/ bin / printf -6) per restituire -6 e non pensare che -6 sia un'opzione
Domanda
Ho uno script bash shell che ha la linea:
g=$(/bin/printf ${i})
quando $ {i}
contiene qualcosa come -6
, printf
pensa che gli sia stata passata un'opzione. Non riconosce l'opzione, quindi produce un errore.
se racchiudi $ {i}
tra virgolette, printf
pensa ancora che gli sia stata passata un'opzione.
g=$(/bin/printf "${i}")
se sfuggo alle virgolette, la variabile $ g
contiene quindi " -6
" che non è nemmeno quello che voglio.
g=$(/bin/printf \"${i}\")
È lì per sfuggire al trattino (-).
printf è un'app BusyBox
Soluzione
Che cosa succede se si chiama printf
con una stringa di formato effettiva?
$ printf "%d\n" -6
-6
$ /sbin/busybox printf "%d\n" -6
-6
$
Funziona sia con GNU coreutils 'che busybox' printf, apparentemente.
Altri suggerimenti
La maggior parte dei programmi GNU supporta l'utilizzo di -
come delimitatore per dire al programma che tutti gli altri argomenti non sono opzioni. Ad esempio
$ printf -- -6
-6
Dovresti usare
printf -- -6
Se si alimenta un argomento non numerico in questo modo, viene visualizzato un messaggio di errore:
$ busybox printf "%d" "a"
a: conversion error
-1
Ma puoi usare % s
e funzionerà per argomenti sia numerici che non numerici (purché non sia necessario eseguire alcuna formattazione):
$ busybox printf "%s" "a"
a
$ busybox printf "%s" -6
-6
Se non stai utilizzando le funzionalità di formattazione di printf
e devi generare il valore senza una nuova riga, il comando echo
di busybox supporta -n
:
$ busybox echo -n "a"
a
$ busybox echo -n -6
-6