1.1 简介

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是一种广泛使用的商业操作系统的名称。

1085年,Richard Stallman又创立了自由软件基金会(Free Software Foundation,FSF)来为GNU计划提供技术、法律以及财政支持。

1990年,GNU计划开发主要项目有Emacs(文本编辑器)、GCC(GUN 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思想十分相近。

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 第一个Shell脚本

本教程主要讲解在大多Linux发行版下默认Bash
Shell。Linux系统是RedHat下的CentOS操作系统,完全免费。与其商业版RHEL(Red Hat Enterprise
Linux)出自同样的源代码,不同的是CentOS并不包含封闭源代码软件和售后支持。

用vi打开test.sh,编写:

  1. # vi test.sh
    #!/bin/bash
    echo "Hello world!"

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

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

  1. 方法1:直接用bash解释器执行
  2. # bash test.sh
  3. Hello world!
  4. 方法2:添加可执行权限
  5. #ll test.sh
    -rw-r--r-- 1 root root 45 2  26 09:21 test.sh
  6. # chmod +x test.sh
  7. # ./test.sh
  8. # ./test.sh # ./在当前目录
  9. Hello world!
  10. 方法3source命令执行,以当前默认Shell执行
  11. # source test.sh
  12. Hello world!

1.4 Shell变量

1.4.1 系统变量

在命令行提示符直接执行env、set查看系统或环境变量。env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。可以通过export导出成用户变量。

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

$SHELL 默认Shell
$HOME 当前用户家目录
$IFS 默认内部域分隔符
$LANG 默认语言
$PATH 默认可执行程序路径
$PWD 当前目录
$UID 用户ID
$USER 当前用户
$HISTSIZE 历史命令大小,可通过HISTTIMEFORMAT变量设置命令执行时间

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(root@pts/0),因此在当前终端下的所有进程的PPID都是-bash的PID,比如执行命令、运行脚本。

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

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

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

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

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

1.4.3 位置变量

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

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

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

  1. #!/bin/bash
  2. echo "1: $1"
  3. shift
  4. echo "2: $2"
  5. shift
  6. echo "3: $3"
  7. # bash test.sh a b c
  8. 1: a
  9. 2: c
  10. 3:

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

1.4.4 特殊变量

$0 脚本自身名字
$? 返回上一条命令是否执行成功,0为执行成功,非0则为执行失败
$# 位置参数总数
$* 所有的位置参数被看做一个字符串
$@ 每个位置参数被看做独立的字符串
$$ 当前进程PID

1.5 变量引用

1.5.1 自定义变量与引用

  1. # VAR=123
  2. # echo $VAR
  3. 123

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

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

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

1.5.2 将命令结果作为变量值

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

1.6 双引号和单引号

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

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

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

1.7 注释

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

shell从入门到精通进阶之一:Shell基础知识的更多相关文章

  1. Shell从入门到精通进阶之四:流程控制

    流程控制是改变程序运行顺序的指令. 4.1 if语句 4.1.1 单分支 if 条件表达式; then 命令 fi 示例: #!/bin/bash N=10 if [ $N -gt 5 ]; then ...

  2. Shell从入门到精通进阶之三:表达式与运算符

    3.1 条件表达式 表达式 示例 [ expression ] [ 1 -eq 1 ]  ` expression ` ` 1 -eq 1 ` test expression test 1 -eq 1 ...

  3. Shell从入门到精通进阶之二:Shell字符串处理之${}

    上一章节讲解了为什么用${}引用变量,${}还有一个重要的功能,就是文本处理,单行文本基本上可以满足你所有需求. 2.1 获取字符串长度 # VAR='hello world!' # echo $VA ...

  4. 数据库SQL语言从入门到精通--Part 3--SQL语言基础知识

    数据库从入门到精通合集(超详细,学习数据库必看) 一.关系 单一的数据结构----关系 现实世界的实体以及实体间的各种联系均用关系来表示 逻辑结构----二维表 从用户角度,关系模型中数据的逻辑结构是 ...

  5. Matlab--从入门到精通(chapter2 matlab 基础知识)

    Chapter2 Matlab 基础知识 1.基本数学运算符号 注:矩阵的右除是一般意义的除法,但是左除具有对称意义,即A./B=B.\A 2. 命令行中的常用标点 3.常见的操作命令 4.输出数据显 ...

  6. 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句

    salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...

  7. Jmeter(三十四) - 从入门到精通进阶篇 - 参数化(详解教程)

    1.简介 前边三十多篇文章主要介绍的是Jmeter的一些操作和基础知识,算是一些初级入门的知识点,从这一篇开始我们就来学习Jmeter比较高级的操作和深入的知识点了.今天这一篇主要是讲参数化,其实前边 ...

  8. Shell从入门到精通

    熟悉基本shell操作不仅是运维的基本功,对于开发来说也是多多益善,我在学习的过程中,总结了十个练手的小demo,并附上涉及的知识点,仅供娱乐. 1. 多线程ping监控,检查同一网段的IP是否连通 ...

  9. Jmeter(三十八) - 从入门到精通进阶篇 - 命令行运行JMeter详解(详解教程)

    1.简介 前边一篇文章介绍了如何生成测试报告,细心地小伙伴或者同学们可以看到宏哥启动Jmeter生成测试报告不是在gui页面操作的,而是在gui页面设置好保存以后,用命令行来生成测试报告的.这一篇宏哥 ...

随机推荐

  1. Google FireBase - fcm 推送 (Cloud Messaging)

    要将 Firebase 添加到您的应用,您需要有一个 Firebase 项目以及适用于您的应用的 Firebase 配置文件. 如果您还没有 Firebase 项目,请在 Firebase 控制台中创 ...

  2. c#坐标系互相转换

    转自群友的博客:https://www.xiaofengyu.com/?p=108 群友的github地址:https://github.com/jfwangncs/GPSConvert  各种坐标系 ...

  3. 《JavaScript高级程序设计(第3版)》阅读总结记录第二章之在HTML中使用JavaScript

    本章目录: 2.1 <script> 元素 2.1.1 标签的位置 2.1.2 延迟脚本 2.1.3 异步脚本 2.1.4 在XHTML 中的用法 2.1.5 不推荐使用的语法 2.2 嵌 ...

  4. Java-IO流之File操作和Properties操作

    java的File类主要是用来操作文件的元数据,稍作演示如下: 其中方法getAllJavaFile()是使用了过滤器FileFileter,这个过滤器只需要实现accept方法,判断什么样的文件返回 ...

  5. 编译部署 Mysql 5.7

    1.环境准备 RHEL7.4(最小化安装)  64bit   2G 内存 (1G 内存编译将近一个小时) 磁盘空间 15G 以上. 配置为本地yum 源 从MySQL5.7版本开始,安装MySQL需要 ...

  6. linux 使用sh@d0ws0cks server

    [root@linux-node1 ~]# cat /etc/shadowsocks.json { "server":"x.x.x.x", , "lo ...

  7. 不高兴的o( ̄ヘ ̄o#)JJ

    题目描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会不高兴,而 ...

  8. 香港,将军澳,TKO,服务器,运维,机房,云清洗

    目前香港到大陆速度最快.最稳定线路之一. 线路也是唯一华南华北一样快速的线路,是100%的“双线”,不存在其他香港线路网通访问比电信慢的问题. (香港)将军澳TKO机房网络速度快捷,机房内部环境配有意 ...

  9. 干货分享:Neutron的PPT,帮助你理解Neutron的各种细节

    深入解析Neutron http://files.cnblogs.com/popsuper1982/Neutron.pptx 经典的三节点部署 架构 怎么理解? 更加深入:Tap Interface ...

  10. 从协议入手,剖析OAuth2.0(译 RFC 6749)

    1.介绍      https://tools.ietf.org/html/rfc6749  传统的client-server授权模型,客户端通过使用凭证(通常的用户名和明文密码)访问服务端受保护的资 ...