理解脚本
JavaScript 是一门动态类型、面向对象的脚本语言。
脚本就是给计算机照着做的一行行的文本。
比如下面这就是个脚本:
cd ~/Desktop
mkdir demo
cd demo
echo "hi" > index.html
cd ~/Desktop
写一个Bash脚本
- 找个地方新建文件,比如 ~/local 目录下,新建文件的后缀随意, .sh 或者 .txt 之类的都可以:
i.mkdir ~/local
ii.cd ~ /local
iii.touch demo.txt
- 编辑 demo.txt ,内容如下:
mkdir demo
cd demo
mkdir css js
touch index.html css/style.css js/main.js
exit
- 给 demo.txt 添加执行权限
chmod +x demo.txt
(Windows 不需要) - 在任意位置执行
sh ~/local/demo.txt
即可运行此脚本:
i.cd ~/Desktop
ii.sh ~/local/demo.txt
iii. 你会看到当前目录里多出一个 demo 目录,demo 目录里面还有一些文件
这个 demo.txt 就是你写出的第一个Bash 脚本了。 - 你觉得每次都要输入这么长一段代码太麻烦了?
我们可以将 ~/local 添加到 PATH 里,这样以后只要输入 demo.txt 执行就可以了。
i.cd ~local
;pwd
得到local 的绝对路径
ii. 临时设置 PATH
a. 运行export PATH="local的绝对路径:$PATH"
,这句话是把 local 目录加到 PATH 里
b. 这时你只要运行demo.txt
就相当于运行sh ~/local/demo.txt
了
iii. 永久设置 PATH ,上面的 PATH 在你重启 BASH 后就会失效,如果你希望 PATH 一直生效,看下面
a. 创建 ~/.bashrc :touch ~/.bashrc
b. 编辑 ~/.bashrc :start ~/.bashrc
c. 在编辑器里添加一行字:export PATH="local的绝对路径:$PATH"
,关闭编辑器
d.source ~/.bashrc
e. 现在你只要运行demo.txt
就相当于运行sh ~/local/demo.txt
了,即使 BASH 重启了也一直有效 - 你还可以删掉 demo.txt 的后缀:
i.mv ~/local/demo.txt ~local/demo
ii. 现在你只要运行demo
就能执行该脚本了。
细节
- PATH 的作用
每次在 Bash 里面输入一个命令时(比如 ls、cp、demo),Bash 都会去 PATH 列表里面寻找对应的文件,如果找到了就执行。 - 使用 type demo 可以看到寻找过程
- 使用 which demo 可以看到寻找结果
- 文件的后缀的作用:毫无作用!毫无作用!毫无作用!
一个文件以 .exe 结尾未必可以双击运行,一个文件以 .png 结尾也未必就是图片。
参数
上面的 demo 脚本只能创建名字为 demo 的目录,让我们做些修改,使目录名字是可变的。
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
exit
$1表示你传的第一个参数。怎么知道的?谷歌(百度)啊!
Google http://lmgtfy.com/?q=bash+first+param
百度 http://www.baidu-x.com/?q=bash+%E7%AC%AC%E4%B8%80%E4%B8%AA+%E5%8F%82%E6%95%B0
判断目录是否已存在
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
返回值
-
exit 0
表示没有错误 -
exit 1
表示错误代码为1
demo && echo "结束"
只有在 demo 成功时,才会执行echo "结束"
Node.js 写脚本
上面写的脚本叫做 Bash Script(Bash脚本)。
JS 的全称叫做 JavaScript(Java脚本),虽然 JS 和 Java 没什么关系,但是 JS 依然是一种脚本。
- 我们在 Bash 命令行里输入 Bash 命令,也可以在 Node.js 命令行里输入 JS 命令(Bash 里输入
node
进入 Node 命令行,Ctrl + D 退出) - Bash 脚本能做的事情,JS 脚本也能做。(
sh demo.sh
对应node demo.js
)
用 JS 切换目录
console.log(process.cwd()) // 打印当前目录
// process.chdir("~/Desktop"); // 这句话不行的,因为 JS 不认识 ~ 目录
process.chdir("/User/Roc/Desktop")
console.log(process.cwd()) // 打印当前目录
console.log 就相当于 echo
用 JS 脚本创建目录
Google nodejs create dir
文档:https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_mode
let fs =require("fs")
fs.mkdirSync("demo")
用 JS 脚本创建文件
Google nodejs create file
文档: https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options
let fs = require('fs')
fs.writeFileSync("./index.html", "")
用 JS 脚本来重写 demo.sh
- 创建 ~/local/jsdemo.js,内容如下
var fs = require('fs')
var dirName = process.argv[2] // 你传的参数是从第 2 个开始的
fs.mkdirSync("./" + dirName) // mkdir $1
process.chdir("./" + dirName) // cd $1
fs.mkdirSync('css') // mkdir css
fs.mkdirSync('js') // mkdir js
fs.writeFileSync("./index.html", "") // echo "" > index.html
fs.writeFileSync("css/style.css", "") // echo "" > css/style.css
fs.writeFileSync("./js/main.js", "") // echo "" > js/main.js
process.exit(0) // exit 0
- (Windows 用户跳过这一步)给 jsdemo.js 加上执行权限
chmod +x ~/local/jsdemo.js
cd ~/Desktop
-
node ~/local/jsdemo.js zzz
,就可以看到 zzz 目录创建成功了
判断目录是否已存在
文档:https://nodejs.org/api/fs.html#fs_fs_existssync_path
var fs = require('fs')
fs.existsSync(path)
shebang
蛇棒一般是指Dota中剧毒术士的2技能或者暗影萨满的大招。
shebang是指“#!”,它取自#(SHArp)和!(bang)。它是很多脚本文件中第一行的前两个字符,用来指明执行这个脚本文件的解释程序。
我们每次执行 ~/local/jsdemo.js 都要用 node 来执行,如果想要不加 node 也能执行(也就是指定执行环境),需要在 jsdemo.js 第一行加上这一句:
#!/usr/bin/env node
(以下操作在 Windows 上可能失败,失败了就算了)
- 然后你就可以直接用 ~/local/jsdemo.js zzz 了(省得输入 node 了)。
- 如果你已经把 ~/local 加入了 PATH,那么甚至可以直接输入 jsdemo.js zzz 来执行。
- 如果你再把 jsdemo.js 的后缀 .js 去掉,就可以直接 jsdemo zzz 了。
注意,你每次执行前最好删掉 zzz 目录,以免发生冲突。
总结
- 脚本就是给机器一行一行执行的文本
- Bash 脚本有 Bash 脚本的语法,Node.js 脚本有JS 的语法
- 不管是哪种脚本,能实现的功能都差不多,只是语法不同
- Bash 脚本的语法挺奇葩的,比如
$1
、$#
等符号 - 不用特别去学 Bash 脚本的用法,遇到不会的就 Google
- 不用特别去学 Node.js 脚本的用法,遇到不会的就 Google
- 新人写代码最大的问题就是抄错了!
i. 多写或者少写了一个空格
ii. 多写或者没写分号
iii. 单词拼错了
iv. 字母大小写错了