Skip to content

Instantly share code, notes, and snippets.

@przemoc
Last active February 6, 2018 14:05
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save przemoc/168ecd5a263e1e498ee6d2ee4278e4ae to your computer and use it in GitHub Desktop.
Save przemoc/168ecd5a263e1e498ee6d2ee4278e4ae to your computer and use it in GitHub Desktop.
Reassemble arguments (support-most-cases implementation) in POSIX shell - Transforming "$*" into "$@"
#!/bin/sh
# SPDX-License-Identifier: MIT
## Copyright (C) 2016 Przemyslaw Pawelczyk <przemoc@gmail.com>
##
## This script is licensed under the terms of the MIT license.
## https://opensource.org/licenses/MIT
# Reassemble arguments (support-most-cases implementation)
ARGC=$#
argcon=
argkey=
argval=
while [ $ARGC -gt 0 ]; do
arg=$1
shift
ARGC=$((ARGC - 1))
case "$arg" in
'"'*'"')
if [ "$argcon" = "'" ]; then
argval="$argval $arg"
elif [ "$argcon" = '"' ]; then
echo "$0: Unsupported syntax!" >&2
else
arg=${arg#\"}
arg=${arg%\"}
set -- "$@" "$arg"
fi
;;
"'"*"'")
if [ "$argcon" = '"' ]; then
argval="$argval $arg"
elif [ "$argcon" = "'" ]; then
echo "$0: Unsupported syntax!" >&2
else
arg=${arg#\'}
arg=${arg%\'}
set -- "$@" "$arg"
fi
;;
'"'|"'")
if [ -n "$argcon" ]; then
if [ "$argcon" = "$arg" ]; then
argval="$argval ${arg%$argcon}"
set -- "$@" "$argkey$argval"
argcon=
argkey=
argval=
else
argval="$argval $arg"
fi
else
argcon=$arg
argkey=
argval=
fi
;;
'"'*)
if [ "$argcon" = "'" ]; then
if [ "${arg%$argcon}" != "$arg" ] && [ "${arg%$argcon}" = "${arg%%$argcon*}" ]; then
argval="$argval ${arg%$argcon}"
set -- "$@" "$argkey$argval"
argcon=
argkey=
argval=
else
argval="$argval $arg"
fi
elif [ "$argcon" = '"' ]; then
echo "$0: Unsupported syntax!" >&2
else
argcon='"'
argkey=
argval=${arg#\"}
fi
;;
"'"*)
if [ "$argcon" = '"' ]; then
if [ "${arg%$argcon}" != "$arg" ] && [ "${arg%$argcon}" = "${arg%%$argcon*}" ]; then
argval="$argval ${arg%$argcon}"
set -- "$@" "$argkey$argval"
argcon=
argkey=
argval=
else
argval="$argval $arg"
fi
elif [ "$argcon" = "'" ]; then
echo "$0: Unsupported syntax!" >&2
else
argcon="'"
argkey=
argval=${arg#\'}
fi
;;
*=*)
if [ -n "$argcon" ]; then
if [ "${arg%$argcon}" != "$arg" ] && [ "${arg%$argcon}" = "${arg%%$argcon*}" ]; then
argval="$argval ${arg%$argcon}"
set -- "$@" "$argkey$argval"
argcon=
argkey=
argval=
else
argval="$argval $arg"
fi
else
argkey="${arg%%=*}="
argval=${arg#*=}
case "$argval" in
'"'*'"')
argval=${argval#\"}
argval=${argval%\"}
set -- "$@" "$argkey$argval"
;;
"'"*"'")
argval=${argval#\'}
argval=${argval%\'}
set -- "$@" "$argkey$argval"
;;
'"'*)
argcon='"'
argval=${argval#\"}
;;
"'"*)
argcon="'"
argval=${argval#\'}
;;
*)
set -- "$@" "$argkey$argval"
;;
esac
fi
;;
*)
if [ -n "$argcon" ]; then
if [ "${arg%$argcon}" != "$arg" ] && [ "${arg%$argcon}" = "${arg%%$argcon*}" ]; then
argval="$argval ${arg%$argcon}"
set -- "$@" "$argkey$argval"
argcon=
argkey=
argval=
else
argval="$argval $arg"
fi
else
set -- "$@" "$arg"
fi
;;
esac
done
if [ -n "$argcon" ]; then
set -- "$@" "$argkey$argval"
echo "$0: Unsupported syntax!" >&2
fi
# show current arguments
for I in "$@"; do
echo ">$I<"
done
@przemoc
Copy link
Author

przemoc commented Nov 29, 2016

Example:

$ ./reassemble_arguments.sh "test '1" 'test "2' test3="3 three" test4='4 four' test5="f i='v' e" test6='s "i" x' test7="  " '  test8  '
>test '1<
>test "2<
>test3=3 three<
>test4=4 four<
>test5=f i='v' e<
>test6=s "i" x<
>test7=  <
>  test8  <
$ cat arguments
"test '1" 'test "2' test3="3 three" test4='4 four' test5="f i='v' e" test6='s "i" x' test7="  " '  test8  '
$ ./reassemble_arguments.sh $(cat arguments)
>test '1<
>test "2<
>test3=3 three<
>test4=4 four<
>test5=f i='v' e<
>test6=s "i" x<
>test7= <
> test8 <

@przemoc
Copy link
Author

przemoc commented Feb 6, 2018

commit 28b3b793a64001fecd8cd5165661b40147199e36
Author: Przemyslaw Pawelczyk <przemoc@gmail.com>
Date:   2018-02-06 15:04:02 +0100

    reassemble_arguments.sh: Add copyright notice and MIT license notice.

commit b35b2001da0e8b22ea8b15ad7dc33754680737fb
Author: Przemyslaw Pawelczyk <przemoc@gmail.com>
Date:   2018-02-06 15:04:29 +0100

    Add SPDX License Identifier.

    The Software Package Data Exchange (SPDX) is a good initiative, it has
    matured over time and deserves accelerated adoption in open-source.

    https://spdx.org/learn
    https://spdx.org/using-spdx
    https://spdx.org/license-list

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment