Creating a pseudo-array in dash, (POSIX).

Tags
array, creating, dash, posix, shell scripts

 
Thread Tools Search this Thread
# 1  
Old 1 Week Ago
Creating a pseudo-array in dash, (POSIX).

Arrays in dash, (POSIX).

Hi gurus...

I am thinking of trying AudioScope.sh in pure POSIX so...
I need an array in dash, I know it is not possible but pseudo-arrays are.

I have two versions that work, the second is an idea from the WWW.
The first is what I would like to use.
There are problems in both...

The first has two problems:
1) It needs "eval" to create a number of variables "VAR0, VAR1, VAR2 ... VARn".
AND
2) I have no idea if there is a limit to how many variables POSIX allows.
The minimum I would need is 48000 and the maximum 65536.

The second is a modified version from the WWW and has a major problem as well as 'eval' and the 'maximum limit' too.
But the main one is I have no idea how to make it mutable.

So the questions are:

Is there a better method than either of mine that creates a pseudo-array that is fully mutable?
Is there a limit to the number of variables to create a pseudo-array in POSIX?
Is it possible to eliminate 'eval' to create a pseudo-array, (I suspect the answer is no)...

TIA...
This is mutable...
Code:
#!/usr/local/bin/dash
# MUTABLE! ;o)
# 'dash' Version 0.5.9

/bin/echo 'ab
b c
c$d
de
e \f\n
f/g
g~ h
h*i
i#j
j%k
kl
lm' > /tmp/array.txt

# *******************************************
# The main array generator,,,
INDEX=0
while IFS=$'\n' read -r ARRAY
do
	eval "MY_ARRAY${INDEX}='${ARRAY}'"
	INDEX=$(( INDEX+1 ))
done < /tmp/array.txt
# *******************************************

LENGTH=${INDEX}
/bin/echo "Array_length = ${LENGTH}"
# Basic test.
/bin/echo "Original array index 4 = ${MY_ARRAY4}"
MY_ARRAY4='1 2 3'
/bin/echo "Modified array index 4 = ${MY_ARRAY4}"
/bin/echo ""

INDEX=0
while [ ${INDEX} -le 12 ]
do
	eval /bin/echo "\${MY_ARRAY${INDEX}}"
	INDEX=$(( INDEX+1 ))
done

This is immutable.
Code:
#!/usr/local/bin/dash
# IMMUTABLE! ;o(
# 'dash' Version 0.5.9

/bin/echo 'a b,bc,cd \f\n,de,ef,f g,gh,h\i,ij,jk,kl,lm' > /tmp/array.txt

ARRAY=$( cat /tmp/array.txt )

orig_ifs="$IFS"
IFS=','

set -- $ARRAY

INDEX=1
while [ ${INDEX} -le 12 ]
do
	eval VAL=$( /bin/echo "\${${INDEX}}" )
	printf "%u = %s\n" "${INDEX}" "${VAL}"
	INDEX=$(( INDEX+1 ))
done
LENGTH=$(( INDEX-1 ))

#*Just basic tests.
/bin/echo ""
/bin/echo "Array_length = ${LENGTH}"
INDEX=10
eval /bin/echo "\${${INDEX}}"
INDEX=3
eval /bin/echo "\${${INDEX}}"
/bin/echo ""

IFS="$orig_ifs"

This User Gave Thanks to wisecracker For This Post:
Scrutinizer (1 Week Ago)
# 2  
Old 1 Week Ago
Code:
#!/bin/dash
var="one|test|program"
oldIFS=$IFS
IFS="|"
set -- $var
echo "$1"
echo "$2"
echo "$3"      # more $9 == curly braces e.g. "${10}"
IFS=$oldIFS

# 3  
Old 1 Week Ago
Quote:
Originally Posted by jim mcnamara
Code:
#!/bin/dash
var="one|test|program"
oldIFS=$IFS
IFS="|"
set -- $var
echo "$1"
echo "$2"
echo "$3"      # more $9 == curly braces e.g. "${10}"
IFS=$oldIFS

Quote:
Myself:
Is there a better method than either of mine that creates a pseudo-array that is fully mutable?
I need it to be fully mutable.
So how can I change '$1' and put it back into var?
# 4  
Old 1 Week Ago
Execute the above, then call part of your scheme to assign each of the elements to your array. Personally, I would avoid dash if possible if you need features like typedef, declare, arrays.... AFAIK a Linux system with /bin/sh == dash also will have /bin/bash available, too. ---Not applicable to ARM linux and other minimized CE versions of Linux. A shebang with #!/bin/bash seems preferable. Unless of course this is all just meant for fun. You do realize that extensive workarounds for production systems are generally bad idea.
# 5  
Old 1 Week Ago
Also consider that other folks have encountered POSIX and have come up with code like:
Rich’s sh (POSIX shell) tricks

My comments above were focused primarily on Linux-like platforms.
These 2 Users Gave Thanks to jim mcnamara For This Post:
bakunin (1 Week Ago) Peasant (1 Week Ago)
# 6  
Old 1 Week Ago
How about a concept like this, mutable without eval .. :
Code:
#!/usr/local/bin/dash
set -- a b c
array() {
  _pos=$1
  _newval=$2
  _ARRAY= _i=-1 _val=
  shift 2
  for _val in "$@"
  do
    if [ $((_i+=1)) = $_pos ]; then
      _ARRAY="${_ARRAY}${_newval}
"
    else
      _ARRAY="${_ARRAY}${_val}
"
    fi
  done 
}

array 1 foo "$@"
oldIFS=$IFS
IFS="
"
set -- ${_ARRAY}

echo "Space as output field separator:
$@
"
echo "IFS as output field separator:
$*"

IFS=$oldIFS

Output:
Code:
Space as output field separator:
a foo c

IFS as output field separator:
a
foo
c


Last edited by Scrutinizer; 1 Week Ago at 05:55 PM..
These 2 Users Gave Thanks to Scrutinizer For This Post:
Chubler_XL (1 Week Ago) wisecracker (1 Week Ago)
# 7  
Old 1 Week Ago
If your array elements do not contain <newline> characters and do not contain elements that are longer than 2047 bytes, you could always use a plain text file as your array with each line in the file being an array element. You can then use shell for and/or while loops to process array elements in sequence.

If you need random access to array elements, you could use ed to access or replace individual elements in your array directly without affecting other elements (lines) in your array (file).

Without knowing more about the data you want to put into your array and what you want to do with your array after you create it, there are lots and lots of possibilities (many of which might be completely impossible for what you might actually be trying to do).

|
Thread Tools Search this Thread
Search this Thread:
Advanced Search

More UNIX and Linux Forum Topics You Might Find Helpful
Creating an array with options as an argument! dixits Shell Programming and Scripting 2 04-05-2013 02:38 PM
Creating array from file Lord Spectre Shell Programming and Scripting 13 09-11-2012 06:39 AM
Creating an array jrymer UNIX for Dummies Questions & Answers 3 07-21-2012 01:37 PM
Creating bash array name from variable melias Shell Programming and Scripting 3 02-27-2012 11:50 PM
Problem with array and creating directories Renjesh Shell Programming and Scripting 2 03-18-2011 09:43 AM
Creating an array out of users: shell script figaro BSD 7 03-14-2011 05:00 PM
Creating array containing file names kristinu Shell Programming and Scripting 1 11-03-2010 01:03 AM
Help in Array looping and creating multiple lines sexyTrojan UNIX for Dummies Questions & Answers 0 11-02-2009 08:30 PM
creating variable array name priyanka3006 Shell Programming and Scripting 1 04-09-2009 10:50 AM
Creating an array to hold posix thread ids: Only dynamic array works kmehta Programming 4 09-21-2008 09:24 PM
Creating a string array from a directory listing otes4 UNIX for Dummies Questions & Answers 1 08-08-2008 09:40 PM
creating a dynamic array trichyselva Shell Programming and Scripting 1 07-10-2008 10:13 AM
pseudo: [ID 129642 kern.info] pseudo-device: vol0 mndavies Solaris 0 02-13-2008 10:21 PM
creating array variable scriptingmani Shell Programming and Scripting 2 06-28-2007 11:25 AM
creating a dynamic array in ksh gundu Shell Programming and Scripting 3 03-09-2005 03:26 PM