2019-03-19
本文的前置知识
Linux 基本命令行操作
推荐博文
非常好的bash脚本编写教程
在了解过 Linux 的一些简单的命令后(同样适用于 Windows 上的gitbash),今天,我接触到了如何使用 gitbash 编写一些 简单脚本的方法。
什么是脚本?
脚本:Scripting Language
脚本是一种编程语言,用来控制软件应用程序,脚本通常以文本的形式保存,只有在被调用的时候才进行解释或编译。
较为著名的脚本语言有:
Shell,php,JavaScript,Perl,Lua等等,这些语言在本质上 都属于脚本语言。
脚本语言更为形象的解释:
举一个通俗易懂,并较有名气的案例:
公馆一室内
王妈:(小心翼翼地)小姐,您还是得注意身子,就吃点东西吧。
鸡小姐:(把碗砸在地上)不吃,我就是不吃。
(王妈下)
这段内容 就是一段脚本。脚本的书写由编剧或导演完成,而演员,道具只需要根据脚本的具体内容具体执行并表现出来就可以了。
计算机当中的脚本和戏剧脚本在本质上相差无异,只不过脚本的编写需要由程序员完成,而执行的对象 变成了计算机。
这么看来,脚本就是我们要求计算机去做的内容或者是说脚本是我们要求计算机完成某些具体功能的指令集。
使用gitbash 写一个简单的bash脚本
- bash属于Shell 脚本的一种,使用gitbash 写一个简单的脚本。
- 首先,在d盘创建文件夹 demo,并进入demo文件夹中
cd d:
mkdir demo
cd demo
- 创建文件夹 script 并新建文件script.sh
mkdir script
cd script
touch script.sh
.sh文件 是Unix/Linux操作系统的脚本文件,但实际上 文件后缀并无作用,可以将script.sh 命名为 script.txt 甚至直接命名为 script 都可以 ,后缀名并不能决定一个文件的内容,重要的是这个文件将会被什么执行。
- 编辑script.sh 文件的内容
script.sh 的内容 即是 脚本,也就是需要计算机去执行的命令集
脚本需要完成的事情是:
创建一个标准的前端项目目录
这个目录的名字叫project 在project目录下 有一个index.html 页面
同时 有 css文件夹 以及 js文件夹
css文件夹有一个 style.css层叠样式文件
js文件夹下有一个 main.js文件
也就是说,在输入执行脚本的命令后,计算机应该代替我们完成目录的生成。那么脚本的内容应该就是告诉计算机 如何去生成这样的一个目录结构。
使用 vim 命令 打开script.sh 文件vim script.sh
并按“i”进入编辑模式
输入脚本
脚本内容如下:(windows)
#!/usr/bin/sh
if [ -d project ];then
echo 'error:dir is exists'
exit 1
else
mkdir project
cd project
mkdir css js
touch index.html css/style.css js/main.js
echo 'Hello bashscript' >> index.html
echo 'success'
exit 0
fi
- 首先脚本中的第一行
#!/usr/bin/sh
含义:
符号#!即Shebang ,
Shebang用来告诉系统它后面的参数是用来执行该文件的程序,即定义使用哪种解释器来解释脚本
除了#!/usr/bin/sh
这种写法还有其他的一些写法
如:
#!/usr/bin/bash
本文仅仅涉及到简单的脚本,不会涉及到解释器等概念(实际上我还没搞懂,等以后我搞懂了,会写一篇关于二者区别的文章)
对于第一条脚本命令 暂时只需要知道
#!
的作用是在执行这个脚本时,它会把文件名及其参数一起作为参数传给Shebang符号后面的那个路径的解释程序去执行。 - 第二个需要解释说的是if ..else 语句
bash 脚本规定了 if...else语句的写法
其格式为:
if ....; then
....
elif ....; then
....
else
....
fi
本例中脚本 if[ -d project ];的含义为 如果已经存在了文件夹 project 需要注意 空格 bash 脚本语法及其严格。
在[ ] 里面无论是 -d 还是 project 的前后都有空格
- 第三个需要解释说明的为 exit 即返回值
exit 0 表示没有错误
exit 1表示错误代码为 1
通常 与符号 && 或 || 进行使用
如:
/d/demo/script/script.sh && echo '执行成功'
这样的写法不仅会打印出success 还会打印出 '执行成功'
接下来执行命令 chmod +x script.sh
这个命令的含义是 给 script.sh 可执行权限,windows不需要执行此命令,但是执行也不会报错,Linux下 则务必需要执行此命令
现在 回到demo 目录下 cd ../
使用命令
/d/demo/script/script.sh
这里面务必要写绝对路径
其实 这个'命令' “正确”的写法应该是
sh /d/demo/script/script.sh
但是,在脚本中 我们已经写好了Shebang 所以这个脚本文件 会由/usr/bin/下面的 sh.exe完成执行
所以 这里面/d/demo/script/script.sh
不是一个'地址' 而是 一个'命令'
执行后 出现了success的字样 说明 脚本执行成功
通过 ls 命令可以看到在demo目录下生成了 一个 project 目录 cd 进入后 使用
tree 命令 ,(windows没有tree这个命令 需要下载插件 具体流程在我的文章 Linux 基本命令行操作)
tree
查看目录结构为:
$ tree
.
|-- css
| `-- style.css
|-- index.html
`-- js
`-- main.js
这种目录结构完全和我们想要的结果一致。
有没有觉得,每次执行脚本都要执行那么一段长句 麻烦死了!
通过配置环境变量就会让脚本的执行变得异常简单
而且,项目的命名也不是很灵活,有没有办法可以自己定义项目的名称呢?
- 环境变量
Linux 命令与环境变量有着密不可分的联系。
实际上,Linux 命令都是一个一个的可执行文件,当我们每次在bash里面输入一个命令例如 ls ,bash 都会去PATH 列表里面去寻找这个命令所对应的文件,如果找到了就执行。
可以通过命令 which 来进行确认
which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
如运行:
which cp
返回结果/usr/bin/cp
which ls
返回结果/usr/bin/ls
通过命令:echo $PATH
即可打印出 PATH 所有的路径并且 windows用户可以发现在 打印出的路径中 每一个 路径都用" : "进行分隔,仔细查找后,就会发现有/usr/bin这样的一个路径。
通过ls /usr/bin
命令可以打印出 每一个命令所对应的可执行文件
以下操作请谨慎模仿
危险操作:
那么如何确定bash执行的就是/usr/bin目录下面的文件呢
可以通过修改命令的方法去验证一下。
- 首先 进入到 /usr/bin目录下
- 执行命令
mv ls.exe ls1.exe
将原有的ls.exe 文件 重命名为 ls1.exe文件 - 执行命令
touch ls.exe
并vim ls.exe
写入echo 'hahaha'
- 执行命令
source ls.exe
解释说明:source 命令的作用是当修改某文件 并希望其立刻生效,而不用重新登陆就可以使用该命令
source 通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。 - 执行 ls 命令
接下来执行ls命令就会在bash 中 打印出 'hahaha' 这样的字段了
我们也验证了 命令的执行实际上就是在执行 一个个文件 。 - 接下来删除掉 ls.exe文件 并重新将 ls1.exe重命名为 ls.exe
具体操作步骤为:
rm ls.exe
mv ls1.exe ls.exe
source ls.exe
如果上面的操作中 有一步失败了,那么可能就要重新装gitbash了 因为 rm操作 很难进行文件的恢复 ,我第一次 在第六步操作时 粗心大意输入了rm ls1.exe
搜索了一些教程后放弃了恢复操作 直接重新下载了 gitbash 所以,危险操作 不要轻易尝试。
危险操作结束
既然知道了bash是从环境变量里去寻找命令相对应的执行文件并执行的 那么脚本的执行命令也就能通过添加环境变量而变得简单了
cat ~/.bashrc
首先先看看有没有.bashrc这个文件 如果没有则:
touch ~/.bashrc
.bashrc文件是 配置环境变量路径时需要用到的文件 在.bashrc文件中可以进行 环境变量的配置vim ~/.bashrc
使用vim 进行编辑 添加 这样一段命令:
export PATH="/d/demo/script/:$PATH"
/d/demo/script/ 是 script.sh 所在的目录 通过这样一行命令 便可以添加环境变量使用命令
source ~/.bashrc
source 的作用已经解释过了现在在bash上使用
script.sh
也可以 执行脚本了进入到 /d/demo/script 目录下 使用命令
mv script.sh script
想必到这里我们终于可以理解了 为什么后缀名 没有实际的意义
而且,现在只需要简单的script
这样一小段命令 就可以执行我们的脚本文件了
现在已经解决了输入大长串命令带来的烦恼 但是还有一个问题如何每次都能生成自己想要的项目名称?现在的脚本只能生成 名为project的文件夹 是否有方法可以 生成自己的目录名称
脚本改动如下:
#!/usr/bin/sh
if [ -d $1 ];then
echo 'error:dir is exists'
exit 1
else
mkdir $1
cd project
mkdir css js
touch index.html css/style.css js/main.js
echo 'Hello bashscript' >> index.html
echo 'success'
exit 0
fi
可以看到 原本的project
的位置变成了 $1
$1
表示你传的第一个参数
现在 就可以通过 script 项目名
创建 自己想要的项目结构了
使用gitbash 写一个简单的node.js脚本
使用node.js 完成同样的操作
在使用node.js前 需要知道以下几个操作
- 使用 js 打印当前目录,相当于 bashscript的
pwd
process.cwd()
- 进入目录,相当于 bashscript的
cd
process.chdir("pach")
因为,我使用的是windows系统,这里面的路径不能像bash一样使用类似于"/d/demo"这样的格式 而是需要使用"D:\demo"这样的路径格式
- 使用js 创建目录
let fs = require("fs")
fs.mkdirSync("dirName')
- 使用js 创建文件
let fs = require("fs")
fs.writeFileSync("./fileName","")
在了解这些内容以后,使用node.js完成 bash创建目录的相同功能
进入demo目录下并创建nodescript文件夹
cd /d/demo
,mkdir nodescript
,cd nodescript
创建文件 demo.js 并 写入脚本内容
touch demo.js
vim demo.js
js脚本内容为:
#!/usr/bin/env node
var fs = require("fs")
var dirName = process.argv[2]
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)
脚本解释:
-
#!/usr/bin/env node
Shebang 标明这一段脚本 使用 /usr/bin env node 文件进行执行
如果没有Shebang
则每一次程序的运行都要使用node 命令 同 bash 下的 sh 命令一样 -
process.exit(0)
表示退出
这一段脚本 可以进行环境变量的配置
具体执行步骤同bash一样
在windows下
使用命令 start ~/.bashrc
打开记事本编辑
添加内容export PATH="/d/demo/nodescript:$PATH"
执行完毕后 使用 source ~/.bashrc
命令 使文件生效
-
chmod +x /d/demo/nodescript/demo.js
使demo.js具有可执行权限 windows用户不需要执行这句话 但是最好还是执行
因为Linux下不执行这句话 会无法运行脚本 而windows 系统下 执行这句话也不会报错
接下来在任意目录下
就可以使用 demo.js 项目名
来执行脚本创建目录结构了,当然 也可以对文件名进行修改
mv demo.js 自定义命令名称
可以使用 自定义脚本命令名称 项目名称
在git bash 上完成 脚本的执行
另外:附上 nodejs.org 的参考链接
参考链接