一、Linux shell简介

1、shell概述

Shell 是用户与内核进行交互操作的一种接口,目前最流行的 Shell 称为 bash Shell
          Shell 是一门编程语言<解释型的编程语言>,即 shell 脚本<就是在用 linux 的 shell 命令编程>,
          Shell 是一种脚本语言,那么,就必须有解释器来执行这些脚本。
          Unix/Linux 上常见的 Shell 脚本解释器有 bash、sh、csh、ksh 等,习惯上把它们称作一种 Shell。
          我们常说有多少种 Shell,其实说的是 Shell 脚本解释器, 可以通过 cat /etc/shells 命令查看系 统中安装的 shell,不同的 shell 可能支持的命令语法是不相同的
       2、shell基本格式

代码写在普通文本文件中,通常以.sh 结尾

vi helloworld.sh

#!/bin/bash                                    ## 表示用哪一种 shell 解析器来解析执行我们的这个脚本程序
           echo "hello world"                            ## 注释也可以写在这里
           保存退出即可
           在这里,我们就写好了一个 shell 脚本, 第一行是固定需要的,表明用哪一种 shell 解析器来 执行我们的这个脚本程序。 本质上, shell 脚本里面的代码都是就是一些流程控制语句加一 些特殊语法再加 shell 命令组成。 其中,我们可以当做每一个命令就是 shell 编程当中的关键 字。
       3、shell执行方式

(1) sh 方式

sh helloworld.sh           ## 直接指定用系统默认的 bash shell 解释执行

(2) source 方式

source 命令也称为“点命令”,也就是一个点符号( .) ,是 bash 的内部命令。
           功能:使 Shell 读入指定的 Shell 程序文件并依次执行文件中的所有语句  source 命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
           用法:source filename   或者. filename         例:source helloworld.sh  或者. helloworld.sh

注意:点和脚本之间是有空格的

(3)直接执行该脚本文件

可以有两种方式,不过这两种方式的执行,都需要该文件有执行权限 所以在执行之前,我们要更改他的执行权限
             chmod 755 helloworld.sh

切换到该文件所在的路径下执行命令:./helloworld.sh  或者helloworld.sh

直接以绝对路径方式执行:/root/bin/helloworld.sh

二、shell基本语法

1、系统变量

Linux Shell 中的变量分为“系统变量”和“用户自定义变量”
          系统变量可以通过 set 命令查看                       常用系统变量: $PWD $SHELL $USER $HOME

2、自定义变量

(1)语法:

变量=值 (例如 STR=abc)     等号两侧不能有空格      变量名称一般习惯为大写
          
          使用变量: $STR
          双引号和单引号有区别: 双引号仅将空格脱意, 单引号会将变量引用比如$param 脱意
         (2)示例:

解释:
              命令: ABC=huang bo,定义变量时中间带有空格,那么一定要带引号,不然会定义不成 功
              命令: ABC='huang bo', 带了单引号则原样输出。 表示引号中间的值是整体字符串 在引号当中要引用变量的时候,单引号和双引号就有区别啦:
              命令: echo 'xu zheng $ABC' 和 echo "xu zheng $ABC"
              请看区别:
                      如果是单引号,则引号当中的任何东西都当做字符串,即特殊字符会被脱意
                      如果是双引号, 那么$ABC 能打印出变量的值

那假如命令是这样的: echo "xu zheng $ABCabc",请问还能不能打印出变量 ABC 的值呢? 请看结果:
 

(3)变量高级用法

撤销变量: unset ABC
               声明静态变量: readonly ABC= 'abc' 特点是这种变量是只读的,不能 unset
               请先看一个例子, 我现在写两个脚本,在 a.sh 中调用 b.sh 执行,那我们想知道 a 脚本能 不能获取到 b 脚本的变量, b 脚本能不能获取到 a 脚本的变量?
              

在 a.sh 中只打印出了变量 A 的值,这个好理解,因为 shell 是顺序解析执行的,在打印 变量 B 的时候,就算它能获取到 b.sh 当中的变量,它也还没执行,所以,肯定获取不到
       再看 b.sh 打印出来的结果: 可以发现虽然 a.sh 当中的语句执行完了再调用 b.sh 来执 行,但是 b.sh 脚本依然也没法获取到 a.sh 的变量
       那怎么解决?

使用 export 关键字
       export A="A in a.sh"
       意味着把变量提升为当前 shell 进程中的全局环境变量,可供其他子 shell 程序使用, A 变量就成了 a.sh 脚本所在 bash 进程的全局变量,该进程的所有子进程都能访问到变 量 A

另外一种使用方式:
       如果在 a.sh 脚本中用如下方式调用 b.sh:  . /root/bin/b.sh ## 注意:重点关注最前面那个“ .”号  或者   source /root/bin/b.sh
       用上述两种方式意味着: b.sh 就在 a.sh 所在的 bash 进程空间中运行

总结:
             1、 a.sh 中直接调用 b.sh,会让 b.sh 在 A 所在的 bash 进程的“子进程”空间中执行
             2、而子进程空间只能访问父进程中用 export 定义的变量
             3、一个 shell 进程无法将自己定义的变量提升到父进程空间中去
             4、 source 或者“ .”号执行脚本时,会让脚本在调用者所在的 shell 进程空间中执行

(4)反引号赋值

a=`ls -l /root/bin`         ##反引号,运行里面的命令,并把结果返回给变量 a
            另外一种写法: a=$(ls -l /root/bin)

(5)特殊变量

先来看看各个常用的特殊变量的概念:
                     $? 表示上一个命令退出的状态码
                     $$ 表示当前进程编号
                     $0 表示当前脚本名称$n 表示 n 位置的输入参数( n 代表数字, n>=1)
                     $# 表示参数的个数,常用于循环
                     $*和$@ 都表示参数列表

注: $*与$@区别
                $* 和 $@ 都表示传递给函数或脚本的所有参数
               不被双引号" "包含时——          $* 和 $@ 都以$1 $2 „ $n 的形式组成参数列表
                当它们被双引号" "包含时——        "$*" 会将所有的参数作为一个整体,以"$1 $2 „ $n"的形式组成一个整串;
               "$@" 会将各个参数分开,以"$1" "$2" „ "$n" 的形式组成一个参数列表

三、运算符

1、算数运算符

(1)用expr

格式 expr m + n 或 $((m+n)) 注意 expr 运算符间要有空格
              例如计算( 2+3)×4 的值
                   1、 分步计算    S=`expr 2 + 3`
                                       expr $S \* 4 ## *号需要转义
                    2、 一步完成计算
                           expr `expr 2 + 3 ` \* 4
                           echo `expr \`expr 2 + 3\` \* 4`

(2)用(())

((1+2))
              (((2+3)*4))
              count=1
              ((count++))
             echo $count
             但是要想取到运算结果,需要用$引用   a=$((1+2))
         (3)用$[]

四、流程控制

1、if

语法格式:

if condition
                then
                     statements

[elif condition
               then statements. ..]
               [else
                   statements ]
            fi

[]  =  两侧都有空格

短路运算符(理解为三元运算符) [ condition ] && echo OK || echo notok    条件满足,执行&&后面的语句;条件不满足,执行||后面的语句

条件判断组合 
条件判断组合有两种使用方式: [] 和 [[]]
注意它们的区别:
[[ ]] 中逻辑组合可以使用 && || 符号
[] 里面逻辑组合可以用 -a -o

常用判断运算符:
(1) 字符串比较
       = 判断相等     != 判断不相等       -z 字符串长度是为 0 返回 true         -n 字符串长度是不为 0 返回 true

(2) 整数比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于-ge 大于等于
-ne 不等于

(3)文件判断

-d 是否为目录
if [ -d /bin ]; then echo ok; else echo notok;fi
-f 是否为文件
if [ -f /bin/ls ]; then echo ok; else echo notok;fi
-e 是否存在
if [ -e /bin/ls ]; then echo ok; else echo notok;fi

2、while

3、case

4、for三种方式

5、函数使用

函数调用方式:function hello()   或 function hello  或 hello

注意:
1、 必须在调用函数地方之前,先声明函数, shell 脚本是逐行运行。不会像其它语言一样先 预编译
2、 函数返回值,只能通过$? 系统变量获得,可以显示加: return 返回,如果不加,将以最 后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)

6、函数参数

案例:打印9*9乘法表

补充:

Linux(五)shell编程基础的更多相关文章

  1. Linux之shell编程基础

    一.变量 变量在shell中分为:本地变量.环境变量.位置参数: 本地变量:仅可在用户当前shell生命期的脚本中使用的变量,本地变量随着shell进程的消亡而无效,本地变量在新启动的shell中依旧 ...

  2. Linux学习之二十一-shell编程基础

    Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  3. 【Hadoop离线基础总结】linux的shell编程

    linux的shell编程 基本了解 概述 Shell是一个用C语言编写的程序,通过shell用户可以访问操作系统内核服务,它类似于DOS下的command和后来的cmd.exe.Shell既是一种命 ...

  4. Linux Shell编程基础

    在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐 ...

  5. Linux学习——shell编程之变量

    shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...

  6. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  7. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  8. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

  9. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  10. shell编程基础(5)---循环指令

    while类型的循环 while类型的循环是不定循环的一种,每一次循环都会验证给出的循环条件,判断是否要进行下一次循环.linux中while循环的写法和c语言中很想,但是条件给出的方式有些区别. 首 ...

随机推荐

  1. pytest使用笔记(一)

    使用环境及预置条件:pycharm+win10+python3.6+pytest 1,创建示范的测试功能脚本,另存为test_sample.py,代码如下: # test_sample.py def ...

  2. Power Designer逆向工程导入Oracle表,转为模型加注释

    1.打开PowerDesigner ——文件——Reverse Engineer——DataBase 2.选择所要连接数据库版本,此处使用的是oracle version 11g. 3.点击红色区域, ...

  3. dubbo SpringContainer

    dubbo SpringContainer Spring启动类容器 SPI service provider interfaces 服务提供借口 Singleton 单例 ThreadSafe 线程安 ...

  4. SICP读书笔记 1.3

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  5. 算法笔记(c++)--c++中碰到的一些用法

    算法笔记(c++)--c++中碰到的一些用法 toupper(xxx)可以变成大写; tolower(xx)小写 isalpha(xxx)判断是不是字母 isalnum(xx)判断是不是数字 abs( ...

  6. IC设计前后端流程与EDA工具

    IC前端设计(逻辑设计)和后端设计(物理设计)的区分: 以设计是否与工艺有关来区分二者:从设计程度上来讲,前端设计的结果就是得到了芯片的门级网表电路. 前端设计的流程及使用的EDA工具 1.架构的设计 ...

  7. Android 中调用本地命令

    Android 中调用本地命令 通常来说,在 Android 中调用本地的命令的话,一般有以下 3 种情况: 调用下也就得了,不管输出的信息,比如:echo Hello World.通常来说,这种命令 ...

  8. AOP:静态代理实现方式①通过继承②通过接口

    文件结构: 添加日志: package com.wangcf.manager; public class LogManager { public void add(){ System.out.prin ...

  9. NumPy常用函数总结

    转载:https://www.cnblogs.com/hd-chenwei/p/6832732.html NumPy库总包含两种基本的数据类型:矩阵和数组,矩阵的使用类似Matlab,本实例用得多的是 ...

  10. DS06--图

    一.学习总结 1.图的思维导图 2.图学习体会 深度优先遍历与广度优先遍历 不同点:广度优先搜索,适用于所有情况下的搜索,但是深度优先搜索不一定能适用于所有情况下的搜索.因为由于一个有解的问题树可能含 ...