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


Login or Register to Reply

 
Thread Tools Search this Thread
# 1  
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:
# 2  
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  
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  
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  
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:
# 6  
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; 01-10-2019 at 04:55 PM..
These 2 Users Gave Thanks to Scrutinizer For This Post:
# 7  
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).
Login or Register to Reply

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

More UNIX and Linux Forum Topics You Might Find Helpful
Creating an array
jrymer
I am having trouble creating an array, I've tried everything google gives me but it won't work, and it seems as though it should. Using Ubunto 12.04 and bash. #!/bin/bash ARRAY=one two three echo ${ARRAY}When I do this I receive the error : two: not found and : Bad substitution When I...... UNIX for Dummies Questions & Answers
3
UNIX for Dummies Questions & Answers
creating variable array name
priyanka3006
#!/bin/ksh #export CLASSPATH=$CLASSPATH:~dialp/cso/classes:/opt/oracle/product/8.1.6/jdbc/lib/classes12.zip #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/oracle/product/8.1.6/lib DATE="`date '+%m%d%Y'`" PATH=.:$PATH export PATH town_name='123' town_name='123' town_name='345'...... Shell Programming and Scripting
1
Shell Programming and Scripting
Creating an array to hold posix thread ids: Only dynamic array works
kmehta
I am facing a strange error while creating posix threads: Given below are two snippets of code, the first one works whereas the second one gives a garbage value in the output. Snippet 1 This works: -------------- int *threadids; threadids = (int *) malloc (num_threads * sizeof(int)); ...... Programming
4
Programming
pseudo: [ID 129642 kern.info] pseudo-device: vol0
mndavies
Hi I have a system that gave me some messages on bootup that I was not used to seeing: pseudo: pseudo-device: vol0 genunix: vol0 is /pseudo/vol@0 these came with these: Feb 13 17:42:17 system1 eri: SUNW,eri0 : 100 Mbps full duplex link up Feb 13 17:42:21 system1sendmail: My unqualified...... Solaris
0
Solaris
creating array variable
scriptingmani
Hi all, i am quite fimiliar with shell scripting but i wouldn't regard myself as a semi professional at it. I am trying to create an array variable to read in 4 lines from a file using head and tail command in a pipeline and store each line into each array. I have done the scripting in unix...... Shell Programming and Scripting
2
Shell Programming and Scripting