我正在编写一个脚本,只会下载一些子目录及其内容。为此,我设置了一个sqlite数据库(dir.db),其中包含一个表(零)和一个列(剧集,使用VARCHAR(10)定义为变量字符)。这在以下脚本中使用 -
enter #!/bin/sh
set -x
cd ~/scripts/sqlite/remote/
Progs=( * )
for show in "${Progs[@]%*/}"; do
cd ~/scripts/sqlite/
exists=$( sqlite3 dir.db "select count(*) from zero where episode=\"?$show%/}\"" )
if (( exists > 0 )); then
echo "Show already downloaded"
else
cp ~/scripts/sqlite/remote/${show}/ -t ~/scripts/sqlite/home/ -R -v
sqlite3 dir.db "insert into zero (episode) values ('${show}');"
fi
done
exit 0
此脚本运行时没有错误,但不起作用:)。如果我在〜/ scripts / sqlite / remote /中放置一个目录,在dir.db中,该目录应该返回'Show already downloaded',而是复制它。
显然问题出在这里 -
exists=$( sqlite3 dir.db "select count(*) from zero where episode=\"?$show%/}\"" )
if (( exists > 0 ));
但我不知道如何诊断它 - 我从其他地方获得了代码(http://www.linuxquestions.org/questions/linux-software-2/bash-script-how-to-assign-variable-to-an-sqlite3-command-with-variable-embedded-4175453829/)
欢迎任何有关如何修复的想法。
答案 0 :(得分:0)
这一行是你的问题:
exists=$( sqlite3 dir.db "select count(*) from zero where episode=\"?$show%/}\"" )
该行扩展为(假设show=foobar
):
exists=$( sqlite3 dir.db "select count(*) from zero where episode=\"?foobar%/}\"" )
除非您的剧集名称?foobar%/}
不匹配,否则
%/}
是"${Progs[@]%*/}
扩展中的残余,但在该上下文中%*/
正在对${Progs[@]}
变量扩展执行字符串操作,并且也是不平衡的尾随{{1} }}
无论
}
或
exists=$( sqlite3 dir.db "select count(*) from zero where episode=\"$show\"" )
应该做你想要的(并且完全相同)。