因此脚本是:
#!/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