Specify command line arguments like name=value pairs for shell script

前端 未结 5 1148
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-10 07:38

Is it possible to pass command line arguments to shell script as name value pairs, something like

myscript action=build module=core

and th

5条回答
  •  一向
    一向 (楼主)
    2020-12-10 08:16

    In the Bourne shell, there is a seldom-used option '-k' which automatically places any values specified as name=value on the command line into the environment. Of course, the Bourne/Korn/POSIX shell family (including bash) also do that for name=value items before the command name:

    name1=value1 name2=value2 command name3=value3 -x name4=value4 abc
    

    Under normal POSIX-shell behaviour, the command is invoked with name1 and name2 in the environment, and with four arguments. Under the Bourne (and Korn and bash, but not POSIX) shell -k option, it is invoked with name1, name2, name3, and name4 in the environment and just two arguments. The bash manual page (as in man bash) doesn't mention the equivalent of -k but it works like the Bourne and Korn shells do. I don't think I've ever used it (the -k option) seriously.

    There is no way to tell from within the script (command) that the environment variables were specified solely for this command; they are simply environment variables in the environment of that script.

    This is the closest approach I know of to what you are asking for. I do not think anything equivalent exists for the C shell family. I don't know of any other argument parser that sets variables from name=value pairs on the command line.


    With some fairly major caveats (it is relatively easy to do for simple values, but hard to deal with values containing shell meta-characters), you can do:

    case $1 in
    (*=*) eval $1;;
    esac
    

    This is not the C shell family. The eval effectively does the shell assignment.

    arg=name1=value1
    echo $name1
    eval $arg
    echo $name1
    

提交回复
热议问题