脚本的简单运用

写脚本Bash脚本、Node.js脚本
node.js中文文档:http://nodejs.cn/api/

写一个脚本

  1. 找个地方(比如local)新建文件.sh
    1
    2
    3
    mkdir ~/local
    cd ~/local
    touch demo.sh
  • 打开并往 demo.sh 里添加以下内容:

    1
    2
    3
    4
    5
    mkdir demo
    cd demo
    mkdir css js
    touch index.html css/style.css js/main.js
    exit
  • 运行脚本
    在任意位置执行 sh ~/local/demo.sh 即可运行此脚本

    1
    2
    cd ~/Desktop
    sh ~/local/demo.sh

然后你会看到当前目录里多出一个 demo 目录,demo 目录里面还有一些文件

  • 依次运行cd demo,然后在cmd模式下运行tree /f

好了,这个 demo.sh 就是你写出的第一个 Bash 脚本了。

path

将 ~/local 添加到 PATH 里

  1. cd ~/local; pwd 得到 local 的绝对路径
  • 创建 ~/.bashrc:touch ~/.bashrc
  • 编辑 ~/.bashrc:start ~/.bashrc,在最后一行添加 export PATH=”local的绝对路径:$PATH”
  • 执行source ~/.bashrc 使其生效
  • 之前你要运行 sh ~/local/demo.sh,现在你只需要运行 demo.sh ,不需要添加路径了
  • demo.txt 的后缀 .txt 很无聊,删掉它
    mv ~/local/demo.txt ~/local/demo
    现在你只要运行 demo 就能执行该脚本了。

细节

  1. 文件后缀的作用:毫无作用
  2. PATH 的作用
    你每次在 Bash 里面输入一个命令时(比如 ls、cp、demo),Bash 都会去 PATH 列表里面寻找对应的文件,如果找到了就执行。
  3. 使用 type demo 可以看到寻找过程
  4. 使用 which demo 可以看到寻找结果

参数

demo 脚本只能创建名字为 demo 的目录,太无聊了,我们让目录名是可变的吧。
$1是第一个参数、$2是第二个参数、$3$4……..

1
2
3
4
5
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
exit

此时在相应的文件夹里运行demo 参数,比如demo hello 就会在这个文件夹内生成一个名为hello的目录,里面有一些文件

完善版
判断是否存在和$1同名的文件夹
打开并编辑demo文件

1
2
3
4
5
6
7
8
9
10
11
12
if [ -d $1 ]; then
echo 'error: dir exists'
exit 0
else
mkdir $1
cd $1
mkdir css js
echo -e "<!DOCTYPE>\n<title>Hello</title>\n<h1>Hi</h1>\n" > index.html
touch css/style.css js/main.js
echo 'success'
exit 1
fi

  • echo -e "abc\ndef" 输出:
    1
    2
    abc
    def

-e表示启用解释反斜杠转义

  • exit 0 表示没有错误
  • exit 1 表示错误代码为 1
  • 命令1 && 命令2 :命令1执行成功后才会执行命令2
  • 命令1 || 命令2 :命令1执行失败时,执行命令2
  • 命令1 ; 命令2 : 命令1执行完后,执行命令2

Node.js 写脚本

我们在 Bash 命令行里输入 Bash 命令,也可以在 Node.js 命令行里输入 JS 命令(Ctrl + D 退出)
Bash 脚本能做的事情,JS 脚本也能做。(sh demo.sh 对应 node demo.js

Node.js命令

node 进入node模式

切换目录

  • console.log(process.cwd()) : 显示当前目录路径,等同于bash里的pwd
  • process.chdir("/Users/frank/Desktop") 进入相应的目录,等同于bash里的cd ~/Desktop
  • console.log(1) :等同于bash里的echo 1
  • 创建目录
    1
    2
    let fs = require("fs")
    fs.mkdirSync("目录名")

创建文件

1
2
let fs = require('fs')
fs.writeFileSync("./index.html", "内容") .表示当前文件夹

用 JS 脚本来重写 demo.sh

  • 在bash模式下,执行cd ~/local进入目录
  • touch jsdemo : 创建js脚本
  • 打开jsdemo文件,编辑它内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var fs = require('fs')
    var dirName = process.argv[2] // 你传的参数是从第 2 个开始的
    process.chdir("/Users/stage/desktop/test") // cd ~/Desktop/tset
    fs.mkdirSync("./" + dirName) // mkdir $1
    process.chdir("./" + dirName) // cd $1
    fs.mkdirSync('css') // mkdir css
    fs.mkdirSync('js') // mkdir js
    fs.writeFileSync("index.html", "")
    fs.writeFileSync("css/style.css", "")
    fs.writeFileSync("js/main.js", "")
    process.exit(0)
  • 退出node模式

  • cd ~/Desktop/目录名 进入需要执行node命令的目录
  • node ~/local/jsdemo 参数 :比如node ~/local/jsdemo testFile

shebang的作用

我们每次执行 ~/local/jsdemo 参数 都要在最前面添加 node 来执行,能不能做到不加 node也能执行呢(也就是指定执行环境),可以,在 jsdemo 里第一行加上这一句即可:
#!/usr/bin/env node :指定这个文件用node模式来执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env node
var fs = require('fs')
var dirName = process.argv[2] // 你传的参数是从第 2 个开始的
process.chdir("/Users/stage/desktop/test") // cd ~/Desktop/tset
fs.mkdirSync("./" + dirName) // mkdir $1
process.chdir("./" + dirName) // cd $1
fs.mkdirSync('css') // mkdir css
fs.mkdirSync('js') // mkdir js
fs.writeFileSync("index.html", "")
fs.writeFileSync("css/style.css", "")
fs.writeFileSync("js/main.js", "")
process.exit(0)

然后你就可以直接用 ~/local/jsdemo.js 参数 了(省得输入 node 了)

如果你已经把 ~/local 加入了 PATH,那么甚至可以直接输入 jsdemo 参数 来执行

-------------本文结束感谢您的阅读-------------