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


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Creating a pseudo-array in dash, (POSIX).
# 1  
Old 01-10-2019
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  
Old 01-10-2019
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 01-10-2019
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 01-10-2019
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 01-10-2019
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  
Old 01-10-2019
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 05:55 PM..
These 2 Users Gave Thanks to Scrutinizer For This Post:
# 7  
Old 01-10-2019
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 Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. OS X (Apple)

Generate a random number in a fully POSIX compliant shell, 'dash'...

Hi all... Apologies for any typos, etc... This took a while but it didn't beat me... Although there are many methods of generating random numbers in a POSIX shell this uses integer maths and a simple C source to create an executable to get epoch to microseconds accuracy if it is needed. I take... (8 Replies)
Discussion started by: wisecracker
8 Replies

2. Shell Programming and Scripting

Creating array from file

Dear community, how can I create an array from file taking only the 4th field? out.txt file is something like this: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20So the final array should be: 4 8 12 16 20With this command I created an array with all the fields, but I need only the 4th... (13 Replies)
Discussion started by: Lord Spectre
13 Replies

3. UNIX for Dummies Questions & Answers

Creating an array

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... (3 Replies)
Discussion started by: jrymer
3 Replies

4. Shell Programming and Scripting

Creating array containing file names

I am wondering how I can save the file names (stored in $file or $fnames) in array which I can access with an index. alias MATH 'set \!:1 = `echo "\!:3-$" | bc -l`' set narg = $#argv while ($iarg < $narg) MATH iarg = $iarg + 1 set arg = $argv set opt = ` echo $arg | awk... (1 Reply)
Discussion started by: kristinu
1 Replies

5. Shell Programming and Scripting

creating variable array name

#!/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'... (1 Reply)
Discussion started by: priyanka3006
1 Replies

6. Programming

Creating an array to hold posix thread ids: Only dynamic array works

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)); ... (4 Replies)
Discussion started by: kmehta
4 Replies

7. Shell Programming and Scripting

creating a dynamic array

i want to create an array the array elements are populated depending upon the number of entries present in a data file The data file is created dynamically how to achieve the same thanks (1 Reply)
Discussion started by: trichyselva
1 Replies

8. Solaris

pseudo: [ID 129642 kern.info] pseudo-device: vol0

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... (0 Replies)
Discussion started by: mndavies
0 Replies

9. Shell Programming and Scripting

creating array variable

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... (2 Replies)
Discussion started by: scriptingmani
2 Replies

10. Shell Programming and Scripting

creating a dynamic array in ksh

Hi, Is it possible to create a dynamic array in shell script. I am trying to get the list of logfiles that created that day and put it in a dynamic array. I am not sure about it. help me New to scripting Gundu (3 Replies)
Discussion started by: gundu
3 Replies
Login or Register to Ask a Question