Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add POSIX parameter expansions and initialization #48

Open
7 tasks
Neved4 opened this issue Oct 16, 2023 · 0 comments
Open
7 tasks

Add POSIX parameter expansions and initialization #48

Neved4 opened this issue Oct 16, 2023 · 0 comments

Comments

@Neved4
Copy link

Neved4 commented Oct 16, 2023

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant