Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 1 | LC_ALL=C |
Jari Aalto | bb70624 | 2000-03-17 21:46:59 +0000 | [diff] [blame] | 2 | LC_NUMERIC=C |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 3 | |
| 4 | # these should output error messages -- the format is required |
| 5 | printf |
| 6 | printf -- |
| 7 | |
| 8 | # these should output nothing |
| 9 | printf "" |
| 10 | printf -- "" |
| 11 | |
Jari Aalto | 95732b4 | 2005-12-07 14:08:12 +0000 | [diff] [blame] | 12 | # in the future this may mean to put the output into VAR, but for |
| 13 | # now it is an error |
| 14 | # 2005-03-15 no longer an error |
| 15 | unset var |
| 16 | printf -v var "%10d" $RANDOM |
| 17 | echo ${#var} |
| 18 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 19 | # this should expand escape sequences in the format string, nothing else |
| 20 | printf "\tone\n" |
| 21 | |
| 22 | # this should not cut off output after the \c |
| 23 | printf "one\ctwo\n" |
| 24 | |
| 25 | # and unrecognized backslash escapes should have the backslash preserverd |
| 26 | printf "4\.2\n" |
| 27 | |
| 28 | printf "no newline " ; printf "now newline\n" |
| 29 | |
| 30 | # %% -> % |
| 31 | printf "%%\n" |
| 32 | |
Jari Aalto | bb70624 | 2000-03-17 21:46:59 +0000 | [diff] [blame] | 33 | # this was a bug caused by pre-processing the string for backslash escapes |
| 34 | # before doing the `%' format processing -- all versions before bash-2.04 |
| 35 | printf "\045" ; echo |
| 36 | printf "\045d\n" |
| 37 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 38 | # simple character output |
| 39 | printf "%c\n" ABCD |
| 40 | |
| 41 | # test simple string output |
| 42 | printf "%s\n" unquoted |
| 43 | |
| 44 | # test quoted string output |
| 45 | printf "%s %q\n" unquoted quoted |
| 46 | printf "%s%10q\n" unquoted quoted |
| 47 | |
| 48 | printf "%q\n" 'this&that' |
| 49 | |
| 50 | # make sure the format string is reused to use up arguments |
| 51 | printf "%d " 1 2 3 4 5; printf "\n" |
| 52 | |
| 53 | # make sure that extra format characters get null arguments |
| 54 | printf "%s %d %d %d\n" onestring |
| 55 | |
| 56 | printf "%s %d %u %4.2f\n" onestring |
| 57 | |
| 58 | printf -- "--%s %s--\n" 4.2 '' |
| 59 | printf -- "--%s %s--\n" 4.2 |
| 60 | |
| 61 | # test %b escapes |
| 62 | |
| 63 | # 8 is a non-octal digit, so the `81' should be output |
| 64 | printf -- "--%b--\n" '\n\081' |
| 65 | |
| 66 | printf -- "--%b--\n" '\t\0101' |
| 67 | printf -- "--%b--\n" '\t\101' |
| 68 | |
| 69 | # these should all display `A7' |
Jari Aalto | 0628567 | 2006-10-10 14:15:34 +0000 | [diff] [blame] | 70 | echo -e "\01017" |
Jari Aalto | f73dda0 | 2001-11-13 17:56:06 +0000 | [diff] [blame] | 71 | echo -e "\x417" |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 72 | |
| 73 | printf "%b\n" '\01017' |
| 74 | printf "%b\n" '\1017' |
Jari Aalto | f73dda0 | 2001-11-13 17:56:06 +0000 | [diff] [blame] | 75 | printf "%b\n" '\x417' |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 76 | |
| 77 | printf -- "--%b--\n" '\"abcd\"' |
| 78 | printf -- "--%b--\n" "\'abcd\'" |
| 79 | |
| 80 | printf -- "--%b--\n" 'a\\x' |
| 81 | |
| 82 | printf -- "--%b--\n" '\x' |
| 83 | |
| 84 | Z1=$(printf -- "%b\n" '\a\b\e\f\r\v') |
| 85 | Z2=$'\a\b\e\f\r\v' |
| 86 | |
| 87 | if [ "$Z1" != "$Z2" ]; then |
| 88 | echo "whoops: printf %b and $'' differ" >&2 |
| 89 | fi |
| 90 | unset Z1 Z2 |
| 91 | |
| 92 | printf -- "--%b--\n" '' |
| 93 | printf -- "--%b--\n" |
| 94 | |
| 95 | # the stuff following the \c should be ignored, as well as the rest |
| 96 | # of the format string |
| 97 | printf -- "--%b--\n" '4.2\c5.4\n'; printf "\n" |
| 98 | |
Jari Aalto | bb70624 | 2000-03-17 21:46:59 +0000 | [diff] [blame] | 99 | # unrecognized escape sequences should by displayed unchanged |
| 100 | printf -- "--%b--\n" '4\.2' |
| 101 | |
| 102 | # a bare \ should not be processed as an escape sequence |
| 103 | printf -- "--%b--\n" '\' |
| 104 | |
Jari Aalto | b72432f | 1999-02-19 17:11:39 +0000 | [diff] [blame] | 105 | # make sure extra arguments are ignored if the format string doesn't |
| 106 | # actually use them |
| 107 | printf "\n" 4.4 BSD |
| 108 | printf " " 4.4 BSD ; printf "\n" |
| 109 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 110 | # make sure that a fieldwidth and precision of `*' are handled right |
| 111 | printf "%10.8s\n" 4.4BSD |
| 112 | printf "%*.*s\n" 10 8 4.4BSD |
| 113 | |
| 114 | printf "%10.8q\n" 4.4BSD |
| 115 | printf "%*.*q\n" 10 8 4.4BSD |
| 116 | |
| 117 | printf "%6b\n" 4.4BSD |
| 118 | printf "%*b\n" 6 4.4BSD |
| 119 | |
| 120 | # we handle this crap with homemade code in printf.def |
| 121 | printf "%10b\n" 4.4BSD |
| 122 | printf -- "--%-10b--\n" 4.4BSD |
| 123 | printf "%4.2b\n" 4.4BSD |
| 124 | printf "%.3b\n" 4.4BSD |
| 125 | printf -- "--%-8b--\n" 4.4BSD |
| 126 | |
| 127 | # test numeric conversions -- these four lines should echo identically |
| 128 | printf "%d %u %i 0%o 0x%x 0x%X\n" 255 255 255 255 255 255 |
| 129 | printf "%d %u %i %#o %#x %#X\n" 255 255 255 255 255 255 |
| 130 | |
| 131 | printf "%ld %lu %li 0%o 0x%x 0x%X\n" 255 255 255 255 255 255 |
| 132 | printf "%ld %lu %li %#o %#x %#X\n" 255 255 255 255 255 255 |
| 133 | |
| 134 | printf "%10d\n" 42 |
| 135 | printf "%10d\n" -42 |
| 136 | |
| 137 | printf "%*d\n" 10 42 |
| 138 | printf "%*d\n" 10 -42 |
| 139 | |
| 140 | # test some simple floating point formats |
| 141 | printf "%4.2f\n" 4.2 |
| 142 | printf "%#4.2f\n" 4.2 |
| 143 | printf "%#4.1f\n" 4.2 |
| 144 | |
| 145 | printf "%*.*f\n" 4 2 4.2 |
| 146 | printf "%#*.*f\n" 4 2 4.2 |
| 147 | printf "%#*.*f\n" 4 1 4.2 |
| 148 | |
| 149 | printf "%E\n" 4.2 |
| 150 | printf "%e\n" 4.2 |
| 151 | printf "%6.1E\n" 4.2 |
| 152 | printf "%6.1e\n" 4.2 |
| 153 | |
| 154 | printf "%G\n" 4.2 |
| 155 | printf "%g\n" 4.2 |
| 156 | printf "%6.2G\n" 4.2 |
| 157 | printf "%6.2g\n" 4.2 |
| 158 | |
| 159 | # test some of the more esoteric features of POSIX.1 printf |
| 160 | printf "%d\n" "'string'" |
| 161 | printf "%d\n" '"string"' |
| 162 | |
| 163 | printf "%#o\n" "'string'" |
| 164 | printf "%#o\n" '"string"' |
| 165 | |
| 166 | printf "%#x\n" "'string'" |
| 167 | printf "%#X\n" '"string"' |
| 168 | |
| 169 | printf "%6.2f\n" "'string'" |
| 170 | printf "%6.2f\n" '"string"' |
| 171 | |
| 172 | # output from these two lines had better be the same |
| 173 | printf -- "--%6.4s--\n" abcdefghijklmnopqrstuvwxyz |
| 174 | printf -- "--%6.4b--\n" abcdefghijklmnopqrstuvwxyz |
| 175 | |
| 176 | # and these two also |
| 177 | printf -- "--%12.10s--\n" abcdefghijklmnopqrstuvwxyz |
| 178 | printf -- "--%12.10b--\n" abcdefghijklmnopqrstuvwxyz |
| 179 | |
Jari Aalto | bb70624 | 2000-03-17 21:46:59 +0000 | [diff] [blame] | 180 | # tests for translating \' to ' and \\ to \ |
| 181 | # printf translates \' to ' in the format string... |
| 182 | printf "\'abcd\'\n" |
| 183 | |
| 184 | # but not when the %b format specification is used |
| 185 | printf "%b\n" \\\'abcd\\\' |
| 186 | |
| 187 | # but both translate \\ to \ |
| 188 | printf '\\abcd\\\n' |
| 189 | printf "%b\n" '\\abcd\\' |
| 190 | |
| 191 | # this was reported as a bug in bash-2.03 |
| 192 | # these three lines should all echo `26' |
| 193 | printf "%d\n" 0x1a |
| 194 | printf "%d\n" 032 |
| 195 | printf "%d\n" 26 |
| 196 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 197 | # error messages |
| 198 | |
| 199 | # this should be an overflow, but error messages vary between systems |
| 200 | # printf "%lu\n" 4294967296 |
| 201 | |
| 202 | # ...but we cannot use this because some systems (SunOS4, for example), |
| 203 | # happily ignore overflow conditions in strtol(3) |
| 204 | #printf "%ld\n" 4294967296 |
| 205 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 206 | printf "%10" |
| 207 | printf "ab%Mcd\n" |
| 208 | |
| 209 | # this caused an infinite loop in older versions of printf |
| 210 | printf "%y" 0 |
| 211 | |
Jari Aalto | f73dda0 | 2001-11-13 17:56:06 +0000 | [diff] [blame] | 212 | # these should print a warning and `0', according to POSIX.2 |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 213 | printf "%d\n" GNU |
| 214 | printf "%o\n" GNU |
Jari Aalto | f73dda0 | 2001-11-13 17:56:06 +0000 | [diff] [blame] | 215 | |
| 216 | # failures in all bash versions through bash-2.05 |
| 217 | printf "%.0s" foo |
| 218 | printf "%.*s" 0 foo |
| 219 | |
| 220 | printf '%.0b-%.0s\n' foo bar |
| 221 | printf '(%*b)(%*s)\n' -4 foo -4 bar |
| 222 | |
| 223 | format='%'`printf '%0100384d' 0`'d\n' |
| 224 | printf $format 0 |
| 225 | |
Jari Aalto | 95732b4 | 2005-12-07 14:08:12 +0000 | [diff] [blame] | 226 | # failures in all bash versions through bash-3.0 - undercounted characters |
| 227 | unset vv |
| 228 | printf " %s %s %s \n%n" ab cd ef vv |
| 229 | echo "$vv" |
| 230 | |
Jari Aalto | f73dda0 | 2001-11-13 17:56:06 +0000 | [diff] [blame] | 231 | # this doesn't work with printf(3) on all systems |
| 232 | #printf "%'s\n" foo |
Jari Aalto | b80f644 | 2004-07-27 13:29:18 +0000 | [diff] [blame] | 233 | |
| 234 | # test cases from an austin-group list discussion |
| 235 | # prints ^G as an extension |
| 236 | printf '%b\n' '\7' |
| 237 | |
| 238 | # prints ^G |
| 239 | printf '%b\n' '\0007' |
| 240 | |
| 241 | # prints NUL then 7 |
| 242 | printf '\0007\n' |
| 243 | |
| 244 | # prints no more than two hex digits |
| 245 | printf '\x07e\n' |
| 246 | |
| 247 | # additional backslash escapes |
| 248 | printf '\"\?\n' |
Jari Aalto | 0628567 | 2006-10-10 14:15:34 +0000 | [diff] [blame] | 249 | |
| 250 | # failures with decimal precisions until after bash-3.1 |
| 251 | printf '%0.5d\n' 1 |
| 252 | |
| 253 | printf '%05d\n' 1 |
| 254 | printf '%5d\n' 1 |
| 255 | printf '%0d\n' 1 |
Jari Aalto | 3185942 | 2009-01-12 13:36:28 +0000 | [diff] [blame] | 256 | |
| 257 | # failures with various floating point formats and 0 after bash-3.2 |
| 258 | |
| 259 | printf "%G\n" 0 |
| 260 | printf "%g\n" 0 |
| 261 | printf "%4.2G\n" 0 |
| 262 | printf "%4.2g\n" 0 |
| 263 | |
| 264 | printf "%G\n" 4 |
| 265 | printf "%g\n" 4 |
| 266 | printf "%4.2G\n" 4 |
| 267 | printf "%4.2g\n" 4 |
| 268 | |
| 269 | printf "%F\n" 0 |
| 270 | printf "%f\n" 0 |
| 271 | printf "%4.2F\n" 0 |
| 272 | printf "%4.2f\n" 0 |
| 273 | |
| 274 | printf "%F\n" 4 |
| 275 | printf "%f\n" 4 |
| 276 | printf "%4.2F\n" 4 |
| 277 | printf "%4.2f\n" 4 |
| 278 | |
| 279 | printf "%E\n" 0 |
| 280 | printf "%e\n" 0 |
| 281 | printf "%4.2E\n" 0 |
| 282 | printf "%4.2e\n" 0 |
| 283 | |
| 284 | printf "%E\n" 4 |
| 285 | printf "%e\n" 4 |
| 286 | printf "%4.2E\n" 4 |
| 287 | printf "%4.2e\n" 4 |
| 288 | |
| 289 | printf "%08X\n" 2604292517 |
| 290 | |
| 291 | # make sure these format specifiers all output '' for empty string arguments |
| 292 | echo q |
| 293 | printf "%q\n" "" |
| 294 | printf "%q\n" |
| 295 | |
| 296 | echo s |
| 297 | printf "%s\n" '' |
| 298 | printf "%s\n" |
| 299 | |
| 300 | echo b |
| 301 | printf "%b\n" '' |
| 302 | printf "%b\n" |
| 303 | |
| 304 | # bug in bash versions up to and including bash-3.2 |
| 305 | v=yyy |
| 306 | printf -v var "%s" '/current/working/directory/*.@(m3|i3|ig|mg)' |
| 307 | shopt -s nullglob extglob |
| 308 | echo "x$(printf "%b" @(hugo))x" |
| 309 | printf -v var "%b" @(hugo); echo "x${var}x" |
Chet Ramey | 0001803 | 2011-11-21 20:51:19 -0500 | [diff] [blame] | 310 | |
Chet Ramey | 495aee4 | 2011-11-22 19:11:26 -0500 | [diff] [blame] | 311 | # tests variable assignment with -v |
| 312 | ${THIS_SH} ./printf1.sub |
| 313 | |
Chet Ramey | 0001803 | 2011-11-21 20:51:19 -0500 | [diff] [blame] | 314 | ${THIS_SH} ./printf2.sub |
Chet Ramey | 495aee4 | 2011-11-22 19:11:26 -0500 | [diff] [blame] | 315 | |
| 316 | ${THIS_SH} ./printf3.sub |
Chet Ramey | ac50fba | 2014-02-26 09:36:43 -0500 | [diff] [blame] | 317 | |
| 318 | ${THIS_SH} ./printf4.sub |
| 319 | |