How do I get $(/bin/printf -6) to return -6 and not think -6 is an option

心不动则不痛 提交于 2019-12-01 18:40:04

问题


I have a bash shell script which has the line:

g=$(/bin/printf ${i})

when ${i} contains something like -6, printf thinks its being passed an option. It does not recognize the option so produces an error.

if wrap ${i} in quotes, printf still thinks its being passed an option.

g=$(/bin/printf "${i}")

if I escape the quotes, variable $g then holds "-6" which is not what I want either.

g=$(/bin/printf \"${i}\") 

Is there away to escape the dash (-).

printf is a BusyBox app


回答1:


What if you called printf with an actual format string?

$ printf "%d\n" -6
-6
$ /sbin/busybox printf "%d\n" -6
-6
$

This works with both GNU coreutils' and busybox' printf, apparently.




回答2:


Most GNU programs support using -- as a delimiter to tell the program that all further arguments are not options. For instance

$ printf -- -6
-6



回答3:


You should use

printf -- -6



回答4:


If you feed a non-numeric argument in this way, you get an error message:

$ busybox printf "%d" "a"
a: conversion error
-1

But you can use %s and it will work for both numeric and non-numeric arguments (as long as you don't need to do any formatting):

$ busybox printf "%s" "a"
a
$ busybox printf "%s" -6
-6

If you're not using the formatting features of printf and you need to output the value without a newline, busybox's echo command supports -n:

$ busybox echo -n "a"
a
$ busybox echo -n -6
-6


来源:https://stackoverflow.com/questions/1614028/how-do-i-get-bin-printf-6-to-return-6-and-not-think-6-is-an-option

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!