How do I pass on script arguments that contain quotes/spaces?

后端 未结 2 1884
野的像风
野的像风 2020-12-09 09:10

I\'m trying to write a script notify-finish that can be prepended to any command. When done, it will run the command given by the arguments following, then emai

相关标签:
2条回答
  • 2020-12-09 09:32

    Put double-quotes around your variable substitutions to keep them from being parsed (note that this applies to all variables: $@, $1, and $PROG). Also: don't put a $ before a variable name when assigning to it; use # for comments; and, on the last line, the single-quotes will prevent variables from being substituted at all.

    PROG="$1"
    shift
    # Run program below
    "$PROG" "$@"
    ECODE=$? # note: this will always be a number, so it doesn't have to be protected with double-quotes
    echo -e "Subject: $(hostname): $PROG finished\r\nTo: <$USER>\r\n\r\nExited with $ECODE\r\n' | sendmail "$USER"
    
    0 讨论(0)
  • 2020-12-09 09:35

    Use "$@" with quotes:

    prog="$1"
    "$@"
    ecode="$?"
    echo "$prog exited with $ecode"
    

    This will pass each argument exactly as it was received. If you don't include the quotes, each element will be split according to $IFS:

    • "$@" is like "$1" "$2" "$3" ..., passing each element as a separate argument.
    • "$*" is like "$1 $2 $3 ...", passing all elements concatenated as a single argument
    • $* and $@ is like $1 $2 $3 ..., breaking up each element on whitespace, expanding all globs, and passing each resulting word as a separate element ($IFS).

    The same is true for arrays, such as "${array[@]}" and "${array[*]}"

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