![sh -c '...' sh {} 使用 if 语句且文件名中包含 ' 时不起作用](https://linux22.com/image/933836/sh%20-c%20'...'%20sh%20%7B%7D%20%E4%BD%BF%E7%94%A8%20if%20%E8%AF%AD%E5%8F%A5%E4%B8%94%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E5%8C%85%E5%90%AB%20'%20%E6%97%B6%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我有以下简化的脚本:
find /home/cas/plex-media/series/ -type f ! -name "*.srt" -exec sh -c '
file=$1
if [ if-statement using $file ]; then
echo "true"
else
echo "false"
fi
' find-bash {} \;
'
该脚本运行正常,除非文件名中有一个(例如/home/cas/plex-media/series/The Legend Of Korra/Season 4/The Legend of Korra - S04E11 - Kuvira's Gambit.mkv
),在这种情况下我会收到以下错误:
find-bash: 1: [: =: unexpected operator
我不知道如何修复它。当文件名中没有时'
,脚本可以完美运行。
编辑以回答问题:这是完整的脚本。我首先简化了它,因为 if 语句非常长。但你想要完整的内容,所以它在这里。通常它是一行很长的内容,但我把它分开了,以便你更容易阅读。
find /home/cas/plex-media/series/ -type f ! -name "*.srt" -exec bash -c '
file="$1";
echo "$file";
thetvdb=$(GET http://192.168.2.15:32400/library/sections/2/all?X-Plex-Token=HfXBs23FhKBGj3msHjAz | grep $(curl -sSL https://thetvdb.com/series/$(echo "$file" | grep -o "series/.*/Season" | grep -o "/.*/" | sed "s|/||g" | sed "s| |-|" | sed "s| |-|" | sed "s| |-|" | sed "s| |-|" | sed "s| |-|" | sed "s| |-|" | sed "s|(||" | sed "s|)||") | grep -A 1 "<strong>TheTVDB.com Series ID</strong>" | grep -E -o "[0-9]{1,9}"));
themoviedb=$(GET http://192.168.2.15:32400/library/sections/2/all?X-Plex-Token=HfXBs23FhKBGj3msHjAz | grep $(curl -sL https://www.themoviedb.org/search?query=$(echo "$file" | grep -o "series/.*/Season" | grep -o "/.*/" | grep -E -o "[A-Z].*[a-z]" | sed "s| |+|g") | grep "href=\"/tv/.*\"><h2>" | head -n1 | grep -oE "/tv/[0-9]{1,9}" | grep -oE "[0-9]{1,9}"));
if [[
$(GET http://192.168.2.15:32400
$(GET http://192.168.2.15:32400
$(GET http://192.168.2.15:32400
$(echo
$(if [[ -z "$thetvdb" ]];
then echo "$themoviedb" | grep -o "key=\".*/children\" guid";
else echo "$thetvdb" | grep -o "key=\".*/children\" guid";
fi)
| grep -o "/.*/children"
)?X-Plex-Token=HfXBs23FhKBGj3msHjAz | grep "index=\"$(echo "$file" | grep -Eo "/Season [0-9]{1,3}" | grep -Eo "[0-9]{1,3}")\"" | grep -o "key=\"/.*/children\" parentRatingKey" | grep -o "/.*/children"
)?X-Plex-Token=HfXBs23FhKBGj3msHjAz | grep -B 2 "$file" | grep -o "key=\".*\" parentRatingKey" | grep -Eo "/.*/[0-9]{1,9}"
)?X-Plex-Token=HfXBs23FhKBGj3msHjAz | grep -o "streamType=\"3\"" | head -n1
) = "streamType=\"3\"" ]]; then echo "true"; else echo "false"; fi' find-bash {} \;
如果你不能完全理解,我可以理解。所以我会解释一下。
该脚本的目的是获取我的系列文件夹中的每个媒体文件并检查其是否有字幕。无论它们是集成的还是外部的。我使用 Plex api 转到有关该文件的信息页面并查看是否存在字幕streamType="3"
,这意味着有字幕。
它首先设置变量thetvdb
和themoviedb
。然后加载我 plex 媒体服务器中所有系列的 api 页面。它搜索文件所属的正确系列(为此我们需要这些变量)。然后获取该系列的密钥。
然后,它会使用该密钥发出另一个 API 请求,该请求会向您提供有关该剧集及其季节的信息。然后,它会获取文件所属的季节并获取密钥。
然后,它会使用该新密钥发出另一个请求,指向有关该季及其剧集的页面。然后,它会搜索该剧集并获取密钥。
然后使用该密钥发出另一个请求,提供有关该集的信息。然后获取streamType="3"
。如果所有这些的输出等于streamType="3"
,则它回显为真。如果该字符串不存在(即文件没有字幕),则整个结果将为空,因为它无法 grep 该字符串。这不等于streamType="3"
答案1
如果$1
包含'
字符,则'
结束引用的命令'file=$1; ...
。后面的所有内容'
都在-c
参数之外。这会产生错误。尝试$1
用双引号引用:'file="$1"; ...
。$file
在命令中也用双引号引用if
。