Come posso ottenere $ (/ bin / printf -6) per restituire -6 e non pensare che -6 sia un'opzione

StackOverflow https://stackoverflow.com/questions/1614028

  •  06-07-2019
  •  | 
  •  

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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top