Skip to content

Add POSIX parameter expansions and initialization #48

@Neved4

Description

@Neved4

For validation, we could use something like grok.sh or https://stackoverflow.com/a/67261832.

Run code as nsh -c '<code>', e.g.: nsh -c 'var='.

Features

  • Empty variable assignment

    #!/bin/sh
    var=
    nsh: parse error:  --> 2:5
      |
    2 | var=␊
      |    ^---
      |
      = expected literal_span, tilde_span, any_string_span, any_char_span, command_span, proc_subst_direction, backtick_span, expr_span, param_ex_span, param_span, double_quoted_span, single_quoted_span, or initializer
    
Notice how is shown when there's a newline.
  • Default value substitution with whitespace

    echo "${var:- }"
    nsh: parse error:  --> 1:14
      |
    1 | echo "${var:- }"
      |              ^---
      |
      = expected word
    
  • Default value initialization

    : "${var:=def}"
    nsh: command not found `:'
    
  • Get name without extension

    echo ${FILENAME%.*}
      nsh: parse error:  --> 1:16
      |
    1 | echo ${FILENAME%.*}
      |                ^---
      |
      = expected param_op
    
  • Get extension

    echo ${FILENAME##*.}
      nsh: parse error:  --> 1:16
      |
    1 | echo ${FILENAME##*.}
      |                ^---
      |
      = expected param_op
    
  • Get directory name

    echo ${PATHNAME%/*}
      nsh: parse error:  --> 1:16
      |
    1 | echo ${PATHNAME%/*}
      |                ^---
      |
      = expected param_op
    
  • Get file name

    echo ${PATHNAME##*/}
      nsh: parse error:  --> 1:16
      |
    1 | echo ${PATHNAME##*/}
      |                ^---
      |
      = expected param_op
    

For reference, here is the expansion table:

parameter expansion var set var empty var unset
${var-default} $var "" default
${var=default} $var "" default
${var?default} $var "" exit 127
${var+default} default default ""
${var:-default} $var default default
${var:=default} $var default default
${var:?default} $var exit 127 exit 127
${var:+default} default "" ""

For POSIX parameter expansion, see: POSIX.1-2017: Parameter Expansion.
For other applications of parameter expansion, see: The Bash Hackers Wiki: Parameter Expansion.
For a more historical reference, see: The Traditional Bourne Shell Family.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions