脚本编程基础知识

你以为什么是脚本?

  不知道你有没有接触过高级编程语言,比如C、C++、Java等,这些语言的执行通常需要经过编写-编译-链接-运行等过程,而脚本语言则不然。一个脚本通常是解释运行而非编译。
  我们在维基百科上搜Script(脚本),得到的结果有两个——剧本和脚本程序。虽然说两个是不一样的东西,但依然是可以放在一起理解的。所谓的剧本,就是演员照着一步一步做的东西。比如下边的这一段

  而我们编程领域的脚本程序不是给人照着做的,而是给计算机照着做的。你输入指令,让计算机能够看懂,然后计算机为你一步一步执行这些指令。

让我们来试着写一个脚本?

  1. 进入一个目录,然后新建脚本文件,一般脚本文件的后缀是.sh,但是它并没有什么用。在Windows下文件的后缀名决定着该文件的默认打开方式,但在命令行下,打开方式是我们手动指定的,比如vim demo.txt或者open -a 'Google Chrome' demo.txt都是可以的。所以命令行下我们写后缀主要还是给我们自己看,让我们自己一眼就知道这个文件是个什么文件。
      我们在/f/wcy/local文件目录下建立一个demo.sh文件。
  2. 编辑demo.sh文件。vim demo.sh(当然,你也可以用其他方式打开然后编辑。或者你也可以写下其他的脚本代码。)
mkdir demo //新建一个名为demo的目录
cd demo //进入demo这个目录
mkdir css js //新建两个文件夹css和js
touch index.html css/style.css js/main.js //新建三个文件
exit //退出
  1. (Windows不需要)给demo.sh添加执行权限chmod +x demo.sh
  2. 在你需要执行该脚本的目录执行sh /f/wcy/local/demo.sh,然后你就可以在当前目录看到你需要的demo文件夹以及里边你使用脚本创建的文件了。
  3. 事实上,你可以现在结束这篇文章,因为你已经成功地运行了一个你自己写的脚本。但是,作为一名程序员,你还需要知道一些其他的东西。比如——把你的脚本文件目录添加到path中。
      玩过java的应该对path都不会太陌生,虽然可能并不能理解path的含义,但是多少都应该是听过的。这里我不想太深入写,只能说,path里边可以写一堆目录,我们每次输入命令的时候都会依次在这些目录里边查找有没有同名的文件,如果有就执行。
      type命令可以显示这个查找的过程。which命令可以告诉你查询最终的结果是什么,比如which mkdir在我这边执行的结果就是/usr/bin/mkdir。在计算机当中,所有的命令都是可执行文件,也就是,脚本。计算机中不可执行的文件是配置文件,就是我们常说的config文件。
      以上,我们只需要把/f/wcy/local(请修改成你的脚本文件存在的目录)添加到~/.bashrc(这个文件不解释了,以前解释过。常见问题合集,修改bash命令路径下有这个文件的作用,事实上你可以不用了解。)
      先进入local目录,输入pwd得到它的绝对路径。然后touch ~/.bashrc创建.bashrc文件。接着打开文件,在最后一行添加export PATH="local的绝对路径:$PATH"。然后source ~/.bashrc。成功。之前你需要运行sh /f/wcy/local/demo.sh而现在你可以不需要输入路径直接运行sh demo.sh了。
  4. 仅仅是创建一个名为demo的文件夹会不会太单调了呢?让我们来加个参数吧!
      在bash里边,$1表示第一个参数,别问我怎么知道的,自己搜去。你只需要看懂下边的代码就好了,有需要的功能再去搜索。
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
exit

  现在,你可以运行sh demo.sh aa来创建一个名为aa的文件夹了。
7. 如果说我已经创建过一个名为aa的文件夹,然后又来运行sh demo.sh aa呢?显而易见,它是会报错的。那么我们能不能不让它报那么难看的错,给用户一个提示信息呢?是的,加一个判断。如果这个文件存在,那么就让它输出”The directory is already exist!”,如果不存在那就创建。所以,你可以Google一下bash脚本的if语句怎么用。这里是代码。

if [ -d $1 ]; then
  echo 'The directory is already exist!'
  exit 1 //表示程序运行出错,错误代码为1
else
  mkdir $1
  cd $1
  mkdir css js
  touch index.html css/style.css js/main.js
  echo 'success'
  exit 0 //表示0个错误
fi
  1. 是的,经过上述步骤基本已经完成了一个小脚本案例了。我们最后来进行测试环节。
sh demo.sh aa && echo '成功' //如果前边的程序执行成功就显示字符串“成功”
sh demo.sh bb || echo '失败' //如果前边的程序返回的是非0,显示“失败”

换个node.js脚本玩玩?

  我们上边写的脚本是Bash Script(Bash脚本),现在,换个我们前端用的js脚本玩玩?基本规则其实都差不多,两个的语法方面略微有一点差别。你想要实现什么功能的话都可以去Google。比如你可以搜索node js change dir,来找到如何在node下转换路径。你也可以进入nodejs官网nodejs.org–>docs–>api直接在里边查,比如文件系统(file system—fs)的一些操作。

node //先进入node
process.chdir('F:\\wcy\\local') //改变系统路径到你需要的目录(这个路径写法是windows下的写法。。。保持微笑不吐槽)
console.log(process.cwd())  //得到当前所处路径并打印出来console.log()相信你不会陌生。
//Ctrl+D退出node环境

  上边用bash命令我们执行写的是sh demo.sh,如果你省略sh直接写demo.sh依然可以得到你想要的结果。因为系统默认使用sh(即shell)来运行脚本。但到了这里可就不行了。你知道的,文件后缀并不影响,所以如果你依然用shell来执行demo.js文件,显然是有问题的。我们一般会用node demo.js来运行这个文件。如果你想让这个文件默认用node执行,请在文件的第一行加上#!/usr/bin/env node
综上,将上述功能换成js脚本的话,就应该是这样的:

#!/usr/bin/env node
var fs = require('fs');
dirName = process.argv[2] // 你传的参数是从第 2 个开始的
if (fs.existsSync(dirName)) {
    console.log("The file is already exist");
    process.exit(1);
}
    fs.mkdirSync("./" + dirName) // mkdir $1
    process.chdir("./" + dirName) // cd $1
    fs.mkdirSync('css') // mkdir css
    fs.mkdirSync('js') // mkdir js
    fs.writeFileSync("./index.html", "<!DOCTYPE><title>Hello</title><h1>Hi</h1>")
    fs.writeFileSync("css/style.css", "h1{color: red;}")
    fs.writeFileSync("./js/main.js", "var string = 'Hello World' alert(string)")
    process.exit(0)

  这里对第三行稍微解释一下,为什么前边bash传的参数算是第一个而后边js算是第二个呢?给一段代码吧,反正我是这样理解的。demo.sh xxnode demo.js xx,从0开始数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章