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
 

 

 

 

posted @ 2024-05-19 17:18  *Tesla*  阅读(21)  评论(0)    收藏  举报
       [00:00.000] 作词 : 陈信荣
    [00:01.000] 作曲 : 周传雄
    [00:02.000] 编曲 : 周传雄
    [00:03.000] 制作人 : 周传雄
    [00:29.259]过完整个夏天
    [00:34.742]忧伤并没有好一些
    [00:41.185]开车行驶在公路无际无边
    [00:47.320]有离开自己的感觉
    [00:52.453]
    [00:53.347]唱不完一首歌
    [00:59.370]疲倦还剩下黑眼圈
    [01:05.596]感情的世界伤害在所难免
    [01:11.703]黄昏再美终要黑夜
    [01:18.292]依然记得从你口中说出再见坚决如铁
    [01:24.732]昏暗中有种烈日灼身的错觉
    [01:30.171]黄昏的地平线
    [01:33.230]划出一句离别
    [01:36.313]爱情进入永夜
    [01:42.165]
    [01:42.881]依然记得从你眼中滑落的泪伤心欲绝
    [01:49.290]混乱中有种热泪烧伤的错觉
    [01:54.774]黄昏的地平线
    [01:57.816]割断幸福喜悦
    [02:00.915]相爱已经幻灭
    [02:07.171]
    [02:19.647]唱不完一首歌
    [02:25.497]疲倦还剩下黑眼圈
    [02:31.753]感情的世界伤害在所难免
    [02:37.881]黄昏再美终要黑夜
    [02:42.994]
    [02:44.363]依然记得从你口中说出再见坚决如铁
    [02:50.872]昏暗中有种烈日灼身的错觉
    [02:56.291]黄昏的地平线
    [02:59.393]划出一句离别
    [03:02.507]爱情进入永夜
    [03:08.340]
    [03:09.205]依然记得从你眼中滑落的泪伤心欲绝
    [03:15.531]混乱中有种热泪烧伤的错觉
    [03:20.937]黄昏的地平线
    [03:23.991]割断幸福喜悦
    [03:27.025]相爱已经幻灭
    [03:34.375]
    [03:58.563]依然记得从你口中说出再见坚决如铁
    [04:04.694]昏暗中有种烈日灼身的错觉
    [04:10.141]黄昏的地平线
    [04:13.156]划出一句离别
    [04:16.228]爱情进入永夜
    [04:21.297]
    [04:22.863]依然记得从你眼中滑落的泪伤心欲绝
    [04:29.401]混乱中有种热泪烧伤的错觉
    [04:34.714]黄昏的地平线
    [04:37.774]割断幸福喜悦
    [04:40.913]相爱已经幻灭
    [05:39.200] 配唱制作人 : 吴佳明
    [05:39.533] 钢琴 : 周传雄
    [05:39.866] 吉他 : 许华强
    [05:40.199] 鼓 : Gary Gideon
    [05:40.532] 贝斯 : Andy Peterson
    [05:40.865] 弦乐编写 : 吴庆隆
    [05:41.198] 弦乐 : 孔朝晖/顾文丽/隋晶晶/梁中枢/尹淑占/王言/关旗
    [05:41.531] 和声编写 : 周传雄
    [05:41.864] 和声 : 周传雄
    [05:42.197] 录音师 : 林世龙/沈文钏/Geoffrey Lee
    [05:42.530] 混音师 : 王晋溢
    [05:42.863] 录音室 : 强力/HASAYAKE/Atomic & Audioplex (Singapore)
    [05:43.196] 混音室 : 白金
    [05:43.529] OP : Sony/ATV Music Publishing Taiwan/哈萨雅琪有限公司
    [05:43.862] SP : Sony/ATV Music Publishing Taiwan​