linux通过tomcat的cig脚本查询数据库将结果渲染成html网页
web.xml做了cgi-bin的映射
# /opt/tomcat8/webapps/ROOT/WEB-INF/cgi/listStudent.sh,浏览器访问:http://10.10.10.71/cgi-bin/listStudent.sh
#!/bin/bash export LANG=en_AU.UTF-8 #这个编码要export,即使/etc/profile中export了,虽然这个范围这是所有的shell都生效,但是这里还需要export,特殊 echo $LANG >a.txt echo Content-type: text/html #告诉浏览器这是html echo "" #响应头要加空行 echo ' <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>学生表</title> <style> table{ width: 50%; border-collapse: collapse; margin: 20px auto; } th, td{ border: 1px solid #ddd; padding: 8px; text-align: center; } th{ background-color: #f2f2f2; } tr:nth-child(even){ background-color: #f2f2f2; } tr:hover{ background-color: #e9e9e9; } </style> </head> ' echo ' <body> <h2>学生表</h2> <table> <tr> <th>学号</th> <th>姓名</th> <th>年龄</th> <th>班级号</th> </tr> ' stuList=$(mysql -h 10.10.10.51 -ujxtest -p12345678 jwxt -e "select * from jx_student" |grep -v id |sed 's#\t#@#g') #数组长度是1,就是一个字符串,shell上任何数都可以看做一个数组 for stu in ${stuList[@]} #这里和for(())不同,虽然数组长度是1,但是for in 会根据字符串空格来遍历 do id=$(echo $stu|awk -F"@" '{print $1}') name=$(echo $stu|awk -F"@" '{print $2}') age=$(echo $stu|awk -F"@" '{print $3}') class_id=$(echo $stu|awk -F"@" '{print $4}') echo "<tr>" echo "<th>$id</th>" echo "<th>$name</th>" echo "<th>$age</th>" echo "<th>$class_id</th>" echo "</tr>" done
或者 stuList=($(mysql -h 10.10.10.51 -ujxtest -p12345678 jwxt -e "select * from jx_student" |grep -v id |sed 's#\t#@#g')) #数组长度是4 #stuList=$(mysql -h 10.10.10.51 -ujxtest -p12345678 jwxt -e "select * from jx_student" |grep -v id |sed 's#\t#@#g') #数组长度是1 for((i=0;i<${#stuList[@]};i++)) do id=$(echo ${stuList[i]}|awk -F"@" '{print $1}') name=$(echo ${stuList[i]}|awk -F"@" '{print $2}') age=$(echo ${stuList[i]}|awk -F"@" '{print $3}') class_id=$(echo ${stuList[i]}|awk -F"@" '{print $4}') echo "<tr>" echo "<th>$id</th>" echo "<th>$name</th>" echo "<th>$age</th>" echo "<th>$class_id</th>" echo "</tr>" done
echo ' </table> </body> </html> '
#!/bin/bash export LANG=en_AU.UTF-8 #这个编码要export,即使/etc/profile中export了,虽然这个范围这是所有的shell都生效,但是这里还需要export,特殊 echo $LANG >a.txt echo Content-type: text/html #告诉浏览器这是html echo "" #响应头要加空行 echo ' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Student Information Table</title> <style> table { width: 50%; border-collapse: collapse; margin: 20px auto; } th, td { border: 1px solid #ddd; padding: 8px; text-align: center; } th { background-color: #f2f2f2; } tr:nth-child(even) { background-color: #f2f2f2; } tr:hover { background-color: #e9e9e9; } </style> </head> <body> <h1>导航栏</h1> <ul id="navigation"> <li><a href="#" onclick=showContent("class")>班级</a></li> <li><a href="#" onclick=showContent("students")>学生</a></li> <li><a href="#" onclick=showContent("exams")>考试</a></li> <li><a href="#" onclick=showContent("subjects")>科目</a></li> <li><a href="#" onclick=showContent("grades")>成绩</a></li> </ul> <div id="content"> <p>点击导航栏上的项目以查看相关内容。</p> </div> <script> function showContent(contentId) { var content = document.getElementById("content"); switch (contentId) { case "class": break; case "students": content.innerHTML = "<p>学生</h2><p>这里是学生相关信息</p>"; break; case "exams": break; case "subjects": content.innerHTML = "<h2>科目</h2><p>这里是科目相关信息。</p>"; break; case "grades": content.innerHTML = `<p><table>' echo "<tr><th>学生名</th><th>年龄</th><th>班级名</th><th>科目名</th><th>考试名</th><th>分数</th></tr>"
或者
sql="select jx_student.name,jx_student.age,jx_class.name,jx_subject.name ,jx_test.name, jx_score.score from jx_score join jx_student on jx_student.id=jx_score.stu_id join jx_class on jx_class.id=jx_student.classId join jx_subject on jx_score.subject_id=jx_subject.id join jx_test on jx_test.id=jx_score.test_id;" scoreList=$(mysql -h 10.10.10.51 -ujxtest -p12345678 jwxt -e "$sql"|/bin/bash|grep name -v|sed "s#\t#@#g") #执行存在变量中的命令
这里$sql需要加双引号,作为一个整体,如果不加引号,
mysql -h 10.10.10.51 -ujxtest -p12345678 jwxt -e select jx_student.name,jx_student.age,jx_class.name,jx_subject.name ,jx_test.name, jx_score.score from jx_score join jx_student on jx_student.id=jx_score.stu_id join jx_class on jx_class.id=jx_student.classId join jx_subject on jx_score.subject_id=jx_subject.id join jx_test on jx_test.id=jx_score.test_id;
这样会报mysql命令不对,-e 后面必须是一个字符串整体代表查询sql,而不是一个个字符串
或者
sql=$(mysql -h 10.10.10.51 -ujxtest -p12345678 jwxt -e "select jx_student.name,jx_student.age,jx_class.name,jx_subject.name ,jx_test.name, jx_score.score from jx_score join jx_student on jx_student.id=jx_score.stu_id join jx_class on jx_class.id=jx_student.classId join jx_subject on jx_score.subject_id=jx_subject.id join jx_test on jx_test.id=jx_score.test_id;") #scoreList=$(echo $sql|grep name -v|sed "s#\t#@#g") #这样结果是空
scoreList=$(echo "$sql"|grep name -v|sed "s#\t#@#g") #命令执行一般都是列表,如果想输出结果保持列表这种原格式,变量需要加上双引号,
str="aafa\nbbbcc aa\n aa"
echo $str会将里面的字符一个个作为参数,也不会转义 echo -e才会转义 ,空格换行tab三个空白字符去掉,然后统一用空格组装一个字符串,里面的\n也不转义
echo "$str" 原样输出所以还是列表
#echo $scoreList #exit 0 for score in $scoreList do studentN=$(echo ${score}|awk -F'@' '{print $1}') age=$(echo ${score}|awk -F'@' '{print $2}') classN=$(echo ${score}|awk -F'@' '{print $3}') subjectN=$(echo ${score}|awk -F'@' '{print $4}') testN=$(echo ${score}|awk -F'@' '{print $5}') score=$(echo ${score}|awk -F'@' '{print $6}') echo "<tr>" echo "<th>$studentN</th>" echo "<th>$age</th>" echo "<th>$classN</th>" echo "<th>$subjectN</th>" echo "<th>$testN</th>" echo "<th>$score</th>" echo "</tr>" done echo '</table></p>`; break; default: content.innerHTML = "<p>未知内容。</p>"; } } </script> </body> </html> '
#!/bin/bash # 网站脚本前面必须这样写 str="afafaff jj afa\n " echo $str echo "$str" ~ sh a.sh [root@jx21080001-dev-71 cgi]# sh a.sh afafaff jj afa\n afafaff jj afa\n
加上redis,先从redis查,没从数据库查
source common.sh echo ' <script> function showContent(contentId) { var content = document.getElementById("content"); switch (contentId) { case "class": content.innerHTML = "<h2>班级</h2><p>这里是班级相关信息。</p>"; break; case "students": content.innerHTML = `<p><table> ' list_student=($(redis-cli -h 192.168.3.106 -a 123456 lrange key_student 0 -1)) if [ -z "${list_student}" ];then list_student=($(mysql -h 192.168.3.104 -ujxtest -pFpc11100885, jxcms -e "select * from jx_stu" |grep -v id |sed 's#\t#@#g')) #数组长度是4 echo $list_student redis-cli -h 192.168.3.106 -a 123456 lpush key_student "${list_student[@]}" fi #stuList=$(mysql -h 192.168.3.104 -ujxtest -pFpc11100885, jxcms -e "select * from jx_stu" |grep -v id |sed 's#\t#@#g') #数组长度是1 for((i=0;i<${#list_student[@]};i++)) do id=$(echo ${list_student[i]}|awk -F"@" '{print $1}') name=$(echo ${list_student[i]}|awk -F"@" '{print $2}') age=$(echo ${list_student[i]}|awk -F"@" '{print $3}') class_id=$(echo ${list_student[i]}|awk -F"@" '{print $4}') echo "<tr>" echo "<th>$id</th>" echo "<th>$class_id</th>" echo "<th>$name</th>" echo "<th>$age</th>" echo "</tr>" done echo ' </table></p>`; break; case "exams": content.innerHTML = "<h2>考试</h2><p>这里是考试相关信息。</p>"; break; case "subjects": content.innerHTML = "<h2>科目</h2><p>这里是科目相关信息。</p>"; break; case "grades": content.innerHTML = "<h2>成绩</h2><p>这里是成绩相关信息。</p>"; break; default: content.innerHTML = "<p>未知内容。</p>"; } } </script>
这个脚本注意两点:
list_student=($(redis-cli -h 192.168.3.106 -a 123456 lrange key_student 0 -1)) 这种数组
第一点:echo $list_student不会像预期的那样显示整个数组的内容。在Bash中,$student会展开为数组的第一个元素。要显示整个数组 ${list_student[@]} 和c语言,数组名称指向第一个元素地址
第二点:redis-cli -h 192.168.3.106 -a 123456 lpush key_student "${list_student[@]}" redis这种设置key-value-value-value..多个value,用list等,${list_student[@]} 会展开,redis-cli -h 192.168.3.106 -a 123456 lpush key_student 1@1@张四@18 2@1@李四@19 3@2@王五@20
第三点:如果不用lpush,就想用set,可以字符串数组,key-value, 这时遍历只能for in了,不能用索引。
第四点:if [ -z "${list_student[@]}" ] 在Bash中,当你使用-z测试时,它用于检查字符串是否为空。但是,你不能直接将数组传递给-z测试,因为-z只接受单个字符串参数,而不是数组。判断数组可以检查数组是否为空,你应该检查数组的第一个元素是否为空,或者你可以检查数组的长度是否为0。if [ ${#list_student[@]} -eq 0 ] 或者
if [ -z "${list_student}"判断第一个元素是否为空
第五点:数组中元素顺序时1 ,2 ,3 ;如果lpush到redis中,栈的后进先出,从redislrang查询的第一个元素是3
海纳百川 ,有容乃大

浙公网安备 33010602011771号