bash 及 node.js 简单的脚本入门

2019-03-19
本文的前置知识
Linux 基本命令行操作
推荐博文
非常好的bash脚本编写教程

在了解过 Linux 的一些简单的命令后(同样适用于 Windows 上的gitbash),今天,我接触到了如何使用 gitbash 编写一些 简单脚本的方法。

什么是脚本?

脚本Scripting Language
脚本是一种编程语言,用来控制软件应用程序,脚本通常以文本的形式保存,只有在被调用的时候才进行解释或编译。

较为著名的脚本语言有
Shell,php,JavaScript,Perl,Lua等等,这些语言在本质上 都属于脚本语言。

脚本语言更为形象的解释
举一个通俗易懂,并较有名气的案例:

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

这段内容 就是一段脚本。脚本的书写由编剧或导演完成,而演员,道具只需要根据脚本的具体内容具体执行并表现出来就可以了。
计算机当中的脚本和戏剧脚本在本质上相差无异,只不过脚本的编写需要由程序员完成,而执行的对象 变成了计算机。
这么看来,脚本就是我们要求计算机去做的内容或者是说脚本是我们要求计算机完成某些具体功能的指令集。

使用gitbash 写一个简单的bash脚本

  • bash属于Shell 脚本的一种,使用gitbash 写一个简单的脚本。
  1. 首先,在d盘创建文件夹 demo,并进入demo文件夹中
cd d:
mkdir demo
cd demo
  1. 创建文件夹 script 并新建文件script.sh
mkdir script
cd script
touch script.sh

.sh文件 是Unix/Linux操作系统的脚本文件,但实际上 文件后缀并无作用,可以将script.sh 命名为 script.txt 甚至直接命名为 script 都可以 ,后缀名并不能决定一个文件的内容,重要的是这个文件将会被什么执行。

  1. 编辑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目录下面的文件呢
可以通过修改命令的方法去验证一下。


timg.jpg
  1. 首先 进入到 /usr/bin目录下
  2. 执行命令 mv ls.exe ls1.exe
    将原有的ls.exe 文件 重命名为 ls1.exe文件
  3. 执行命令 touch ls.exevim ls.exe 写入 echo 'hahaha'
  4. 执行命令 source ls.exe
    解释说明:source 命令的作用是当修改某文件 并希望其立刻生效,而不用重新登陆就可以使用该命令
    source 通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
  5. 执行 ls 命令
    接下来执行ls命令就会在bash 中 打印出 'hahaha' 这样的字段了
    我们也验证了 命令的执行实际上就是在执行 一个个文件 。
  6. 接下来删除掉 ls.exe文件 并重新将 ls1.exe重命名为 ls.exe
    具体操作步骤为:
    rm ls.exe
    mv ls1.exe ls.exe
    source ls.exe

如果上面的操作中 有一步失败了,那么可能就要重新装gitbash了 因为 rm操作 很难进行文件的恢复 ,我第一次 在第六步操作时 粗心大意输入了rm ls1.exe 搜索了一些教程后放弃了恢复操作 直接重新下载了 gitbash 所以,危险操作 不要轻易尝试。

危险操作结束

既然知道了bash是从环境变量里去寻找命令相对应的执行文件并执行的 那么脚本的执行命令也就能通过添加环境变量而变得简单了

  1. cat ~/.bashrc 首先先看看有没有.bashrc这个文件 如果没有则:
    touch ~/.bashrc
    .bashrc文件是 配置环境变量路径时需要用到的文件 在.bashrc文件中可以进行 环境变量的配置

  2. vim ~/.bashrc
    使用vim 进行编辑 添加 这样一段命令:
    export PATH="/d/demo/script/:$PATH"
    /d/demo/script/ 是 script.sh 所在的目录 通过这样一行命令 便可以添加环境变量

  3. 使用命令 source ~/.bashrc source 的作用已经解释过了

  4. 现在在bash上使用script.sh也可以 执行脚本了

  5. 进入到 /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前 需要知道以下几个操作

  1. 使用 js 打印当前目录,相当于 bashscript的pwd
process.cwd()
  1. 进入目录,相当于 bashscript的 cd
process.chdir("pach")

因为,我使用的是windows系统,这里面的路径不能像bash一样使用类似于"/d/demo"这样的格式 而是需要使用"D:\demo"这样的路径格式

  1. 使用js 创建目录
let fs = require("fs")
fs.mkdirSync("dirName')
  1. 使用js 创建文件
let fs = require("fs")
fs.writeFileSync("./fileName","")

在了解这些内容以后,使用node.js完成 bash创建目录的相同功能
进入demo目录下并创建nodescript文件夹
cd /d/demomkdir nodescriptcd 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)

脚本解释:

  1. #!/usr/bin/env node
    Shebang 标明这一段脚本 使用 /usr/bin env node 文件进行执行
    如果没有Shebang
    则每一次程序的运行都要使用node 命令 同 bash 下的 sh 命令一样
  2. process.exit(0)
    表示退出

这一段脚本 可以进行环境变量的配置
具体执行步骤同bash一样
在windows下
使用命令 start ~/.bashrc打开记事本编辑
添加内容export PATH="/d/demo/nodescript:$PATH"
执行完毕后 使用 source ~/.bashrc 命令 使文件生效

  1. chmod +x /d/demo/nodescript/demo.js
    使demo.js具有可执行权限 windows用户不需要执行这句话 但是最好还是执行
    因为Linux下不执行这句话 会无法运行脚本 而windows 系统下 执行这句话也不会报错

接下来在任意目录下
就可以使用 demo.js 项目名来执行脚本创建目录结构了,当然 也可以对文件名进行修改
mv demo.js 自定义命令名称
可以使用 自定义脚本命令名称 项目名称 在git bash 上完成 脚本的执行

另外:附上 nodejs.org 的参考链接
参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容