How to mark an array in POSIX sh?

前端 未结 3 1229
你的背包
你的背包 2020-12-10 03:20

While replacing external commands in a shell script, I used an array to get rid of awk\'s NF.

Now, since I moved from bash to POSIX sh, I cannot get the

相关标签:
3条回答
  • 2020-12-10 04:01

    Arrays are not part of the POSIX sh specification.

    There are various other ways to find the last item. A couple of possibilities:

    #!/bin/sh
    export RANGE="0 1 4 6 8 16 24 46 53"
    for LAST_ITEM in $RANGE; do true; done
    echo "Last element(replace NF): $LAST_ITEM"
    

    or:

    #!/bin/sh
    export RANGE="0 1 4 6 8 16 24 46 53"
    LAST_ITEM="${RANGE##* }"
    echo "Last element(replace NF): $LAST_ITEM"
    
    0 讨论(0)
  • 2020-12-10 04:17

    You can use the following project from Github, which implements a POSIX-compliant array, which works in all shells I tried: https://github.com/makefu/array

    It is not very convenient to use, but I found it to work well for my purposes.

    0 讨论(0)
  • 2020-12-10 04:23

    The following code works for me using the Heirloom Bourne Shell:

    #!/usr/local/bin/bournesh
    # cf. Heirloom Bourne Shell, 
    #     http://freshmeat.net/projects/bournesh/
    #     http://www.in-ulm.de/~mascheck/bourne/
    
    # use a caret as a pipe symbol to make sure it's a Bourne shell
    # cf. http://mywiki.wooledge.org/BourneShell
    ls ^ cat 1>/dev/null 2>&1 || 
       { echo 'No true Bourne shell! ... exiting ...'; exit 1; }
    
    IFS=' '
    unset RANGE
    RANGE="0 1 4 6 8 16 24 46 53"
    export IFS RANGE
    set -- $RANGE
    echo arrayelements: $#
    LAST=$#
    eval echo "Last element\(replace NF\): \$$#"
    

    Note that IFS is set to a space and there are no double quotes around $RANGE.

    0 讨论(0)
提交回复
热议问题