试试脚本

脚本是啥?

生活中的脚本

“脚本”一词来源于演艺界,指拍摄戏剧、电影所依据的底本

公馆一室内
王妈:(小心翼翼地)小姐,您还是得注意身子,就吃点东西吧。
鸡小姐:(把碗砸在地上)不吃,我就是不吃。
(王妈下)

事先剧组写好脚本,演出时依据脚本内容,设置舞台,演员按照剧本说出台词,做出动作,还有灯光道具等等。

当然,脚本也并不局限于此。
生活中也有许多脚本,领导上台的演讲,什么时候声音大一点,小一点,表情是怎么样的;老师备课,准备预计讲什么内容,什么时候一些提出小问题,答错了怎么引导学生思考,什么时候分享小故事,什么时候刺激学生,提高学生注意……

简而言之,其实就是根据写好的计划,让对象做指定的动作,一切都在把控之中。

计算机中的脚本

计算机是个很复杂的东西,为了让人类来操控它,有最基础的处理器指令集,处理器接受到二进制的机器码,执行指定动作,然而机器码的可读性很差,人类最易理解的是自然语言,汇编就在此产生了,给这些机器码加上了名字,随着计算机能力的提高,能做的越来越多,有了更多的指令,做更多的事,汇编的代码越来越多,但是大量汇编代码在一起,是及其难懂的,为了更好的进行开发并更好的让人类理解,高级语言出现了,也就是我们目前的接触的程序语言。

高级语言的确让开发更简单容易了,但是高级语言始终需要转换成机器码,编译、链接,直到运行,需要大量的时间,这种语言被称为编译型语言,为了解决这个问题(其实还有更多原因,比如跨平台问题),解释性语言出现了,解释型语言并不把整个项目进行全部编译成机器码,而是以行为单位,逐条编译运行,脚本语言也就出现了,只需输入可读的文字命令,就能立即执行动作,所输即所得。

值得注意的是,解释型,编译型,并不是个绝对的概念,解释性语言也并不等于脚本,实际情况中有很多混合的地方,比如java,首先源代码经过编译变成跨平台的字节码(中间码),然后字节码交由java虚拟机进行解析,整个过程既有编译的地方,又有解释的地方。许多脚本语言也可以经过整体编译后再执行,所以这之间的界限并不明确。

自己写一个简单脚本

默认Linux系统
目标:自动根据给出的文件名生成目录,并在其下生成index.html及相关js,css文件夹及文件

 ├── css
 │   └── style.css
 ├── index.html
 └── js
     └── main.js

bash脚本

bash是Unix操作系统的纯命令的人机交互界面,也是控制Unix系统的脚本语言,可以通过编写bash脚本来自动控制操作系统。

bash脚本住主要由日常使用的命令组成,很方便
新建一个文件,输入:

1
2
3
4
5
6
7
8
9
10
11
if [ -d $1 ]; then
echo 'error: dir exists'
exit
else
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
echo 'success'
exit
fi

保存退出
添加执行权限:chmod +x 文件名
sh ./文件名 搞定

nodejs

能在服务器端运行的JavaScript的运行环境
同样新建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

var fs = require('fs')
var dirName =process.argv[2]

if(fs.existsSync("./"+dirName)){
process.exit(1);
}else{
fs.mkdirSync("./"+dirName)
process.chdir("./"+dirName)
fs.mkdirSync('css')
fs.mkdirSync('js')

fs.writeFileSync("./index.html","")
fs.writeFileSync("css/style.css","")
fs.writeFileSync("./js/main.js","")
process.exit(0)
}

同样保存退出,添加执行权限

使用node.js运行它

1
$ node ./文件名

不想每次打开都输入node?
添加

1
#!/usr/bin/env node

这样就指定使用了node运行,实际上不指定,使用的是

1
#!/bin/bash

也就是bash解释器(吧?)。

给自己写的脚本添PATH

写了脚本执行却总需要加上路径?
添加进PATH就可以解决

  1. 打开~/.bashrc

    1
    vim ~./bashrc
  2. 找个喜欢的位置输入

    1
    export PATH="脚本所在的绝对路径:$PATH"

    保存退出

  3. 应用修改

    1
    source ~./bashrc

    ok,现在就可以在任何地方执行脚本啦!

    如果要查看你目前的PATH路径

    1
    echo $PATH

    看看我的

    1
    2
    echo $PATH
    /home/geylnu/bin:/home/geylnu/.local/bin:/home/geylnu/local:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

匹配命令是从PATH路径从前向后找,优先是使用前面的可执行程序。
可以使用type -a 命令,查询命令匹配的选项,使用which 命令,查看要最终执行的是哪一个。