bash: passing paths with spaces as parameters?

前端 未结 4 896
北海茫月
北海茫月 2021-02-12 22:14

I have a bash script that recieves a set of files from the user. These files are sometimes under directories with spaces in their names. Unfortunately unlike this question all t

相关标签:
4条回答
  • 2021-02-12 22:47
    "$var"
    

    For example,

    $ var='foo bar'
    
    $ perl -E'say "<<$_>>" for @ARGV' $var
    <<foo>>
    <<bar>>
    
    $ perl -E'say "<<$_>>" for @ARGV' "$var"
    <<foo bar>>
    
    0 讨论(0)
  • 2021-02-12 22:50

    You want "$@", which has the special syntax of expanding $@ but preserving the white-space quoting of the caller (it does not create a single giant string with all the arguments in it). So someone can call your script like:

    bash-script.sh AFile "Another File With Spaces"
    

    Then in your script you can do things like:

    for f in "$@"; do 
      echo "$f"; 
    done
    

    and get two lines of output (not 5).

    Read the paragraph about the Special Parameter "@" here: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

    0 讨论(0)
  • 2021-02-12 22:56
    #! /bin/bash
    
    for fname in "$@"; do
      process-one-file-at-a-time "$fname"
    done
    

    Note the excessive use of quotes. It's all necessary.

    Passing all the arguments to another program is even simpler:

    process-all-together "$@"
    

    The tricky case is when you want to split the arguments in half. That requires a lot more code in a simple POSIX shell. But maybe the Bash has some special features.

    0 讨论(0)
  • 2021-02-12 22:56

    Bravo @Roland . Thans a lot for your solution

    It has really worked!

    I wrote a simple script function that opens a given path with nautilus.

    And I've just nested a function with this "helper"-for-loop into the main function:

    fmp ()  {
    
        fmp2() { 
            nautilus "$@"; 
        };
    
        for fname in "$@";
        do         
            fmp2 "$fname";         
        done; 
    }
    

    Now I'm able to make all my scripts work handling with paths just by turning them into nested functions wrapped by a function with this helper-for-loop.

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