- 外文名
- script
- 拼 音
- jiǎo běn
- 中文名
- 脚本
-
2018-10-08 11:22:35更多相关内容
-
Python脚本100例
2018-11-17 21:51:57Python脚本实战编写100例,有简单到复杂,简单易懂好学,实用。一看就会,易学就懂。 -
Nginx编译配置脚本最终篇 - configure脚本
2021-06-07 20:11:04Nginx编译配置脚本最终篇 - configure脚本1、相关文章2、前言3、configure脚本详解3.1、设置LC_ALL宏3.2、调用auto/options脚本3.3、调用auto/init脚本3.4、调用auto/sources脚本3.5、objs/目录相关内容3.6、写入NGX...Nginx编译配置脚本最终篇 - configure脚本
- 1、相关文章
- 2、前言
- 3、configure脚本详解
- 3.1、设置LC_ALL宏
- 3.2、调用auto/options脚本
- 3.3、调用auto/init脚本
- 3.4、调用auto/sources脚本
- 3.5、objs/目录相关内容
- 3.6、写入NGX_DEBUG宏到objs/ngx_auto_headers.h文件
- 3.7、设置与系统相关的几个变量
- 3.8、调用auto/cc/conf脚本
- 3.9、调用auto/headers脚本
- 3.10、调用auto/os/conf脚本
- 3.11、调用auto/unix脚本
- 3.12、调用auto/threads脚本
- 3.13、调用auto/modules脚本
- 3.14、调用auto/lib/conf脚本
- 3.15、设置NGX_PREFIX相关内容
- 3.16、往objs/ngx_auto_config.h文件中写入一系列路径相关的宏
- 3.17、设置与最终生成的Makefile相关的内容
- 3.18、一些其它的配置
- 4、总结
1、相关文章
由于学习本文需要
Nginx
源码及搭建相关的编译环境,且本文与前面的文章有先后呼应关系,所以建议大家按以下文章顺序阅读- CentOS 7使用源码编译安装Nginx,以及配置使用autoindex模块
- Nginx配置编译脚本篇(1)- 解析配置选项脚本auto/options
- Nginx编译配置脚本篇(2)- Makefile初始化脚本auto/init
- Nginx编译配置脚本篇(3)- 源码相关变量脚本auto/sources
- Nginx编译配置脚本篇(4)- 工具型脚本系列
- Nginx编译配置脚本篇(5)- 编译器相关脚本
- Nginx编译配置脚本篇(6)- 系统环境相关脚本
- Nginx编译配置脚本篇(7)- UNIX环境脚本auto/unix
- Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules
- Nginx编译配置脚本篇(9)- 动态库配置脚本auto/lib/conf
- Nginx编译配置脚本篇(10)- Makefile相关脚本
2、前言
通过前面的10篇文章,我们了解了
Nginx
源代码auto/
目录下的各个脚本的作用,这篇文章我们将介绍configure
脚本,看看它是如何通过使用auto/
目录下的各个脚本来完成一次完整的配置的。本篇也是介绍Nginx
编译配置脚本的最后一篇文章。3、configure脚本详解
3.1、设置LC_ALL宏
这里设置
LC_ALL
是为了清除所有本地化的设置,让命令能够正确运行。具体的大家可以参考一下这篇文章《LC_ALL=C的含义》
代码如下:LC_ALL=C export LC_ALL
3.2、调用auto/options脚本
本节对应这篇文章《Nginx配置编译脚本篇(1)- 解析配置选项脚本auto/options》
通过调用auto/options
脚本来对初始化一些配置选项,并对我们传入脚本的参数进行处理
代码如下:. auto/options
3.3、调用auto/init脚本
本节对应这篇文章《Nginx编译配置脚本篇(2)- Makefile初始化脚本auto/init》
通过调用auto/init
脚本来初始化部分与Makefile
相关的变量,生成源代码根目录的Makefile
文件并往其中写入部分信息
代码如下:. auto/init
3.4、调用auto/sources脚本
本节对应这篇文章《Nginx编译配置脚本篇(3)- 源码相关变量脚本auto/sources》
通过调用auto/sources
脚本来设置与objs/Makefile
文件的源码部分相关的一些变量,这些变量将在后续会进行转换写入到objs/Makefile
文件中
代码如下:. auto/sources
3.5、objs/目录相关内容
从前面几个脚本中我们可以知道,
NGX_OBJS
的默认值为objs
,NGX_AUTO_HEADERS_H
的默认值为objs/ngx_auto_headers.h
,NGX_AUTOCONF_ERR
的默认值为objs/autoconf.err
,则下面的代码的作用就是创建objs/
目录,然后在该目录下生成ngx_auto_headers.h
(存放部分开关宏的头文件)和autoconf.err
(配置错误信息的输出文件)文件,并往ngx_auto_headers.h
写入一个宏
代码如下:test -d $NGX_OBJS || mkdir -p $NGX_OBJS echo > $NGX_AUTO_HEADERS_H echo > $NGX_AUTOCONF_ERR echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H
3.6、写入NGX_DEBUG宏到objs/ngx_auto_headers.h文件
本节对应这篇文章《Nginx编译配置脚本篇(4)- 工具型脚本系列》
这里是根据NGX_DEBUG
变量的值来选择是否写入NGX_DEBUG
宏到objs/ngx_auto_headers.h
文件中,NGX_DEBUG
这个变量是在auto/options
脚本里设置的,默认为NO
代码如下:if [ $NGX_DEBUG = YES ]; then have=NGX_DEBUG . auto/have fi
3.7、设置与系统相关的几个变量
NGX_PLATFORM
这个变量是在auto/options
脚本里设置的,默认为空。可以看到当NGX_PLATFORM
为空时,通过使用uname
命令来设置NGX_SYSTEM
、NGX_RELEASE
、NGX_MACHINE
的值,最后通过这几个参数来设置NGX_PLATFORM
,该值在后面会被多次用到,基本都是判断一下当前系统是不是Windows
,然后执行一些特殊配置之类的操作
代码如下:if test -z "$NGX_PLATFORM"; then echo "checking for OS" NGX_SYSTEM=`uname -s 2>/dev/null` NGX_RELEASE=`uname -r 2>/dev/null` NGX_MACHINE=`uname -m 2>/dev/null` echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE" NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE"; case "$NGX_SYSTEM" in MINGW32_* | MINGW64_* | MSYS_*) NGX_PLATFORM=win32 ;; esac else echo "building for $NGX_PLATFORM" NGX_SYSTEM=$NGX_PLATFORM fi
3.8、调用auto/cc/conf脚本
本节对应这篇文章《Nginx编译配置脚本篇(5)- 编译器相关脚本》
这里通过调用auto/cc/conf
脚本来设置编译器相关的信息
代码如下:. auto/cc/conf
3.9、调用auto/headers脚本
本节对应这篇文章《Nginx编译配置脚本篇(4)- 工具型脚本系列》
代码如下:if [ "$NGX_PLATFORM" != win32 ]; then . auto/headers fi
auto/headers
这个脚本之前没有讲过,里面的内容如下,可以看到里面又调用了auto/include
脚本ngx_include="unistd.h"; . auto/include ngx_include="inttypes.h"; . auto/include ngx_include="limits.h"; . auto/include ngx_include="sys/filio.h"; . auto/include ngx_include="sys/param.h"; . auto/include ngx_include="sys/mount.h"; . auto/include ngx_include="sys/statvfs.h"; . auto/include ngx_include="crypt.h"; . auto/include
auto/include
脚本的内容如下:echo $ngx_n "checking for $ngx_include ...$ngx_c" cat << END >> $NGX_AUTOCONF_ERR ---------------------------------------- checking for $ngx_include END ngx_found=no cat << END > $NGX_AUTOTEST.c $NGX_INCLUDE_SYS_PARAM_H #include <$ngx_include> int main(void) { return 0; } END ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c" eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" if [ -x $NGX_AUTOTEST ]; then ngx_found=yes echo " found" ngx_name=`echo $ngx_include \ | tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__` have=NGX_HAVE_$ngx_name . auto/have_headers eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'" else echo " not found" echo "----------" >> $NGX_AUTOCONF_ERR cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR echo $ngx_test >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR fi rm -rf $NGX_AUTOTEST*
可以看到这个脚本和
auto/feature
比较像,也是生成一个测试文件,只不过这个比较简单一点,只是测试当前环境是否可以使用ngx_include
这个变量对应头文件,不行的话也是往objs/autoconf.err
写入错误信息,行的话就使用auto/have_headers
脚本往objs/ngx_auto_headers.h
文件中写入相关的宏3.10、调用auto/os/conf脚本
本节对应这篇文章《Nginx编译配置脚本篇(6)- 系统环境相关脚本》
这里通过调用auto/os/conf
脚本来设置系统环境相关的信息
代码如下:. auto/os/conf
3.11、调用auto/unix脚本
本节对应这篇文章《Nginx编译配置脚本篇(7)- UNIX环境脚本auto/unix》
这里通过调用auto/unix
脚本来配置UNIX
环境下的一些信息,下面的判断语句也是表明了在Windows
下配置是不会调用该脚本的
代码如下:if [ "$NGX_PLATFORM" != win32 ]; then . auto/unix fi
3.12、调用auto/threads脚本
代码如下:
. auto/threads
这里调用
auto/threads
脚本来设置与多线程相关的信息,auto/threads
内容如下:if [ $USE_THREADS = YES ]; then if [ "$NGX_PLATFORM" = win32 ]; then cat << END $0: --with-threads is not supported on Windows END exit 1 fi have=NGX_THREADS . auto/have CORE_DEPS="$CORE_DEPS $THREAD_POOL_DEPS" CORE_SRCS="$CORE_SRCS $THREAD_POOL_SRCS" CORE_LIBS="$CORE_LIBS -lpthread" NGX_LIBPTHREAD="-lpthread" fi
可以看到
USE_THREADS
的值必须是YES
才会生效,并且Windows
下不允许设置这个。里面做的工作比较简单,将相关的宏、动态库信息添加到对应的变量中而已3.13、调用auto/modules脚本
本节对应这篇文章《Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules》
这里通过调用auto/modules
脚本来设置与模块相关的内容
代码如下:. auto/modules
3.14、调用auto/lib/conf脚本
本节对应这篇文章《Nginx编译配置脚本篇(9)- 动态库配置脚本auto/lib/conf》
这里通过调用auto/lib/conf
脚本来设置与动态库相关的内容
代码如下:. auto/lib/conf
3.15、设置NGX_PREFIX相关内容
这里是设置
NGX_PREFIX
变量相关的内容,我们知道这个变量存储的值是我们最后Nginx
的安装路径,且这个值默认为空,当它为空时就在这里给他设置一个默认值/usr/local/nginx
,然后将NGX_PREFIX
写入objs/ngx_auto_config.h
文件中,宏的内容就是NGX_PREFIX
变量对应的值,也就是安装路径
代码如下:case ".$NGX_PREFIX" in .) NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx} have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define ;; .!) NGX_PREFIX= ;; *) have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define ;; esac
3.16、往objs/ngx_auto_config.h文件中写入一系列路径相关的宏
可以看到这里往
objs/ngx_auto_config.h
写入了各个路径相关的宏,这些变量的值都是在前面设置的
代码如下:if [ ".$NGX_CONF_PREFIX" != "." ]; then have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define fi have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\"" . auto/define have=NGX_HTTP_PROXY_TEMP_PATH value="\"$NGX_HTTP_PROXY_TEMP_PATH\"" . auto/define have=NGX_HTTP_FASTCGI_TEMP_PATH value="\"$NGX_HTTP_FASTCGI_TEMP_PATH\"" . auto/define have=NGX_HTTP_UWSGI_TEMP_PATH value="\"$NGX_HTTP_UWSGI_TEMP_PATH\"" . auto/define have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\"" . auto/define
3.17、设置与最终生成的Makefile相关的内容
本节对应这篇文章《Nginx编译配置脚本篇(10)- Makefile相关脚本》
这里通过调用auto/make
、auto/lib/make
、auto/install
这三个脚本来补充Makefile
和objs/Makefile
里面的内容(因为这两个文件前面已经生成了,这里就是往里面增加内容来使其更加完整)
代码如下:. auto/make . auto/lib/make . auto/install
3.18、一些其它的配置
这部分内容比较简单,没什么可讲的,
auto/stubs
脚本就是写两个宏而已,auto/summary
里面就是输出一些编译信息而已,有兴趣的读者可以自行去看一下这两个脚本的内容
代码如下:. auto/stubs have=NGX_USER value="\"$NGX_USER\"" . auto/define have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define if [ ".$NGX_BUILD" != "." ]; then have=NGX_BUILD value="\"$NGX_BUILD\"" . auto/define fi . auto/summary
4、总结
关于
Nginx
编译配置脚本的内容到这里也就全部讲完了,全部看完之后就会发现其实里面并没有多么复杂的设计,可能最难的就是那几个sed
相关的正则了吧。从这些脚本中我们可以学习到make
和Shell
相关的一些知识,虽然对于开发来说这些可能确实是用处不大,但是秉着知其所以然的理念了解一下这些知识也是挺不错的。最后,如果大佬们觉得我写的这些文章对你们有帮助的话,可以关注一下我或者我的专栏,以后会有更多有价值的文章输出的。
-
如何开发一个油猴脚本- 从零开始编写一个油猴脚本
2020-11-20 17:18:18一个没有接触过脚本开发的人如何开发一个简单而又实用的油猴脚本? 本文分为几个要点:油猴的介绍安装,脚本需求分析(重点),代码更迭,最终代码。📢博客主页:https://blog.csdn.net/mukes
📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!
📢本文由 mukes 原创,首发于 csdn
前言
之所以开发这个插件,是因为昨天在知乎看了一篇文章:为什么CSDN上很少人会去给文章点赞?,我引用一下其中一个答主的回答:
只有我自己写博客了,我才发发现这个问题,阅读几百上千,评论0,点赞 0 。可能是点赞的按钮不明显,我说说我自己看csdn博客的情况:程序遇到问题,网上查一下,按csdn的博文操作,没效果,关了继续查,有效果,继续工作。就这样了,很少去点赞,就算查了非常久的问题,结果发现在某个博主那里得到解决,也会留个评论吐槽顺便支持下博主,还是不会点赞。
这情况和我本人差不多,每次遇到问题,有时要看好几篇博文才能解决问题,而这几篇博文中恰好只有一篇才是最有价值的,也就是能解决我的问题的那篇,但是解决问题总不能白嫖吧?
至少点个赞或者留个评论如“博主666”之类的。
但是呢查文章多了发现写评论是真的浪费时间,于是我想,不如我把我一些评论事先写好,遇到对我有帮助的博文再一键点赞评论,说干就干,于是花了一点点时间就写好了这个脚本。
开发脚本之前的准备工作
1.什么是油猴(Tampermonkey )
首先,
油猴
和油猴脚本
有什么区别?
Tampermonkey 就是一款免费的浏览器扩展
和最为流行的用户脚本管理器
,它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox 等等。你安装后你的浏览器不会发生任何变动,直到你开始安装一种叫做油猴脚本(用户脚本)
的东西。油猴脚本
一般指用户脚本(User Script)
,ta 是一段 Javascript 代码,它们能够优化您的网页浏览体验。一般有包含但不限于以下几种功能:- 能为网站添加新的功能,比如本篇博文所介绍的
csdn 手动一键点赞评论
脚本。 - 能使网站的界面更加易用,比如一些
改变网站样式、排版
的脚本等。 - 能隐藏网站上烦人的部分内容,比如一些
去广告
的脚本。
博主日常用的比较多的油猴脚本网站:https://greasyfork.org/zh-CN/
2.安装油猴(Tampermonkey )
油猴官方下载地址:http://www.tampermonkey.net/
点进去你会发现上面有各个浏览器的选项;而下面则是下载地址,油猴扩展有两个版本,一个stable 版本
,一个beta 版本
,顾名思义,一个是稳定版,一个是测试版。下载稳定版就好了。油猴支持的浏览器有 Chrome, Microsoft Edge, Safari, Opera Next, Firefox,和 UC 浏览器等等,各大主流浏览器几乎都支持了。
3.新建一个油猴脚本
安装好油猴后,在浏览器工具栏上
点击油猴
,添加新脚本
接着跳转到脚本编写界面
图里的代码头是自带的,叫做元数据。每个用户脚本都含有一段元数据,用来向 Tampermonkey 描述这个脚本自身的信息:
脚本名,作者,描述,执行规则
等等// ==UserScript== // @name New Userscript // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author You // @match http://*/* // @grant none // ==/UserScript==
我粗略解释一下
// ==UserScript== // @name 这里是你的编写的油猴脚本的名字 // @namespace 这个是命名空间;用来区分名称相同但是作者不同的用户脚本,一般都是写作者的个人网址,没有也可以写你的博客地址 // @version 0.1 这个是版本号 // @description 这个是功能描述,描述你的这个脚本是用来干嘛的 // @author 这个是作者的名字,比如我:mukes // @match 这个是该脚本匹配的网址,支持通配符匹配 // @include 这个也是该脚本匹配的网址,支持通配符匹配 // @exclude 这个和 iclude 配合使用,排除匹配到的网址,优先于 include // @grant none // ==/UserScript==
match 和 include 是有一点区别的,区别在这?match更严格一点,它对 * 角色的含义设定了更严格的规则,详情点击这里
如果你
不会不想自己写一个脚本的话,那你可以去 油猴脚本网站 搜索你需要的脚本。
脚本需求分析迭代过程
我不是做好需求分析再写代码的,因为当时脑子里面只有一个朦胧的概念而已,我就打算边写边实践边改代码。
v0.1.0版本
一开始的插件是一点开博文就自动点赞和评论
然后我发现我打开自己的博文也会点赞评论…我去,不行,得改( ̄. ̄)
v0.1.0版本
在脚本文件头加了排除自动点赞评论自己博文的一行代码// @exclude https://blog.csdn.net/mukes/article/details/*
刷着刷着博文,我发现一刷新页面又会自动评论Σ( ° △ °|||)︴,那我刷新几次岂不是就会评论几次?不行,得改( ̄▽ ̄)"
v0.3.0 版本
本来想写一个函数判断自己是否评论点赞了。结果突然冒出来一个想法:有一些文章对我零作用啊,我不想点赞和评论 >_<,为什么不改成手动一键点赞评论
?so~此版本 卒╮(╯▽╰)╭
v0.4.0 版本
在浏览器页面添加一个按钮
,直接把自动点赞评论
改为手动点击
虽然我前端渣得要死,但是我也知道这个按钮是真的丑,又得改╮( ̄▽ ̄)╭
v0.5.0 版本
我又双叒叕发现了一个问题,这个按钮固定在标签页的话,如果我阅读到文章末尾,那我岂不是又要按 “home” 键回到文章开头再点赞???能一步就一步,干嘛要变成两步呢?(>_<)于是我找啊找,呀嘿~发现了 ≧◇≦
如何所示,csdn 博文页面一共有两个地方在阅读滑动鼠标的时候仍然保持不动的
那么选择哪里放按钮就显而易见了按钮改了位置后,发现样式和csdn 自带的不一致(
似乎混进了一个奇怪的东西):
留着 v1.0.0 版本再改吧,我已经看到胜利在向我招手了 b( ̄▽ ̄)d
v1.0.0 版本
此处插播一条消息:关于以上版本号为何这般命名,请参考我的另一篇博文:
版本号命名规则
要改和网页端一样的样式的话,那就需要用到一个神奇的按键 F12 了,用谷歌浏览器打开博文:https://blog.csdn.net/mukes/article/details/103480696,点击 F12 ,跳出 DevTools 工具窗口,如下图:
点击图中的箭头
然后再把鼠标移动到网页上一键三连
这个元素上
由上图就可以获得很多信息了,比如
一键三连
这个按钮的宽和高是74x28
背景颜色是#E33E33
,字体颜色为#FFFFFF
。想要看更具体的信息只需要点击一下该元素,然后在 DevTools 窗口中会自动跳到对应该元素的代码,而窗口的右边则是该元素详细的样式信息。
在样式我们又可以知道
一键三连
这个元素的圆角的边框属性为:border-radius: 4px
;
因此我们只需要改我们这个插件按钮的:
宽和高,字体颜色,底色,以及圆角边框的属性
就可以了,其他的细节就不用扣了。button.style.width = "90px"; //按钮宽度 button.style.height = "20px"; //按钮高度 button.style.align = "center"; //文本居中 button.style.color = "white"; //按钮文字颜色 button.style.background = "#b46300"; //按钮底色 button.style.borderRadius = "4px"; //按钮四个角弧度
最终代码
// ==UserScript== // @name csdn 手动一键点赞评论 // @namespace https://blog.csdn.net/mukes // @version 0.0.6 // @description 打开博文,点击一键点赞评论按钮后自动为该博文点赞以及评论,前提是已经登录 csdn 博客 // @author mukes // @include *://blog.csdn.net/*/article/details/* // @include *.blog.csdn.net/article/details/* // ==/UserScript== (function() { 'use strict'; var button = document.createElement("button"); //创建一个按钮 button.textContent = "一键点赞评论"; //按钮内容 button.style.width = "90px"; //按钮宽度 button.style.height = "28px"; //按钮高度 button.style.align = "center"; //文本居中 button.style.color = "white"; //按钮文字颜色 button.style.background = "#e33e33"; //按钮底色 button.style.border = "1px solid #e33e33"; //边框属性 button.style.borderRadius = "4px"; //按钮四个角弧度 button.addEventListener("click", clickBotton) //监听按钮点击事件 function clickBotton(){ setTimeout(function(){ var comment=["针不戳呀,写的针不戳!","学习了!b( ̄▽ ̄)d","本文不错( ̄ˇ ̄),值得学习!(= ̄ω ̄=)","感谢博主的分享!(^ ^)/▽▽\(^ ^)","感谢博主,你的文章让我得到一些收获!( ̄ˇ ̄)"]; var STARTNUMBER = -1; var ENDNUMBER = 5; var temp_count = Math.floor(Math.random()*(STARTNUMBER-ENDNUMBER+1))+ENDNUMBER ;//取STARTNUMBER-ENDNUMBER之间的随机数 [STARTNUMBER,ENDNUMBER] document.getElementsByClassName("tool-item-comment")[0].click(); //打开评论区 document.getElementById("comment_content").value = comment[temp_count]; //随机把一条预先写好的评论赋值到评论框里面 document.getElementsByClassName("btn-comment")[0].click(); //发表评论 document.getElementById("is-like").click() //点赞。把该代码注释后只会一键评论 },100);// setTimeout 0.1秒后执行 } var like_comment = document.getElementsByClassName('toolbox-list')[0]; //getElementsByClassName 返回的是数组,所以要用[] 下标 like_comment.appendChild(button); //把按钮加入到 x 的子节点中 })(); //(function(){})() 表示该函数立即执行
最终效果:
动态展示效果:
ps:如果你觉得博主写得针不戳的话,欢迎点赞收藏 ~(゜ - ゜) つロ 干杯~
如有疑问,欢迎留言讨论~
pps:如何想测试脚本可行性的话,欢迎在此界面测试,同时也把你的个性留言秀出来吧๑乛◡乛๑
最后:
感谢以下 3 位博主在我编写这个脚本时做出的巨大贡献:
https://blog.csdn.net/u010598445/article/details/108880602
https://blog.csdn.net/jayandchuxu/article/details/79113755
https://dyqdzh.blog.csdn.net/article/details/107399298官方文档
https://www.tampermonkey.net/documentation.php - 能为网站添加新的功能,比如本篇博文所介绍的
-
shell脚本编程100例
2018-07-11 16:57:19shell脚本100例,非常经典,从简单的脚本,到最后企业实战可用的复杂脚本,非常适合初学者参考学习! -
shell脚本
2021-02-02 19:26:00shell脚本就是将命令写入文本中,文本可以被执行。 二、脚本的调用形式 打开终端时系统自动调用:/etc/profile 或 ~/.bashrc /etc/profile 此文件为Linux系统为每个用户设置环境变量,当用户第一次登陆时,该文件会...以下内容来自:
脚本之家
c语言中文网
c语言中文网
shell 整形自增一、shell简介
shell是Linux系统的用户界面,它提供用户与内核的一种交互方式。它接收用户输入的命令,并把它送入内核去执行,是一个命令解释器。
shell脚本就是将命令写入文本中,文本可以被执行。
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序,又是一种脚本语言(应用程序 解析 脚本语言)。二、执行方式
- ./xxx.sh 先按照#!指定的解析器解析,如果找不到使用默认解析
- bash xxx.sh 指定使用bash解析器解析,找不到使用默认解析
- . xxx.sh 直接使用默认解析
三、脚本的调用形式
可以手动执行脚本或自动执行脚本。
手动:
①chmod +x xxx.sh(添加可执行权限) ./xxx.sh(执行脚本)
②source xxx.sh
……(还有其他方法)自动执行:写到其他脚本中,利用脚本去调用。比如写道开机脚本中,开机会自动调用。
打开终端时系统自动调用:/etc/profile 或 ~/.bashrc
/etc/profile
此文件为Linux系统为每个用户设置环境变量,当用户第一次登陆时,该文件会被执行。 系统的公共环境变量在这里设置
开始自启动的程序,一般也在这里设置。注意:错误的修改系统配置文件时,可能会导致重复输密码一直无法进入桌面的现象。
解决方法:进入终端机也就是字符界面(tty1-tty6):[Ctrl] + [Alt] + [F1] ~[F6],还原被修改的文件,重启即可。
[Ctrl] + [Alt] + [F7]返回图形界面。~/.bashrc
用户自己的家目录中的.bashrc
登录时会自动调用,打开一个新终端时也会自动调用
这个文件一般设置与个人用户有关的环境变量 ,如交叉编译器的路径等等
三、shell语法
3.1、定义以开头:#!/bin/sh
#!用来声明脚本由什么shell解释,否则使用默认shell
3.2、单个"#"号代表注释当前行
<<EOF xxxxxxx EOF 能注释多行
3.5、变量
变量定义
Shell 变量的命名规范和大部分编程语言都一样:
- 变量名由数字、字母、下划线组成;
- 必须以字母或者下划线开头;
- 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。
shell支持以下3种方式定义变量:
variable=value #普通赋值方法 variable='value' variable="value" #当变量的值(字符串)中包含任何空白符时,加双引号
赋值符两边不能有空格,若变量值本身包含了空格,则整个字符串都要用双引号、或单引号括起来。
双引号和单引号的区别
在双引号中会引用变量的值,而单引号只把它当字符处理。
**问题:在脚本中定义的变量,脚本结束后,变量和它的值还在,命令行“echo $变量名”可以查看。 **
变量类型
在shell中给变量赋值会默认视为字符串,不管有没有加双引号,即使你将整数或者小数赋值给它。
当然如果有需要也可以设置变量类型:
设置变量类型:typeset或declare可以设置变量类型。
比如:
typeset -i data 表示将data设置为int型。使用变量
使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:
author="严长生" echo $author echo ${author}
花括号{ }是可选的,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
skill="Java" echo "I am good at ${skill}Script
如果不给 skill 变量加花括号,写成echo “I am good at $skillScript”,解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号{ },这是个良好的编程习惯。
变量作用域
运行shell时,会同时存在三种变量:
1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行shell中的一些关键字
echo: 打印
echo “xxxxx” #打印字符串
echo $变量名 #打印变量的值
例如:echo $PATH 可以打印环境变量PATH的值
env #打印所有的环境变量显示结果重定向至文件
会在当前目录下创建myfile文件,并写入字符串。
echo "It is a test" > myfile
unset:变量值清除。
read: 读取键盘输入。read 变量名。读取输入的值到变量。
脚本内容:
read 从键盘读取变量的值, -p 可以在打印字符的当前行的最后输入。也可以同时读取多个值。
运行结果:
readonly:只读变量
3.6 预设变量
shell直接提供无需定义的变量。
shell脚本支持从命令行传递参数,参数之间用空格隔开:
$? 命令执行后返回的状态:返回0表示成功,非0表示失败
3.7 脚本变量的特殊用法
系统命令调用和转义字符
调用系统命令用··(反单引号)
转义字符使用加“-e”
命令序列
“()”中由子shell执行,类似于子进程(“()”内定义的变量仅在此文件有效)
“{}”由当前shell执行
3.8 变量的扩展
判断变量是否存在
这里100是因为,在之前的脚本中,定义过num变量。
两者区别“ n u m : − v a l ” 和 “ {num:-val}” 和 “ num:−val”和“{num:=val}”。
3.9字符串操作
计算字符串长度
string="abcd" echo ${#string} #输出 4
提取子串
string="alibaba is a great company" echo ${string:1:4} #输出liba
拼接字符串
your_name="qinjx" greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1
查找字符串
string="alibaba is a great company" echo `expr index "$string" is`
替换字符
string="123123" echo ${string/3/0} #用0替换第一个遇见的3 echo ${string//3/0} #用0替换串中所有3
运算符
算术运算符
Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作:
例如,两个数相加:#!/bin/bash val=`expr 2 + 2` echo "Total value : $val"
两点注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被
包含,注意这个字符不是常用的单引号,在 Esc 键下边。
test命令:用于测试字符串、文件状态和数值。
test命令有两种格式:
test condition 或[ condition ]
使用方括号时,要注意在条件两边加上空格。文件测试运算符
字符串运算符
关系运算符
3.11 与或非
数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
定义数组
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
array_name=(value0 value1 value2 value3)
或
array_name=( value0 value1 value2 value3 )
还可以单独定义数组的各个分量:
array_name[0]=value0 array_name[1]=value1 array_name[2]=value2
可以不使用连续的下标,而且下标的范围没有限制。
读取数组
读取数组
读取数组元素值的一般格式是:${array_name[index]}
如:
valuen=${array_name[2]}
使用@ 或 * 可以获取数组中的所有元素,例如:
${array_name[*]} ${array_name[@]}
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
3.12 控制语句
if控制语句
格式一: if [条件1] then 执行第一段程序 else 执行第二段程序 fi 格式二: if [条件1] then 执行第一段程序 elif [条件2] then 执行第二段程序 else 执行第三段程序 fi
注意空格
判断字符串
判断文件是否存在
case 控制语句
for循环语句
与c语言不同,循环的值可以时字符串
注意空格
扫描当前文件
while控制语句
使用while与read组合,循环读取键盘输入:while read FILM do echo "Yeah! great film the $FILM" done
until
break、continue
在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。例如:break n
表示跳出第 n 层循环。
同样,continue 后面也可以跟一个数字,表示跳出第几层循环。函数
所有函数在使用前必须定义,必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…#!/bin/bash funWithParam(){ echo "The value of the first parameter is $1 !" echo "The value of the second parameter is $2 !" echo "The value of the tenth parameter is $10 !" echo "The value of the tenth parameter is ${10} !" echo "The value of the eleventh parameter is ${11} !" echo "The amount of the parameters is $# !" # 参数个数 echo "The string of the parameters is $* !" # 传递给函数的所有参数 } funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意, 10 不 能 获 取 第 十 个 参 数 , 获 取 第 十 个 参 数 需 要 10 不能获取第十个参数,获取第十个参数需要 10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
求最值
函数分文件
fun.sh
24_sh.sh
输出重定向
命令的输出不仅可以是显示器,还可以很容易的转移向到文件,这被称为输出重定向。
命令输出重定向的语法为:
command > file
这样,输出到显示器的内容就可以被重定向到文件。
例如,下面的命令在显示器上不会看到任何输出:
who > users
打开 users 文件,可以看到下面的内容:
$ cat users oko tty01 Sep 12 07:30 ai tty15 Sep 12 13:32 ruth tty21 Sep 12 10:10 pat tty24 Sep 12 13:07 steve tty25 Sep 12 13:03
输出重定向会覆盖文件内容,请看下面的例子
$ echo line 1 > users $ cat users line 1 $
如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
$ echo line 2 >> users $ cat users line 1 line 2 $
输入重定向
和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
command < file
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
注意:输出重定向是大于号(>),输入重定向是小于号(<)。
例如,计算 users 文件中的行数,可以使用下面的命令:
$ wc -l users 2 users $
也可以将输入重定向到 users 文件:
$ wc -l < users 2 $
重定向深入了解
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
shell文件包含
像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。
Shell 中包含脚本可以使用:. filename 或 source filename
-
shell 脚本入门
2021-07-15 15:42:47一、什么是shell 脚本: 如果此时需要在终端中输入一系列命令完成一些操作,但是我们一条一条输入命令,这样就会很麻烦。那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件即可?有!就是 ... -
淘宝准点秒杀脚本
2019-11-10 02:11:19阿里云服务器 云小站_专享特惠_云产品推荐-阿里云 推荐一个薅羊毛教程地址:程序工厂 脚本技术交流群:212796668 开始教程 准备软件 下载地址 : python脚本运行环境.zip_python脚本执行未安装库-Python工具类资源-... -
ES中script脚本的使用
2021-11-09 13:46:06本文主要介绍了ES中script脚本的使用。 其主要作用是:提取字段属性,进行表达式计算。 最典型的使用场景是:定义运行时字段。 -
XSS跨站脚本攻击剖析与防御(完整版).pdf
2015-09-30 23:29:42XSS跨站脚本攻击剖析与防御(完整版).pdf,完整版电子书,可以下载下来学习,很好的学习资料 -
sql server 导入超大SQL脚本文件
2015-05-24 22:13:04sql server 导入超大SQL脚本文件.doc 说明 -
手游自动挂机脚本开发历程
2019-12-12 18:26:24时间一晃就到了两周前,大概是11月底的时候,一个朋友跟我说他玩碧蓝航线,每个月都要花20多块钱买脚本。当时听到脚本居然还要花钱去买时,作为一个程序员,不知道哪里来的正义感,决定自己给... -
109 个实用 shell 脚本
2022-02-15 10:08:39Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来... -
整活小能手!Windows系统滑动关机!一行脚本实现炫酷效果
2021-07-21 21:41:45windows操作系统,只用一行脚本。实现炫酷的滑动关机效果 -
shell脚本语言(超全超详细)
2020-04-20 22:26:20shell脚本语言1、shell的概述2、脚本的调用形式打开终端时系统自动调用:/etc/profile 或 ~/.bashrc3、shell语法初识3.1、定义以开头:#!/bin/bash3.2、单个"#"号代表注释当前行第一步:编写脚本文件第二步:加上可... -
linux编写脚本的基本方法
2021-07-27 10:36:15shell 脚本文件 shell 解释器可当作人与计算机硬件的“翻译官”, 他作为用户与linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了像判断,循环等高级编程语言有的控制流程的特性。 想要正确高效的... -
MCJ脚本 超强MCJ脚本 速度 340+
2011-05-15 23:58:06玩过 KZ的人应该知道 MCJ 把 就是连续小跳,但是很多人都不会,这个脚本就是 MCJ 脚本 移动速度达到 340+ 比赛 或者 混战中用很拉风啊 哈哈 -
什么是脚本,脚本是什么
2021-01-12 12:09:14*一、脚本是什么 脚本(Script)是一种描述性语言,依据一定格式可执行化文件。脚本是一种去重复性、多样性、简洁性、规范性、共同性的工具。简单说脚本能够将复杂、重复的工作进行简单化,有序执行的一段固定程序或... -
Photoshop 脚本指南
2020-04-01 10:26:56Photoshop 脚本指南一. 介绍关于本手册:约定二. Photoshop脚本基础脚本概览为什么使用脚本而不是动作?Photoshop中的脚本支持JavaScript支持执行其他脚本启动脚本从AS或VBS中调用的JavaScripts脚本Photoshop 对象... -
VisionPro之脚本(一文读懂VisionPro脚本原理与使用方法)
2020-03-23 22:52:39文章目录一、脚本简介二、脚本类与功能三、脚本使用案例四、脚本进阶 一、脚本简介 在介绍脚本之前先简单介绍一下VidionPro开发环境(QuickBuild)的项目结构,Job是QuickBuild工程的基本组成单位,一个QucikBuild... -
京东准点秒杀脚本【2020】
2019-11-10 01:20:47直接上菜 1.浏览器打开https://www.jd.com/,登录京东 2.选择要抢购的商品 ...3.按键盘F12,打开开发者模式,选择Console选项卡 ...4.把以下代码粘贴在Console里面,修改代码里开始抢购时间(有二处时间) ... conso... -
青龙羊毛——可用脚本
2022-03-18 23:01:43往期的一些脚本或者教程已经失效了,还有很多朋友问我怎么抓包怎么操作,现在更新一篇博文总结一下往期内容,同时后续更新也会同步到这篇博文里面! 该博文只做目录与索引之用,同时对羊毛大小进行分类,别再来问我... -
编写一个完整的python脚本(新建脚本--编写脚本--执行脚本)
2021-09-10 00:19:591、python脚本的格式是什么 举个例子来说明:hello.py中hello是脚本名,py脚本格式 2、脚本的结构 #coding:utf-8 //脚本头 一个空行分割 import os //引用部分 两个空行的分割 print(‘欢迎大家’)//业务... -
新功能,赶紧用起来,CSDN浏览器助手-脚本功能,兼容油猴脚本安装使用
2021-12-16 22:57:28好插件·用户造,CSDN寻找最佳产品体验官 |有奖征文赛进行中...... ???? 作者:Linux猿 ??...,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!...三、脚本功能· -
Redis使用Lua脚本详解
2021-08-15 13:50:31本文将讲解 RedisLua脚本的基本操作以及与 Java项目的集成使用。 Lua脚本 Lua是一个高效的轻量级脚本语言,在葡萄牙语中是“月亮”的意思,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,... -
青龙面板拉取常用脚本(JD签到) 目前在维护的脚本更新
2021-09-10 13:44:20拉取单个脚本 ql raw <fileurl> 使用方法: 一、添加库:进入面板-右上角“定时任务”-分别填入相关信息。提供个人设置,给大家参考。其中人物名、任务定时可自定义。 二、运行库任务添加脚本:分别点击每个... -
lua脚本工具。可以调试.带破解。
2013-03-21 16:44:55lua脚本工具。可以调试 lua脚本工具。可以调试带破解。 -
24h脚本,24h脚本
2021-07-29 09:44:4124h自阅脚本 -
Lua脚本语言——Lua脚本基础语法
2020-06-06 16:22:471、LUA是一门脚本语言 ①、什么是脚本? 脚本语言又被称为扩建的语言,或者动态语言,是一种编程 语言,用来控制软件应用程序,脚本通常以文本(如ASCII)保存,只在 被调用时进行解释或编译 ②、 脚本语言的执行 ... -
什么是脚本,脚本语言?
2018-10-01 21:28:39一、脚本 百科解释: 脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。 脚本通常可以由应用程序临时调用并执行。各类脚本目前被广泛地应用于网页设计中,因为...
-
备份<em>脚本</em>oracle备份<em>脚本</em>,rac 备份。全备份差异备份等
-
部署<em>脚本</em>部署<em>脚本</em> 通过系统管理或RMM软件部署Probe / Docker容器/轻量级代理的<em>脚本</em> 如果您可以为此做出贡献,请通过CyberCNS Slack与我联系(@
-
bash<em>脚本</em>Bash<em>脚本</em> 嗨,这些是我的bash<em>脚本</em>,到目前为止,我已经完成了一些基本的bash<em>脚本</em>编写。
-
服务器<em>脚本</em>服务器<em>脚本</em> 我制作了一些<em>脚本</em>,使我的VPS上的生活更加轻松:)
-
数据库<em>脚本</em>数据库<em>脚本</em> 数据库<em>脚本</em> 数据库<em>脚本</em> 数据库<em>脚本</em> 数据库<em>脚本</em>