How to use positional parameters with “bash -c” command?

后端 未结 2 442
再見小時候
再見小時候 2020-12-31 02:30

I\'d like to know the best way of using positional parameters when using the command bash -c.

The man pages indicates for the -c option tha

2条回答
  •  隐瞒了意图╮
    2020-12-31 02:53

    bash -c 'printf "%s %s %s\n" $0 $1 $2' param1 param2 param3
    

    The above works but many would consider it a bad habit to get into. If you were to copy code from the -c string to a script, it would fail. Similarly, if you were to copy code from a script to a -c string, it would fail.

    By contrast, with the following form, $1 means the same thing in the -c string that it would mean in a script or shell function:

    bash -c 'printf "%s %s %s\n" $1 $2 $3' _ param1 param2 param3
    

    Consistency of programming style reduces bugs.

    The shell treats $0 differently

    One customarily refers to all of a script's arguments with $@ or $*. Note that these variables do not include $0:

    $ bash -c 'echo "$*"' param1 param2 param3
    param2 param3
    $ bash -c 'echo "$@"' param1 param2 param3
    param2 param3
    

    $0 is the program name

    In regular scripts, $0 is the name of the script. Consequently, when using bash -c, some people prefer to use some meaningful name for the $0 parameter, such as:

    bash -c 'printf "%s %s %s\n" $1 $2 $3' bash param1 param2 param3
    

    Or:

    bash -c 'printf "%s %s %s\n" $1 $2 $3' printer param1 param2 param3
    

    This approach has a clear advantage if the -c string generates an error. For example, consider this script:

    $ cat script.sh
    #!/bin/bash
    bash -c 'grepp misspelling "$1"' BadPgm file.txt
    

    If we run the script, the following output is produced:

    $ ./script.sh 
    BadPgm: grepp: command not found
    

    This identifies the source of the error as the command in the bash -c string.

提交回复
热议问题