build argument lists containing whitespace

前端 未结 5 1377
一生所求
一生所求 2020-12-01 13:24

In bash one can escape arguments that contain whitespace.

foo \"a string\"

This also works for arguments to a command or function:

相关标签:
5条回答
  • 2020-12-01 13:36

    Use arrays (one of the hidden features in Bash).

    0 讨论(0)
  • 2020-12-01 13:42

    You can use the arrays just as you suggest, with a small detail changed. The line calling foo should read

     foo "${args[@]}"
    
    0 讨论(0)
  • 2020-12-01 13:44

    Here is a shorter version which does not require the use of a numeric index:

    (example: building arguments to a find command)

    dir=$1
    shift
    for f in "$@" ; do
        args+=(-iname "*$f*")
    done
    find "$dir" "${args[@]}"
    
    0 讨论(0)
  • 2020-12-01 13:47

    I had a problem with this too as well. I was writing a bash script to backup the important files on my windows computer (cygwin). I tried the array approach too, and still had some issues. Not sure exactly how I fixed it, but here's the parts of my code that are important in case it will help you.

    WORK="d:\Work Documents\*"
    #   prompt and 7zip each file
    for x in $SVN $WEB1 $WEB2 "$WORK" $GRAPHICS $W_SQL
    do
        echo "Add $x to archive? (y/n)"
        read DO
        if [ "$DO" == "y" ]; then
            echo "compressing $x"
            7zip a $W_OUTPUT "$x"
        fi
        echo ""
    done
    
    0 讨论(0)
  • 2020-12-01 13:57

    There are (at least) two ways to do this:

    1. Use an array and expand it using "${array[@]}":

      bar() {
          local i=0 args=()
          for arg in "$@"
          do
              args[$i]="prefix $arg"
              ((++i))
          done
      
          foo "${args[@]}"
      }
      

      So, what have we learned? "${array[@]}" is to ${array[*]} what "$@" is to $*.

    2. Or if you do not want to use arrays you need to use eval:

      bar() {
          local args=()
          for arg in "$@"
          do
              args="$args \"prefix $arg\""
          done
      
          eval foo $args
      }
      
    0 讨论(0)
提交回复
热议问题