针对sqlite测试变量是不行的

时间:2015-02-15 13:45:23

标签: bash sqlite

我正在编写一个脚本,只会下载一些子目录及其内容。为此,我设置了一个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/

欢迎任何有关如何修复的想法。

1 个答案:

答案 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\"" )

应该做你想要的(并且完全相同)。