Shell脚本系列(一)
目录
-
Shell脚本系列(一)
-
Shell脚本系列(二)
-
Shell脚本系列(三)
-
Shell脚本系列(四)
-
Shell脚本系列(五)
-
Shell脚本系列(六)
-
Shell脚本系列(七)
-
Shell脚本系列(八)
1、背景
前几天趁着项目的空档期,我学习和研究了一下Shell。感觉是对Shell有一定的基本的了解了。在这里总结一下。
因为我是按照 菜鸟教程 学习的,所以大部分内容与此网站一样,只是有个别自己在使用过程中踩过的坑,在这里类似与读书笔记备注一下。另外以后在使用Shell的过程中,如果有使用心得、或者遇到的坑也会及时的来更新。所以喷我抄袭的人就绕道吧。
可能有人会说,网上已经有资源了,你还在这里复制一份,为什么呢,三点:
1)网络资源虽然有,但是没有写读书笔记的地方,我想把自己的读书笔记资料放到一块;
2)有可能你对网上的某个资源很感兴趣,收藏了资源的链接,但是有时候链接会失效,然后你就找不到那个资源了。这点我深有体会,抖音上我收藏了某个视频,但是视频所有者一下架,我就看不到了,所以最好的办法是复制一份。
3)网上已经有的资源,我就没必要花时间再去写一份了,我要做的就是撰写网上没有的资源,这样才能创造更大的价值。把时间花在创新上,而不是一味的复制上。
2、什么是Shell
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其他程序。简单来说:Shell就是一个用户跟操作系统之间交互的命令解释器。在一些复杂的Linux维护工作中,大量重复的输入和交互操作不但费时费力,而且容易出错.编写脚本的好处:批量的处理,自动化的完成维护,减轻管理员的负担。
Shell独立于内核,它是链接内核和应用程序的桥梁。内核是linux系统的心脏,从开机自检就驻扎在计算机内存中,直到计算机关闭为止。用户的应用程序存储在计算机硬盘上,仅当需要时才被调入内存。Shell是一种应用程序,当用户登陆linux系统时,Shell就会被调用到内存执行。
3、Shell脚本的作用
Shell是OS内核与用户之间的桥梁,用Shell脚本就能批处理。
4、Shell环境
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……
本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
5、如何运行Shell
5.1、方式一:切换到Shell脚本所在的目录(工作目录)执行
脚本必须要有执行权限。
./的意思是当前目录,说在当前的工作目录下执行hello.sh。如果不加上./,bash可能会响应找到不到hello.sh的错误信息。因为目前的工作目录 (/data/Shell)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中。查看PATH的内容可用 echo $PASH 命令。现在的/data/Shell就不在环境变量PASH中的,所以必须加上./才可执行。
5.2、方式二:以绝对路径的方式执行
脚本必须要有执行权限。
5.3、方式三:直接使用bash 或sh 来执行bash Shell脚本
如果以这种方式执行,可以不必事先设定Shell的执行权限,甚至都不用写Shell文件中的第一行(指定bash路径)。因为方法三 是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行,而是被人家调用执行,所以不要执行权限。那么不用 指定bash路径自然也好理解了啊,呵呵……。
5.4、方式四:在当前的Shell环境中执行bash Shell脚本
前三种方法执行Shell脚本时都是在当前Shell(称为父Shell)开启一个子Shell环境,此Shell脚本就在这个子Shell环境中执行。Shell脚本执行完后子Shell环境随即关闭,然后又回到父Shell中。而方法四则是在当前Shell中执行的。该种方式不需要脚本有执行权限。
示例:
# 方式一: cd /data/Shell ./hello.sh
# 方式二: /data/Shell/hello.sh
# 方式三: cd /data/Shell bash hello.sh 或 cd /data/Shell sh hello.sh
# 方式四: cd /data/Shell . hello.sh 或 cd /data/Shell source hello.sh # 附:授予文件可执行权限 chmod +x test.sh
6、Shell的辅助编辑工具
6.1、工具一:在web上线编辑(不需要安装)
比如:菜鸟教程的bash在线编辑器,但是这个网站编辑,我暂时发现它运行的时候不能读取你的输入(就是read)
6.2、工具二:在Idea里面编辑(有语法提示)
可以参考这篇博客配置 Idea插件之——Bashsupport编辑Shell脚本
6.3、工具三:在Linux服务器上编辑(最原始)
7、Shell的注释
7.1、单行注释
利用“#”进行单行注释;
7.2、多行注释
# 1、多行注释 # 1.1、多行注释——方式一 :<<! 这里是被注释的代码块
这里是被注释的代码块 ! # 1.2、多行注释——方式二 if false then 这里是被注释的代码块
这里是被注释的代码块 fi # 1.3、多行注释——方式三 ((0)) && { 这里是被注释的代码块
这里是被注释的代码块 }
示例:
echo "开始执行"; echo "输出1"; # 单行注释 # echo "输出2"; echo "输出3"; # 多行注释:方式一 :<<! echo "输出4"; echo "输出5"; ! echo "输出6"; echo "输出7"; # 多行注释:方式二 if false; then echo "输出8"; echo "输出9"; fi echo "输出10"; echo "输出11"; # 多行注释:方式三 ((0)) && { echo "输出12"; echo "输出13"; echo "输出14"; } echo "结束执行"; #输出: # 开始执行 # 输出1 # 输出3 # 输出6 # 输出7 # 输出10 # 输出11 # 结束执行
8、第一个Shell脚本
#!———— #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。 echo:用户字符串的输出。 #!/usr/bin/env bash # 第一个Shell脚本 echo "Hello world!"; echo "这是我的第一个Shell脚本!";
9、Shell变量
9.1、变量定义
格式:变量名=变量值
例子:my_name="Ernest",myAge=18
规则:
1)变量名和等号之间不能有空格(强制),
2)命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
3)中间不能有空格,可以使用下划线(_)。
4)不能使用标点符号。
5)不能使用bash里的关键字(可用help命令查看保留关键字)。
9.2、变量类型
1) 局部变量 局部变量在脚本或命令中定义,仅在当前Shell实例中有效,其他Shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括Shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候Shell脚本也可以定义环境变量。
3) Shell变量 Shell变量是由Shell程序设置的特殊变量。Shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了Shell的正常运行
9.3、变量使用
使用一个定义过的变量,只要在变量名前面加美元符号即可
your_name="qinjx" echo $your_name echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done
如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。推荐给所有变量加上花括号,这是个好的编程习惯。
已定义的变量,可以被重新定义,如:
your_name="tom" echo $your_name your_name="alibaba" echo $your_name
这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。
9.4、只读变量
使用“readonly”修饰的变量为只读变量,只读变量的值不能被改变,如果被重新赋值,会报错
9.5、变量删除
使用“unset”命令来删除变量,但是该命令不能删除只读变量(即readonly修饰的变量)
示例:
#!/usr/bin/env bash # 使用unset 来删除变量的定义,但是只读属性是删除不了的 company="大XX|车X拍" readonly department="车源产品运营部" echo "我所在的公司是 ${company},而我所在的部门是 ${department}" unset company unset department echo "我所在的公司是 ${company},而我所在的部门是 ${department}"
10、其他
10.1、Shell必须以.sh结尾吗?
不是必须的,任何的文件名都可以,只是以.sh结尾是人们的一种约定而已。
10.2、Shell与Shell脚本的区别
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell 脚本(Shell script),是一种为 Shell 编写的脚本程序。业界所说的 Shell 通常都是指 Shell 脚本,但读者朋友要知道,Shell 和 Shell script 是两个不同的概念。由于习惯的原因,简洁起见,本文出现的 "Shell编程" 都是指 Shell 脚本编程,不是指开发 Shell 自身(如Windows Explorer扩展开发)。
参考:https://www.runoob.com/linux/linux-shell.html