Shell入门笔记

Shell脚本:Linux Shell脚本学习指南
菜鸟教程 - Shell教程
Linux入门 - Shell脚本是什么
Linux chmod命令

github同步 - Shell入门

一、Shell是什么

Shell入门笔记_第1张图片

Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。


shell其实是一个命令解释器,由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。你看,在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,何乐不为呢?在Linux下,这个命令行程序叫做 Shell

​ Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。

  • 交互的方式:从键盘输入命令,通过/bin/bash的解析,可以立即得到Shell的回应
[root@clsn ~]# ls            
anaconda-ks.cfg  
  • 非交互的方式:如果我们的命令或者应用程序不在命令行直接执行,而是通过一个程序文件来执行时,这个程序就被称之为shell脚本,通过文件执行脚本的方式称之为非交互方式
[root@clsn ~]# ./firstShell.sh

拓展:命令行提示符

[mozhiyan@localhost ~]$

- []是提示符的分隔符号,没有特殊含义。
- mozhiyan表示当前登录的用户,我现在使用的是 mozhiyan 用户登录。
- @是分隔符号,没有特殊含义。
- localhost表示当前系统的简写主机名(完整主机名是 localhost.localdomain)。
- ~代表用户当前所在的目录为主目录(home 目录)。如果用户当前位于主目录下的 bin 目录中,那么这里显示的就是- bin。
- $是命令提示符。Linux 用这个符号标识登录的用户权限等级:如果是超级用户(root 用户),提示符就是#;如果是普通用户,提示符就是$。

二、Shell 是一种脚本语言

任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。

有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。

这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)

而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。

这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器

编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。

脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。

三、Shell的分类

Shell脚本是什么 - Shell的分类

Shell种类全称 缩写 概要
Bourne Shell sh sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
Boume Again Bash Bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版 默认配置的 shell
C Shell csh C Shell 是广为流行的 Shell 变种。C Shell 主要在 BSD 版的 UNIX 系统中使用,发明者是柏克莱大学的 Bill Joy。C Shell 因为其语法和 C 语言类似而得名,这也使得 UNIX 的系统工程师在学习 C Shell 时感到相当方便。
TC Shell tcsh tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
Z Shell zsh Zsh属于Shell中的一种,但比Bash好用,而且完全兼容Bash,拥有及其丰富的插件。
➜  ~ bash -version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

四、查看系统中的shell

4.1、查看系统中的shell

➜  ~ cat /etc/shells 
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

4.2、查看默认shell

➜  ~ echo $SHELL
/bin/zsh

4.3、修改系统默认shell

当前默认为zsh,改为bash

➜  ~ chsh -s /bin/bash
Changing shell for qiyeyun.
Password for qiyeyun: 

输入密码,重启Terminal,完成。

4.4、切换shell

// 默认shell
➜  ~ echo $SHELL
/bin/zsh

// 切换bash
➜  ~ bash
bash-3.2$ 

// 返回默认shell
➜  ~ bash
bash-3.2$ exit
exit
➜  ~ 

4.5、查看zsh/bash版本

➜  ~ zsh --version
zsh 5.3 (x86_64-apple-darwin18.0)
➜  ~ bash -version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

五、Hello World

5.1、编写hello world脚本

➜  ~ vim helloworld.sh

// 在文本写入
#!/bin/bash
echo "Hello World!!!"

// :wq 保存

5.2、执行报错,添加权限

1.执行报错

➜  ~ ./helloworld.sh
permission denied: ./helloworld.sh         // 错误提示,没有权限执行

2.添加权限 - Linux chmod命令

➜  ~ chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

r=4,w=2,x=1

  • 若要rwx属性则4+2+1=7;
  • 若要rw-属性则4+2=6;
  • 若要r-x属性则4+1=5。

3.再次执行脚本

➜  ~ chmod 777 helloworld.sh 
➜  ~ ./helloworld.sh 
Hello World!!!

5.3、执行脚本的几种方式

1. 直接使用 Bash 去解释脚本中的内容

➜  ~ bash helloworld.sh 
Hello World!!!

2. 绝对路径/相对路径执行

➜  ~ /Users/github/Shell学习/helloworld.sh 
Hello World!!!
➜  ~ ./helloworld.sh 
Hello World!!!

3. source命令 等同于 .

➜  ~ source helloworld.sh 
Hello World!!!
➜  ~ . helloworld.sh 
Hello World!!!

4. 将脚本加入系统命令

macOS/Linux 环境变量设置

Shell 脚本是否可以像 Linux 系统命令一样,不用指定路径,直接运行呢?当然是可以的,不过需要进行环境变量的配置。

====== 测试在bash环境下,而不是zsh下 ======
1、打开环境变量文件
$ open ./.bash_profile

2、在.bash_profile文件中加入shell脚本的路径, 注意:是目录,不需要文件
# add by linxiang 2019.08.07 for shell script
export PATH=/Users/qiyeyun/Downloads:$PATH

3、执行命令立即加载生效
$ source ./.bash_profile

4、查看PATH
$ echo $PATH
/Users/qiyeyun/Downloads:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/MacOS:/Users/qiyeyun/.rvm/bin

5、脚本能在任意目录下用啦
$ helloworld.sh 
Hello World!!!

5. 拓展:(source与.命令)

source命令(从 C Shell 而来)是bash shell的内置命令。

. 命令 就是个点符号(从Bourne Shell而来)是source的另一名称。

六、执行方式 bash、 "." 、"./" 、source比较

新建一个 test.sh

#!/bin/bash

# PPID父进程 ,当前进程为$$
echo PID is $$
echo Parent PID is $PPID

开启全部权限

$ chmod 777 test.sh

6.1、是否创建子shell

分别用不同方式执行

$ echo $$
2163
$ bash test.sh 
PID is 2253
Parent PID is 2163
$ ./test.sh 
PID is 2254
Parent PID is 2163
$ /Users/qiyeyun/github/iOS-/Shell学习/test.sh
PID is 2258
Parent PID is 2163
$ source test.sh 
PID is 2163
Parent PID is 2162
$ . test.sh 
PID is 2163
Parent PID is 2162

结论:

  1. bash和"./"命令都是打开一个子shell来读取并执行FileName中命令;
  2. source是与"."类似,是在当前工作环境中执行,配置文件就是影响当前的工作环境,这种情况下用source;

6.2、关闭执行权限

将执行权限全部关闭

$ chmod 666 test.sh

再一次执行

$ bash test.sh 
PID is 2234
Parent PID is 2163
$ ./test.sh
-bash: ./test.sh: Permission denied
$ /Users/qiyeyun/github/iOS-/Shell学习/test.sh 
-bash: /Users/qiyeyun/github/iOS-/Shell学习/test.sh: Permission denied
$ source test.sh 
PID is 2163
Parent PID is 2162
$ . test.sh 
PID is 2163
Parent PID is 2162

结论:

  1. "./"(相对/绝对路径)执行需要执行权限;

6.3、表格

执行方式 无执行权限是否可执行 是否打开子shell
bash 可执行 打开子shell
./(相对/绝对路径) 无法执行 打开子shell
source / . 可执行 当前shell环境

你可能感兴趣的:(Shell入门笔记)