xref: /freebsd/contrib/netbsd-tests/bin/sh/t_varquote.sh (revision c22165b4f1f5d38b681921797a44b3ba8c13b7e0)
1*640235e2SEnji Cooper# $NetBSD: t_varquote.sh,v 1.5 2016/03/27 14:50:01 christos Exp $
257718be8SEnji Cooper#
357718be8SEnji Cooper# Copyright (c) 2007 The NetBSD Foundation, Inc.
457718be8SEnji Cooper# All rights reserved.
557718be8SEnji Cooper#
657718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without
757718be8SEnji Cooper# modification, are permitted provided that the following conditions
857718be8SEnji Cooper# are met:
957718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright
1057718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer.
1157718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
1257718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
1357718be8SEnji Cooper#    documentation and/or other materials provided with the distribution.
1457718be8SEnji Cooper#
1557718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1657718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1757718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1857718be8SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
1957718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2057718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2157718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2257718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2357718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2457718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2557718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
2657718be8SEnji Cooper#
27*640235e2SEnji Cooper# the implementation of "sh" to test
28*640235e2SEnji Cooper: ${TEST_SH:="/bin/sh"}
2957718be8SEnji Cooper
3057718be8SEnji Cooper# Variable quoting test.
3157718be8SEnji Cooper
3257718be8SEnji Coopercheck() {
3357718be8SEnji Cooper	if [ "$1" != "$2" ]
3457718be8SEnji Cooper	then
3557718be8SEnji Cooper		atf_fail "expected [$2], found [$1]" 1>&2
3657718be8SEnji Cooper	fi
3757718be8SEnji Cooper}
3857718be8SEnji Cooper
3957718be8SEnji Cooperatf_test_case all
4057718be8SEnji Cooperall_head() {
4157718be8SEnji Cooper	atf_set "descr" "Basic checks for variable quoting"
4257718be8SEnji Cooper}
4357718be8SEnji Cooperall_body() {
44*640235e2SEnji Cooper
45*640235e2SEnji Cooper	cat <<-'EOF' > script.sh
46*640235e2SEnji Cooper		T=0
47*640235e2SEnji Cooper		check() {
48*640235e2SEnji Cooper			T=$((${T} + 1))
49*640235e2SEnji Cooper
50*640235e2SEnji Cooper			if [ "$1" != "$2" ]
51*640235e2SEnji Cooper			then
52*640235e2SEnji Cooper				printf '%s\n' "T${T}: expected [$2], found [$1]"
53*640235e2SEnji Cooper				exit 1
54*640235e2SEnji Cooper			fi
55*640235e2SEnji Cooper		}
56*640235e2SEnji Cooper
57*640235e2SEnji Cooper								#1
5857718be8SEnji Cooper		foo='${a:-foo}'
5957718be8SEnji Cooper		check "$foo" '${a:-foo}'
60*640235e2SEnji Cooper								#2
6157718be8SEnji Cooper		foo="${a:-foo}"
6257718be8SEnji Cooper		check "$foo" "foo"
63*640235e2SEnji Cooper								#3
6457718be8SEnji Cooper		foo=${a:-"'{}'"}
6557718be8SEnji Cooper		check "$foo" "'{}'"
66*640235e2SEnji Cooper								#4
6757718be8SEnji Cooper		foo=${a:-${b:-"'{}'"}}
6857718be8SEnji Cooper		check "$foo" "'{}'"
69*640235e2SEnji Cooper								#5
70*640235e2SEnji Cooper		#    ${   }   The ' are inside ".." so are literal (not quotes).
71*640235e2SEnji Cooper		foo="${a-'}'}"
72*640235e2SEnji Cooper		check "$foo" "''}"
73*640235e2SEnji Cooper								#6
74*640235e2SEnji Cooper		# The rules for quoting in ${var-word} expressions are somewhat
75*640235e2SEnji Cooper		# weird, in the following there is not one quoted string being
76*640235e2SEnji Cooper		# assigned to foo (with internally quoted sub-strings), rather
77*640235e2SEnji Cooper		# it is a mixed quoted/unquoted string, with parts that are
78*640235e2SEnji Cooper		# quoted, separated by 2 unquoted sections...
79*640235e2SEnji Cooper		#    qqqqqqqqqq uuuuuuuuuu qq uuuu qqqq
8057718be8SEnji Cooper		foo="${a:-${b:-"${c:-${d:-"x}"}}y}"}}z}"
8157718be8SEnji Cooper		#   "                                z*"
8257718be8SEnji Cooper		#    ${a:-                          }
8357718be8SEnji Cooper		#         ${b:-                    }
8457718be8SEnji Cooper		#              "                y*"
8557718be8SEnji Cooper		#               ${c:-          }
8657718be8SEnji Cooper		#                    ${d:-    }
8757718be8SEnji Cooper		#                         "x*"
8857718be8SEnji Cooper		check "$foo" "x}y}z}"
89*640235e2SEnji Cooper								#7
90*640235e2SEnji Cooper		# And believe it or not, this is the one that gives
91*640235e2SEnji Cooper		# most problems, with 3 different observed outputs...
92*640235e2SEnji Cooper		#    qqqqq  qq  q		is one interpretation
93*640235e2SEnji Cooper		#    qqqqq QQQQ q		is another (most common)
94*640235e2SEnji Cooper		#			(the third is syntax error...)
95*640235e2SEnji Cooper		foo="${a:-"'{}'"}"
96*640235e2SEnji Cooper		check "$foo" "'{}'"
97*640235e2SEnji Cooper
98*640235e2SEnji Cooper	EOF
99*640235e2SEnji Cooper
100*640235e2SEnji Cooper	OUT=$( ${TEST_SH} script.sh 2>&1 )
101*640235e2SEnji Cooper	if  [ $? -ne 0 ]
102*640235e2SEnji Cooper	then
103*640235e2SEnji Cooper		atf_fail "${OUT}"
104*640235e2SEnji Cooper	elif [ -n "${OUT}" ]
105*640235e2SEnji Cooper	then
106*640235e2SEnji Cooper		atf_fail "script.sh unexpectedly said: ${OUT}"
107*640235e2SEnji Cooper	fi
10857718be8SEnji Cooper}
10957718be8SEnji Cooper
11057718be8SEnji Cooperatf_test_case nested_quotes_multiword
11157718be8SEnji Coopernested_quotes_multiword_head() {
11257718be8SEnji Cooper	atf_set "descr" "Tests that having nested quoting in a multi-word" \
11357718be8SEnji Cooper	    "string works (PR bin/43597)"
11457718be8SEnji Cooper}
11557718be8SEnji Coopernested_quotes_multiword_body() {
11657718be8SEnji Cooper	atf_check -s eq:0 -o match:"first-word second-word" -e empty \
117*640235e2SEnji Cooper	    ${TEST_SH} -c 'echo "${foo:="first-word"} second-word"'
118*640235e2SEnji Cooper}
119*640235e2SEnji Cooper
120*640235e2SEnji Cooperatf_test_case default_assignment_with_arith
121*640235e2SEnji Cooperdefault_assignment_with_arith_head() {
122*640235e2SEnji Cooper	atf_set "descr" "Tests default variable assignment with arithmetic" \
123*640235e2SEnji Cooper	    "string works (PR bin/50827)"
124*640235e2SEnji Cooper}
125*640235e2SEnji Cooperdefault_assignment_with_arith_body() {
126*640235e2SEnji Cooper	atf_check -s eq:0 -o empty -e empty ${TEST_SH} -c ': "${x=$((1))}"'
127*640235e2SEnji Cooper	atf_check -s eq:0 -o match:1 -e empty ${TEST_SH} -c 'echo "${x=$((1))}"'
12857718be8SEnji Cooper}
12957718be8SEnji Cooper
13057718be8SEnji Cooperatf_init_test_cases() {
13157718be8SEnji Cooper	atf_add_test_case all
13257718be8SEnji Cooper	atf_add_test_case nested_quotes_multiword
133*640235e2SEnji Cooper	atf_add_test_case default_assignment_with_arith
13457718be8SEnji Cooper}
135