6

So the script is:

#!/bin/bash

for line in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
   if [[ "$line" = "" || "$line" = " " ]]; then
      exit
   else
      unzip "$line" -d "temp"
   fi
done

It works well and unzips the file. But if the file is named with a space (eg: Leon - 1994.zip) it will not work and the $line will be

1st time: /home/citybong/Downloads/Leon

2nd time: -

3rd time: 1994.zip

Edit: I fount a link http://g-scripts.sourceforge.net/faq.php for the question: "My script can't handle multiple files/files with spaces" but i am kinda newbie to bash scripting and i can't understand their solutions

0

4 Answers 4

10

IFS is by default set to space, that's why your string is being divided into spaces. Just set it to the newline with the following code:

IFS_BAK=$IFS
IFS="
"

for line in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
    whatever $line
done

IFS=$IFS_BAK
1
  • Doesn't work with Caja in Ubuntu Mate 14.04 Commented Sep 26, 2017 at 18:02
5

You don't need to mess with IFS:

echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | while read filename; do
    unzip "$filename" -d temp
done

I had a similar problem and it turns out that echo preserves newlines in double quotes, but without quotes changes them to spaces.

3
  • Please add more details to your answer
    – Anwar
    Commented Feb 18, 2013 at 9:27
  • Doesn't work in Caja of ubuntu mate 14.04 Commented Sep 26, 2017 at 18:04
  • Worked for me in plain Ubuntu 22
    – yPhil
    Commented Sep 6, 2022 at 17:49
0

Using $@ instead of $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS in Nautilus scripts could solve the problem with new line separators (which are used as delimiters in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS and $NAUTILUS_SCRIPT_SELECTED_URIS).

So, the code will look like:

#!/bin/bash

for line in "$@"; do
   if [[ "$line" = "" || "$line" = " " ]]; then
      exit
   else
      unzip "$line" -d "temp"
   fi
done

Also, this is handy when we need just pass selection to another app:

#!/bin/sh

baobab "$@"
1
  • Doesn't work with Caja in ubuntu mate 14.04 Commented Sep 26, 2017 at 18:06
-2

Put single quotes around the variable name, like so:

#!/bin/bash

for line in '$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS'; do
   if [[ "$line" = "" || "$line" = " " ]]; then
      exit
   else
      unzip "$line" -d "temp"
   fi
done
3
  • 1
    $line becomes $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS Commented Jan 14, 2013 at 14:33
  • Try double quotes then - I may have the wrong type listed in my response. Commented Jan 14, 2013 at 14:45
  • Xmm with double quotes the $line takes the fullpath of the file but with a new empty line, so the unzipping fails. line = $(echo $line | tr '\n') didn't help. Hakermanias solution solves the problem ;) Commented Jan 14, 2013 at 15:00

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .