(Nautilus 脚本)$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS;存在空间问题

(Nautilus 脚本)$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS;存在空间问题

因此脚本是:

#!/bin/bash

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

它运行良好,可以解压文件。但如果文件名称中有空格(例如:Leon - 1994.zip),它将不起作用,并且$line

第一次:/home/citybong/Downloads/Leon

第二次:-

第三次:1994.zip

编辑:我找到了一个链接http://g-scripts.sourceforge.net/faq.php对于问题:“我的脚本无法处理多个文件/带空格的文件”,但我对 bash 脚本还不太熟悉,无法理解他们的解决方案

答案1

IFS 默认设置为空格,这就是为什么您的字符串被分成空格的原因。只需使用以下代码将其设置为换行符:

IFS_BAK=$IFS
IFS="
"

for line in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
    whatever $line
done

IFS=$IFS_BAK

答案2

你不需要与 IFS 混在一起:

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

我遇到了类似的问题,结果发现 echo 在双引号中保留了换行符,但没有引号会将它们更改为空格。

答案3

在 Nautilus 脚本中使用$@而不是$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS可以解决新行分隔符(用作$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS和中的分隔符$NAUTILUS_SCRIPT_SELECTED_URIS)的问题。

因此,代码将如下所示:

#!/bin/bash

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

此外,当我们需要将选择传递给另一个应用程序时,这很方便:

#!/bin/sh

baobab "$@"

答案4

将变量名称放在单引号内,如下所示:

#!/bin/bash

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

相关内容