7.Linux系统的Shell


 

目录

1.了解Shell 

2.Shell的变量功能

本地变量

环境变量

位置变量

3.系统的环境变量


1.了解Shell 

1.1.什么是Shell?

翻译成中文shell就是外壳的意思,那他有什么用?我们知道管理整个计算机硬件的其实是操作系统的核心 (kernel),这个核心是需要被保护的,同时操作系统给会给出一个接口然你来控制这个操作系统的某些进程,而这个沟通的媒介就是Shell,在Linux系统中可能会内嵌很多种Shell,他们的目的都是和操作系统进行通信,常用的是Bash,这个Shell中的一种。

1.2.shell的工作流程

我们知道不管我们执行什么命令,到最后都是由硬件来执行这个任务的,那他的运作流程是什么呢?加入我们需要播放音乐的话,当我们下达指令,计算机需要去做什么?

1. 硬件:当然就是需要你的硬件有『声卡芯片』这个配备,去驱动你的喇叭;
2. 核心管理:操作系统的核心可以支持这个芯片组,当然还需要提供芯片的驱劢程序;
3. 应用程序:需要使用者 (就是你) 输入发生声音的指令!

1.3.如何使用shell呢?

shell是一个看不到,摸不着的东西,当使用KDE桌面时,可以打开一个终端,这个终端是一个软件,它可以帮我们连接到shell,但是注意,这个终端并不是shell,它只起一个连接的作用

1.4.Linux系统中存在哪些Shell((以 CentOS 5.x 为例)?

可以通过查看档案:/etc/shells 查看当前系统Shell的种类,默认使用的是bash

  /bin/sh (已经被 /bin/bash 所取代)
 /bin/bash (就是 Linux 预设的 shell)
  /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
  /bin/tcsh (整合 C Shell ,提供更多的功能)
  /bin/csh (已经被 /bin/tcsh 所取代)
  /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)

如果你想切换到某个shell直接在命令行上输入shell的名字就行,例如:切换到ksh

1.6.为什么使用shell?

1.shell使用的是命令行,处理速度快。

2.远程管理如果使用命令的话,传输数据就小,控制流畅。

3.shell支持大量的快捷键,提高用户的效率。

1.7.shell命令和系统命令

shell是系统在安装的时候自动安装上去的,查找一个命令在哪的话,使用wihch  命令,比如 which ls

找一下 cd 这个命令的位置,命令:which cd,在PATH环境变量下,找不到cd这个命令,那为什么我们可以执行cd这个命令进行目录进行跳转呢?

举个例子,使用window系统来演示,我们现在直接的cmd命令行直接输入:qq这个命令,提示说找不到这个命令,当我们进入到qq安装路径下的文件时,然后再次执行这个命令时,系统就打开了一个qq的登陆接口。所以说这个命令是我在安装qq之后生成的,如果不安装这个软件的话也不会有这个命令,所以我们系统原本没有cd这个命令,但是安装了shell之后,cd是shell内置的命令,不是系统的命令。

如何查看cd命令是否属于shell内嵌的命令?

使用命令:type cd


2.Shell的变量功能

2.1什么是变量?

就是让某一个特定字符串代表不固定的内容就是了,比如:a=5,左边是一个可以变化的字符,右边是一个固定的数字。

使用变量的好处就是可以让系统的运作流程变得简单。

2.2.如何使用变量

本地变量

  • 本地变量的特点时,只会在当前的Shell起作用不会,影响带其他的子shell

定义一个本地变量的方法:变量名=值   

注意:变量名可以由字母、数组、下划线组成,不可以使用数字开头,等号两边不要有空格。

例子1:

定义一个本地变量,a=20  。 注意:打印的时候不加 $ 字符,会吧a当作普通字符来使用,打印出来的就是a这个字符。

取消一个变量的设定:unset  变量名

取消变量a的设定:

 例子2:

本地变量的设定只会在当前shell起作用,不会影响到其他的子shell,现在在一个shell中创建一个变量b然后打开另一个shell看一下这个本地变量是否还存在?


环境变量

  • 环境发量可以帮我们实现很多种功能~包括家目录的变换、提示字符的显示啊、执行文件搜寻的路径等等。
  • 环境变量的特点是它会影响到所有的子shell

如何定义一个环境变量?

方法:export  变量名=值

注意:如果已经设定了一个本地变量a,那么使用export  a ,可以把这个本地变量变成一个环境变量。

例子:

环境变量可以影响到所有的子shell,在父shell中新建一个变量c,给其复制20,然后打开一个子shell,然后打印这个环境变量:


 2.3如何查看所有的变量?

使用命令:set , 就会显示系统所有的变量,包括本地和环境变量。

  • 只查看系统的环境变量

使用命令:env 

提示:使用export export -pset都可以查看系统的环境变量

  • 使用export查看环境变量

可以看到使用export查看环境变量显示时多了一个词:declare

  • declare / typeset 的用法

declare 与 typeset 是一样的功能,就是在『宣告变量的类型』。如果使用 declare 后面幵没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通列出来,就好像使用 set 一样。

命令:declare

语法:declare [-aixr] variable

选项及其含义 

选项 含义
-a 将后面名为variable的变量定义成数组(array)的类型。
-i 将后面名为variable的变量定义成整数数字(integter)类型
-x 用法与export一样,将后面的variable变成环境变量。
-r 将变量设定为readonly类型,该变量的内容将不可被更改,也不可取消(unset)该变量
+x 可以将环境变量转变为位置变量

位置变量

  • 当我们在写脚本的时候这个位置变量很重要

例:1:

写一个脚本文件,命令为test.sh,使用vim打开,编辑脚本文件

运行脚本然后给这个程序8的参数:

例子2:

直接使用set设置位置变量的值,使用命令,set  1 2 3 4 5 6 7 8,然后打印位置变量的值看一下:

试着设的长一点,使用命令:set 1 2 3 4 5 6 7 8 9 a b c d e,当打印第11个位置变量的时候好像出错了

注意:如果使用命令:echo $11,会首先显示$1的内容然后再次显示$1的内容,同时打印出两个11了,咋看起来是11.所以当位置变量的数字大于两位数的时候,加一个大括号,比如:echo ${11} 

那么 :$0 代表什么意思呢?$#呢?$*呢?

解释:$0 代表的是整个程序的名字,$# 代表的是未知变量的个数,$* 表示所有的位置变量

例子3:

修改test.sh这个脚本程序,测试 $0,$#,$*的功能

编辑后保存,运行脚本程序:


3.系统的环境变量

  • HOME

代表用户的家目录。可以用cd 命令去到我们的家目录下,使用cd命令不加任何的参数既可以回到家目录。不同的用户拥有唯一的家目录,其实就是取用这个变量的值。

  • SHELL

记录当前系统所用的shell

  • HISTSIZE

这个与历史命令有关, 我们曾经下达过的指令令可以被系统记录下来,而记录的『笔数』则是由这个值来决定。

  • MAIL

当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱档案 (mailbox)。

  • PATH

执行文件搜寻的路径~目录与目录中间以冒号(:)分割, 由于档案的搜寻是依序由 PATH 的变量内得目录来查询,所以,目录的顺序也是重要。

  •  LANG

语系数据,很多讯息会用到它, 丼例杢说,当我们在启动某些 perl 癿程序语言档案时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误!一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,这两个编码偏偏不容易被解译出来,所以,有癿时候,可能需要修订一下语系数据。

  •  RANDOM

就是『随机数』的变量!目前大多数的 distributions 都会有随机数生成器,那就是 /dev/random 这个档案。 我们可以透过这个随机数档案相关的变量 ($RANDOM) 来随机取得随机数值。在 BASH 的环境下,这个 RANDOM 变量得内容,介于 0~32767 之间,所以,你叧要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要使用 0~9 之间癿数值呢,利用 declare 宣告数值类型。

  • PS1:(提示字符的设定)

这个就是显示我们命令提示符,当我们执行一个命令之后,在#号前面都有一些提示信息,比如你当你当前所在路径等等,这些东西通过PS1变量你可以自行设定的。

设定符号的意义:

符号 含义
\d 显示星期、月、日的日期格式,如Mon  Jun  6
\H 完整的主机名,如:www.yuan.com
\h 仅仅取主机名在第一个小数点之前的名字,如:www
\t 显示时间24小时格式:HH:MM:SS
\T 显示时间12消失格式:HH:MM:SS
\A 显示时间24消失格式:HH:MM
\@ 显示时间12消失格式:am/pm 样式
\u 目前使用者账号,如:yuangege,或root
\v bash版本信息
\w 完整的工作目录,由根目录开始,家目录以~取代
\W 利用basename函数获取工作目录名称,仅列出最后一个目录名
\# 当前下达的是第几个指令
\$ 提示字符,如果是root时,提示符为#,否则就是$

例子:看一下当前我们提示符的设定:

可以看到显示的样式和设定的是一模一样的。

我们也可以去更改一下环境变量PS1的值,我们让他显示在最前面显示一个时间,显示完整主机名,然后显示完整的工作目录。

使用命令:PS1="[\t @\u@\H \w]\$"


  • PS2

当我们写程序的时候一行不够写,只需要输入一个反斜杠,自动就会跳入到下一行继续这个命令,而在继续命令之前还有一个提示符,这个提示符即使PS2设定的,看一看默认的提示符是什么?

同样我们也可以去修改这个提示符,把这个提示符改成:————》

使用命令:PS2="——》"


4.变量的键盘读取、数组与宣告: read, array, declare

4.1.read

作用:用来读取键盘的变量。

语法:

read [-pt] variable

选项

选项 含义
-p 后面可以接提示符
-t 后面接等待的描述,不会一直等待用户输入

如果read后面什么都不跟,直接加上变量的名字,底下就会有一个空白行让你输入,按回车就等于是给这个变量赋值了。

当系统遇到read,程序就不会往下走了,等待用户输入,才往下执行。

例子:

使用命令:read   aa ,然后输入一段数组,回车

如果输入命令,什么都不跟的话是赋值给哪个变量,那就是默认的变量:REPLY

比如:输入read   然后输入88888,回车,再打印REPLY的值

例子2: 

read 用作脚本的输入:

新建一个:test.sh的脚本,然后使用vim编辑器编辑

方式一:

方式二:

方式三:

执行这个脚本:

猜你喜欢

转载自blog.csdn.net/qq_36243942/article/details/82942634