Shell基础知识

防伪码:长风破浪会有时,直挂云帆济沧海。

1.1 l Shell  简介

Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理,

Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。

下面是处理流程示意图:

Shell 既然是工作在 Linux 内核之上,那我们也有必要知道下 Linux 相关知识。

Linux 是一套免费试用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任

务、支持多线程和多 CPU 的操作系统。

1983 年 9 月 27 日,Richard Stallman(理查德-马修-斯托曼)发起 GNU 计划,它的目标是创建一

套完全自由的操作系统。为保证 GNU 软件可以自由的使用、复制、修改和发布,所有的 GNU 软件都

有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU 通用公共许可

证(GNU General Plubic License,GPL),说白了就是不能做商业用途。

GNU 是"GNU is Not Unix"的递归缩写。UNIX 是一种广泛使用的商业操作系统的名称。

1985 年,Richard Stallman 又创立了自由软件基金会(Free Software Foundation,FSF)来为

GNU 计划提供技术、法律以及财政支持。

1990 年,GNU 计划开发主要项目有 Emacs(文本编辑器)、GCC(GNU Compiler Collection,GNU 编

译器集合)、Bash 等,GCC 是一套 GNU 开发的编程语言编译器。还有开发一些 UNIX 系统的程序库和

工具。

1991 年,Linuxs Torvalds(林纳斯- 托瓦兹)开发出了与 UNIX 兼容的 Linux 操作系统内核并在

GPL 条款下发布。

1992 年,Linux 与其他 GUN 软件结合,完全自由的 GUN/Linux 操作系统正式诞生,简称 Linux。

1995 年 1 月,Bob Young 创办 ACC 公司,以 GNU/Linux 为核心,开发出了 RedHat Linux 商业版。

Linux 基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。与 Unix 思想十分

相近。

l 1.2 Shell  基本分两大类

1.2.1 图形界面 Shell(GUI Shell)

GUI 为 Unix 或者类 Unix 操作系统构造一个功能完善、操作简单以及界面友好的桌面环境。

主流桌面环境有 KDE,Gnome 等。

1.2.2 命令行界面 Shell(CLI Shell)

CLI 是在用户提示符下键入可执行指令的界面,用户通过键盘输入指令,完成一系列操作。

在 Linux 系统上主流的 CLI 实现是 Bash,是许多 Linux 发行版默认的 Shell。还有许多 Unix

上用的 Shell,例如 tcsh、csh、ash、bsh、ksh 等等。

1.3  第一个 l Shell  脚本

本教程主要讲解在大多 Linux 发行版下默认 Bash Shell。Linux 系统是 RedHat 下的 CentOS 操作系

统,完全免费。与其商业版 RHEL(Red Hat Enterprise Linux)出自同样的源代码,不同的是

CentOS 并不包含封闭源代码软件和售后支持。

用 vi 打开 test.sh,编写:

# vi test.sh

#!/bin/bash

echo "Hello world!"

第一行设置运行环境,第二行打印 Hello world!

写好后,开始执行,执行 Shell 脚本有三种方法:

方法 1:直接用 bash 解释器执行

# bash test.sh

Hello world!

方法 2:添加可执行权限

# ll test.sh

-rw-r--r--. 1 root root 32 Aug 18 01:07 test.sh

# chmod +x test.sh

# ./test.sh

-bash: ./test.sh: Permission denied

# chmod +x test.sh

# ./test.sh # ./在当前目录

Hello world!

方法 3:source 命令执行,以当前默认 Shell 执行

# source test.sh

Hello world!

l 1.4 Shell  变量

1.4.1 系统变量

在命令行提示符直接执行 env、set 查看系统或环境变量。env 显示用户环境变量,set 显示 Shell

预先定义好的变量以及用户变量。可以通过 export 导出成用户变量。

一些写 Shell 脚本时常用的系统变量:


$SHELL

默认Shell
$HOME 当前用户家目录
$IFS 内部字段分隔符
$LANG 默认语言
$PATH 默认可执行程序路径
$PWD 当前目录
$UID 当前用户ID
$USER 当前用户
$HISTSIZE 历史命令大小,可通过HISTTIMEFO 变量设置命令执行时间
$RANDOM 随机生成一个 0 至 32767 的整数
$HOSTNAME  主机名

1.4.2 普通变量与临时环境变量

普通变量定义:VAR=value

临时环境变量定义:export VAR=value

变量引用:$VAR

下面看下他们之间区别:

Shell 进程的环境变量作用域是 Shell 进程,当 export 导入到系统变量时,则作用域是 Shell 进程

及其 Shell 子进程。、

ps axjf 输出的第一列是 PPID(父进程 ID),第二列是 PID(子进程 ID)

当 SSH 连接 Shell 时,当前终端 PPID(-bash)是 sshd 守护程序的 PID([email protected]/0),因此在当

前终端下的所有进程的 PPID 都是-bash 的 PID,比如执行命令、运行脚本。

所以当在-bash 下设置的变量,只在-bash 进程下有效,而-bash 下的子进程 bash 是无效的,当

export 后才有效。

进一步说明:再重新连接 SSH,去除上面定义的变量测试下

所以在当前 shell 定义的变量一定要 export,否则在写脚本时,会引用不到。

还需要注意的是退出终端后,所有用户定义的变量都会清除。

在/etc/profile 下定义的变量就是这个原理,后面有章节会讲解 Linux 常用变量文件。

1.4.3 位置变量

位置变量指的是函数或脚本后跟的第 n 个参数。

$1-$n,需要注意的是从第 10 个开始要用花括号调用,例如${10}

shift 可对位置变量控制,例如:

#!/bin/bash

echo "1: $1"

shift

echo "2: $2"

shift

echo "3: $3"

# bash test.sh a b c

1: a

2: c

3:

每执行一次 shift 命令,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动

n 位。

1.4.4 特殊变量

$0 脚本自身名字
$?
返回上一条命令是

否执行成功,0 为

执行成功,非 0 则

为执行失败

$#  位置参数总数
$*
所有的位置参数被

看做一个字符串

[email protected]
每个位置参数被看

做独立的字符串

$$  当前进程 PID
$!
上一条运行后台进

程的 PID

1.5  变量引用

赋值运算符 示例
变量赋值
+=  两个变量相加

# VAR=123

# echo $VAR

123

# VAR+=456

# echo $VAR

123456

Shell 中所有变量引用使用$符,后跟变量名。

有时个别特殊字符会影响正常引用,那么需要使用${VAR},例如:

# VAR=123

# echo $VAR

123

# echo $VAR_ # Shell 允许 VAR_为变量名,所以此引用认为这是一个有效的变量名,故此返回

# echo ${VAR}

123

还有时候变量名与其他字符串紧碍着,也会误认为是整个变量:

# echo $VAR456

# echo ${VAR}456

123456

1.5.2 将命令结果作为变量值

# VAR=`echo 123`

# echo $VAR

123

# VAR=$(echo 123)

# echo $VAR

123

这里的反撇号等效于$(),都是用于执行 Shell 命令。

1.6  双引号和单引号

在变量赋值时,如果值有空格,Shell 会把空格后面的字符串解释为命令:

# VAR=1 2 3

-bash: 2: command not found

# VAR="1 2 3"

# echo $VAR

1 2 3

# VAR=‘1 2 3‘

# echo $VAR

1 2 3

看不出什么区别,再举个说明:

# N=3

# VAR="1 2 $N"

# echo $VAR

1 2 3

# VAR=‘1 2 $N‘

# echo $VAR

1 2 $N

单引号是告诉 Shell 忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$、!。

1.7  注释

Shell 注释也很简单,只要在每行前面加个#号,即表示 Shell 忽略解释。

谢谢观看,真心的希望能帮到您!

时间: 2024-08-07 08:18:46

Shell基础知识的相关文章

【Linux系列】【基础版】第三章 Shell基础知识

3. Shell基础知识     3.1 Shell的由来         3.1.1 Bourne Agin Shell         3.1.2 其他的shell, 有 zsh, ksh等     3.2 查看有没有shell         3.2.1 yum list | grep zsh         3.2.2 ls /root/.bash_history         3.2.3 echo $HISTSIZE -> vi /etc/profile 修改HISTSIZE的值 -

centos shell基础知识 2015-4-8 第十二节课

centos shell基础知识  2015-4-8 第十二节课 上半节课 下半节课 history:命令历史 ,默认保存1000条命令历史 !!:上一条命令 !$:上一条命令的最后一个参数 !n:执行命令历史里的第n条命令 !字符:最近那个字符的命令 Tab 键可以补全文件路径或者命令alias a=“b” unalias a通配符 *匹配零个或多个字符 ?匹配一个字符输入输出重定向 >, >>, <, 2>, 2>>管道符 |作业控制 ctrl+z, jobs

shell基础知识总结

1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对于kernel(内核)而言,指系统与外界(使用者)进行接触的部分,一个提供系统功能给用户使用的软件,它接受来自用户的指令,然后调用相应的应用程序. 为了满足不同的需求,shell提供了两种执行命令方式: a. 交互式:解释并执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令. b. 程序

Shell 基础知识和总结

调试脚本 检查脚本语法错误 bash -n /path/to/some_script 调试执行 bash -x /path/to/some_script shell里的变量 本地变量:只对当前shell有效:作用范围可以是整个shell程序文件,包括脚本中的函数,对其他的shell无效.    环境变量:对当前shell及子进程shell有效.    声明.赋值:export name=value 或者 declare -x name=value    局部变量:与函数的生命周期一样:     

shell基础知识---与监听服务器长连接端口状态

从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808string=str 字符串可以用单引号和双引号包裹,也可不包裹.数字话不用引号包裹的话就是一个数值. 变量也可以用来接受语句给变量赋值 file=`ls -l filepath/txt.txt` 上面的语句是接收filepath 下的txt.txt文档 数组的定义 程序中常用的还有数组在 Shell 中,用括号

shell基础知识讲解

第1章 shell基础 1.1 什么叫做shell编程 shell编程也叫做bash高级编程语法 1.2 常见的shell命令解释器 bash????????????redhat和centos使用 dsh????????????Ubuntu使用 csh和tcsh????unix使用 1.3 开发语言程序代码的分类说明 编译型????????????写完后需要编译才可以运行(C语言,java语言) 解释型????????????写完就可以直接运行(shell语言) 1.4 脚本规范 1.4.1 书

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(1)

在日常交际英语中,Shell可以翻译成壳,大多指能够对内部核心起到保护作用的一种装置或结构.在计算机科学中,shell其实是指:为操作者提供的.能够通过系统调用或库调用使用整个计算机资源的访问接口. 它既是一种命令解析器又是一种程序设计语言.作为命令解析器,它可以解释和执行用户输入的命令,也可以自动地解释和执行预先编写好并保存在某个文本文件中的一系列的命令:作为程序设计语言,shell特别定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和条件分支,让我们可以像使用高级语言

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(3)

五.注释 在非交互shell中或交互式shell中,内置命令shopt的选项interactive_comments被开启.以"#"开始的词使得这个词所在这一行上所有其他的剩余字符都被忽略(或称注释).交互式shell不用开启interactive_comments选项也不支持注释.interactive_comments选项在交互式shell中是默认启用的.注释是编写程序时,写程序的人给一个语句.程序段.函数等的解释或提示,能提高程序代码的可读性,以便于以后的参考.修改.后来,在应用

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(5)

十一.函数  shell函数就是按照上面SHELL GRAMMAR的描述定义的保存着一系列等待稍后执行的命令.当shell函数名被当做一个简单命令名使用时,被这个函数名关联的一系列命令都被执行.函数在当前shell的上下文环境中被执行:不会创建新的进程来解释它们(这与shell脚本的执行形成了对比).当执行函数时,函数的参数成为执行过程中的位置参数.特殊参数#被更新以反映这个变化.特殊参数0不会改变.函数执行时,FUNCNAME变量的第一个元素被设置为函数的名称.  shell执行环境的所有其他