| 
									
										
										
										
											1998-04-17 19:52:44 +00:00
										 |  |  | LC_ALL=C | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | LC_NUMERIC=C | 
					
						
							| 
									
										
										
										
											1998-04-17 19:52:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # these should output error messages -- the format is required | 
					
						
							|  |  |  | printf | 
					
						
							|  |  |  | printf -- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # these should output nothing | 
					
						
							|  |  |  | printf "" | 
					
						
							|  |  |  | printf -- "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # this should expand escape sequences in the format string, nothing else | 
					
						
							|  |  |  | printf "\tone\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # this should not cut off output after the \c | 
					
						
							|  |  |  | printf "one\ctwo\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # and unrecognized backslash escapes should have the backslash preserverd | 
					
						
							|  |  |  | printf "4\.2\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "no newline " ; printf "now newline\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # %% -> % | 
					
						
							|  |  |  | printf "%%\n" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | # this was a bug caused by pre-processing the string for backslash escapes | 
					
						
							|  |  |  | # before doing the `%' format processing -- all versions before bash-2.04 | 
					
						
							|  |  |  | printf "\045" ; echo | 
					
						
							|  |  |  | printf "\045d\n" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-04-17 19:52:44 +00:00
										 |  |  | # simple character output | 
					
						
							|  |  |  | printf "%c\n" ABCD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # test simple string output | 
					
						
							|  |  |  | printf "%s\n" unquoted | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # test quoted string output | 
					
						
							|  |  |  | printf "%s %q\n" unquoted quoted | 
					
						
							|  |  |  | printf "%s%10q\n" unquoted quoted | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%q\n" 'this&that' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # make sure the format string is reused to use up arguments | 
					
						
							|  |  |  | printf "%d " 1 2 3 4 5; printf "\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # make sure that extra format characters get null arguments | 
					
						
							|  |  |  | printf "%s %d %d %d\n" onestring | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%s %d %u %4.2f\n" onestring | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf -- "--%s %s--\n" 4.2 '' | 
					
						
							|  |  |  | printf -- "--%s %s--\n" 4.2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # test %b escapes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # 8 is a non-octal digit, so the `81' should be output | 
					
						
							|  |  |  | printf -- "--%b--\n" '\n\081' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf -- "--%b--\n" '\t\0101' | 
					
						
							|  |  |  | printf -- "--%b--\n" '\t\101' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # these should all display `A7' | 
					
						
							|  |  |  | echo -e "\1017" | 
					
						
							| 
									
										
										
										
											2001-11-13 17:56:06 +00:00
										 |  |  | echo -e "\x417" | 
					
						
							| 
									
										
										
										
											1998-04-17 19:52:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | printf "%b\n" '\01017' | 
					
						
							|  |  |  | printf "%b\n" '\1017' | 
					
						
							| 
									
										
										
										
											2001-11-13 17:56:06 +00:00
										 |  |  | printf "%b\n" '\x417' | 
					
						
							| 
									
										
										
										
											1998-04-17 19:52:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | printf -- "--%b--\n" '\"abcd\"' | 
					
						
							|  |  |  | printf -- "--%b--\n" "\'abcd\'" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf -- "--%b--\n" 'a\\x' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf -- "--%b--\n" '\x' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Z1=$(printf -- "%b\n" '\a\b\e\f\r\v') | 
					
						
							|  |  |  | Z2=$'\a\b\e\f\r\v' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ "$Z1" != "$Z2" ]; then | 
					
						
							|  |  |  | 	echo "whoops: printf %b and $'' differ" >&2 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | unset Z1 Z2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf -- "--%b--\n" '' | 
					
						
							|  |  |  | printf -- "--%b--\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # the stuff following the \c should be ignored, as well as the rest | 
					
						
							|  |  |  | # of the format string | 
					
						
							|  |  |  | printf -- "--%b--\n" '4.2\c5.4\n'; printf "\n" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | # unrecognized escape sequences should by displayed unchanged | 
					
						
							|  |  |  | printf -- "--%b--\n" '4\.2' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # a bare \ should not be processed as an escape sequence | 
					
						
							|  |  |  | printf -- "--%b--\n" '\' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-02-19 17:11:39 +00:00
										 |  |  | # make sure extra arguments are ignored if the format string doesn't | 
					
						
							|  |  |  | # actually use them | 
					
						
							|  |  |  | printf "\n" 4.4 BSD | 
					
						
							|  |  |  | printf " " 4.4 BSD ; printf "\n" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-04-17 19:52:44 +00:00
										 |  |  | # make sure that a fieldwidth and precision of `*' are handled right | 
					
						
							|  |  |  | printf "%10.8s\n" 4.4BSD | 
					
						
							|  |  |  | printf "%*.*s\n" 10 8 4.4BSD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%10.8q\n" 4.4BSD | 
					
						
							|  |  |  | printf "%*.*q\n" 10 8 4.4BSD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%6b\n" 4.4BSD | 
					
						
							|  |  |  | printf "%*b\n" 6 4.4BSD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # we handle this crap with homemade code in printf.def | 
					
						
							|  |  |  | printf "%10b\n" 4.4BSD | 
					
						
							|  |  |  | printf -- "--%-10b--\n" 4.4BSD | 
					
						
							|  |  |  | printf "%4.2b\n" 4.4BSD | 
					
						
							|  |  |  | printf "%.3b\n" 4.4BSD | 
					
						
							|  |  |  | printf -- "--%-8b--\n" 4.4BSD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # test numeric conversions -- these four lines should echo identically | 
					
						
							|  |  |  | printf "%d %u %i 0%o 0x%x 0x%X\n" 255 255 255 255 255 255 | 
					
						
							|  |  |  | printf "%d %u %i %#o %#x %#X\n" 255 255 255 255 255 255 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%ld %lu %li 0%o 0x%x 0x%X\n" 255 255 255 255 255 255 | 
					
						
							|  |  |  | printf "%ld %lu %li %#o %#x %#X\n" 255 255 255 255 255 255 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%10d\n" 42 | 
					
						
							|  |  |  | printf "%10d\n" -42 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%*d\n" 10 42 | 
					
						
							|  |  |  | printf "%*d\n" 10 -42 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # test some simple floating point formats | 
					
						
							|  |  |  | printf "%4.2f\n" 4.2 | 
					
						
							|  |  |  | printf "%#4.2f\n" 4.2 | 
					
						
							|  |  |  | printf "%#4.1f\n" 4.2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%*.*f\n" 4 2 4.2 | 
					
						
							|  |  |  | printf "%#*.*f\n" 4 2 4.2 | 
					
						
							|  |  |  | printf "%#*.*f\n" 4 1 4.2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%E\n" 4.2 | 
					
						
							|  |  |  | printf "%e\n" 4.2 | 
					
						
							|  |  |  | printf "%6.1E\n" 4.2 | 
					
						
							|  |  |  | printf "%6.1e\n" 4.2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%G\n" 4.2 | 
					
						
							|  |  |  | printf "%g\n" 4.2 | 
					
						
							|  |  |  | printf "%6.2G\n" 4.2 | 
					
						
							|  |  |  | printf "%6.2g\n" 4.2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # test some of the more esoteric features of POSIX.1 printf | 
					
						
							|  |  |  | printf "%d\n" "'string'" | 
					
						
							|  |  |  | printf "%d\n" '"string"' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%#o\n" "'string'" | 
					
						
							|  |  |  | printf "%#o\n" '"string"' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%#x\n" "'string'" | 
					
						
							|  |  |  | printf "%#X\n" '"string"' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%6.2f\n" "'string'" | 
					
						
							|  |  |  | printf "%6.2f\n" '"string"' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # output from these two lines had better be the same | 
					
						
							|  |  |  | printf -- "--%6.4s--\n" abcdefghijklmnopqrstuvwxyz | 
					
						
							|  |  |  | printf -- "--%6.4b--\n" abcdefghijklmnopqrstuvwxyz | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # and these two also | 
					
						
							|  |  |  | printf -- "--%12.10s--\n" abcdefghijklmnopqrstuvwxyz | 
					
						
							|  |  |  | printf -- "--%12.10b--\n" abcdefghijklmnopqrstuvwxyz | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | # tests for translating \' to ' and \\ to \ | 
					
						
							|  |  |  | # printf translates \' to ' in the format string... | 
					
						
							|  |  |  | printf "\'abcd\'\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # but not when the %b format specification is used | 
					
						
							|  |  |  | printf "%b\n" \\\'abcd\\\' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # but both translate \\ to \ | 
					
						
							|  |  |  | printf '\\abcd\\\n' | 
					
						
							|  |  |  | printf "%b\n" '\\abcd\\' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # this was reported as a bug in bash-2.03 | 
					
						
							|  |  |  | # these three lines should all echo `26' | 
					
						
							|  |  |  | printf "%d\n" 0x1a | 
					
						
							|  |  |  | printf "%d\n" 032 | 
					
						
							|  |  |  | printf "%d\n" 26 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-04-17 19:52:44 +00:00
										 |  |  | # error messages | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # this should be an overflow, but error messages vary between systems | 
					
						
							|  |  |  | # printf "%lu\n" 4294967296 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # ...but we cannot use this because some systems (SunOS4, for example), | 
					
						
							|  |  |  | # happily ignore overflow conditions in strtol(3) | 
					
						
							|  |  |  | #printf "%ld\n" 4294967296 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # in the future this may mean to put the output into VAR, but for | 
					
						
							|  |  |  | # now it is an error | 
					
						
							|  |  |  | printf -v var "%10d" $RANDOM | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf "%10" | 
					
						
							|  |  |  | printf "ab%Mcd\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # this caused an infinite loop in older versions of printf | 
					
						
							|  |  |  | printf "%y" 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-13 17:56:06 +00:00
										 |  |  | # these should print a warning and `0', according to POSIX.2 | 
					
						
							| 
									
										
										
										
											1998-04-17 19:52:44 +00:00
										 |  |  | printf "%d\n" GNU | 
					
						
							|  |  |  | printf "%o\n" GNU | 
					
						
							| 
									
										
										
										
											2001-11-13 17:56:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # failures in all bash versions through bash-2.05 | 
					
						
							|  |  |  | printf "%.0s" foo | 
					
						
							|  |  |  | printf "%.*s" 0 foo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | printf '%.0b-%.0s\n' foo bar | 
					
						
							|  |  |  | printf '(%*b)(%*s)\n' -4 foo -4 bar | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | format='%'`printf '%0100384d' 0`'d\n'  | 
					
						
							|  |  |  | printf $format 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # this doesn't work with printf(3) on all systems | 
					
						
							|  |  |  | #printf "%'s\n" foo |