1#!/bin/sh 2# 3# $NetBSD: scoped_command,v 1.1 2014/05/31 14:29:06 christos Exp $ 4# 5# Copyright (c) 2014 The NetBSD Foundation, Inc. 6# All rights reserved. 7# 8# This code is derived from software contributed to The NetBSD Foundation 9# by Jarmo Jaakkola. 10# 11# Redistribution and use in source and binary forms, with or without 12# modification, are permitted provided that the following conditions 13# are met: 14# 1. Redistributions of source code must retain the above copyright 15# notice, this list of conditions and the following disclaimer. 16# 2. Redistributions in binary form must reproduce the above copyright 17# notice, this list of conditions and the following disclaimer in the 18# documentation and/or other materials provided with the distribution. 19# 20# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30# POSSIBILITY OF SUCH DAMAGE. 31# 32 33set -e 34 35# USAGE: 36# scoped_command scope cmd msg var_suffix 37# 38# Write to stdout a piece of Bourne Shell script with _cmd_ in specific 39# _scope_. The execution of _cmd_ is bracketed by prints of "before _msg_" 40# and "after _msg_, return value ${?}". If the generated script uses 41# variables, __var_suffix_ is appended to their names to allow nesting of 42# scripts generated this way. 43# 44# _scope_ should be one of: case, compound, file, for, func, subshell, 45# until, while. 46# _cmd_ is the command line to execute. Remember proper quoting! 47# _msg_ is text that will be used inside single quotes. 48# _var_suffix_ is a syntactically valid identifier name. 49 50# don't rely on command lists (';') 51cmd="echo 'before ${3}' 52${2} 53echo 'after ${3}, return value:' ${?}" 54 55echo "#!/bin/sh" 56 57[ 'func' = "${1}" ] && cat <<EOF 58func() 59{ 60 echo 'before ${3}' 61 \${1} 62 echo 'after ${3}' 63} 64 65echo 'before function' 66func "${2}" "${3}" # don't rely on 'shift' 67echo 'after function' 68EOF 69 70[ 'case' = "${1}" ] && cat <<EOF 71echo 'before case' 72case 'a' in 73 a) ${cmd};; 74esac 75echo 'after case' 76EOF 77 78[ 'file' = "${1}" ] && cat <<EOF 79${cmd} 80EOF 81 82[ 'while' = "${1}" ] && cat <<EOF 83echo 'before while' 84cond_${4}='true true false' 85while \${cond_${4}} 86do 87 cond_${4}="\${cond_${4}#* }" 88 ${cmd} 89done 90echo 'after while' 91EOF 92 93[ 'until' = "${1}" ] && cat <<EOF 94echo 'before until' 95cond_${4}='false false true' 96until \${cond_${4}} 97do 98 cond_${4}="\${cond_${4}#* }" 99 ${cmd} 100done 101echo 'after until' 102EOF 103 104[ 'for' = "${1}" ] && cat <<EOF 105echo 'before for' 106for i_${4} in 1 2 107do 108 ${cmd} 109done 110echo 'after for' 111EOF 112 113[ 'subshell' = "${1}" ] && cat <<EOF 114( 115 echo 'subshell start' 116 ${cmd} 117 echo 'subshell end' 118) 119EOF 120 121[ 'compound' = "${1}" ] && cat <<EOF 122{ 123 echo 'compound start' 124 ${cmd}; 125 echo 'compound end' 126} 127EOF 128 129exit 0 130