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
doneIt 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 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
04 Answers
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 You don't need to mess with IFS:
echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | while read filename; do unzip "$filename" -d temp
doneI had a similar problem and it turns out that echo preserves newlines in double quotes, but without quotes changes them to spaces.
2Using $@ 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
doneAlso, this is handy when we need just pass selection to another app:
#!/bin/sh
baobab "$@" 1 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