一、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. 「Leetcode」14. Longest Common Prefix(Java)

    分析 与其说是算法题,不如说是语言特性题. 这题要是对Java的String相关函数掌握的比较熟练,写起来的速度(各种意义上)就会很快. 大致的思路都是一致的,差不到哪里去,无非是枚举长度.值得一提的 ...

  2. jenkens其实是代码上传工具

    Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...

  3. 小数第n位:高精度

    小数第n位 问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后 ...

  4. Amazon Headlines Update on Activity in US West Coast Ports

    According to news reports, freighter cargo may not be offloaded at U.S. West Coast ports from Februa ...

  5. baidu网盘下载神器 Pandownload

    最近百度网盘超级会员到期,经同学的推荐,我最近发现了一个特别NB的工具pandownload,官方说是能够破解加速,经过使用确实能够达到很快的下载速度. 这里附上官方的下载网站 http://pand ...

  6. 关于jsp之间href传参(中文)乱码问题

    在A.jsp中有href传值 <a href=\"6.jsp?param="+rs.getString(2)+"\">" 在B.jsp中使 ...

  7. tensorflow训练线性回归模型

    tensorflow安装 tensorflow安装过程不是很顺利,在这里记录一下 环境:Ubuntu 安装 sudo pip install tensorflow 如果出现错误 Could not f ...

  8. 使用git下载编译erlang

    git clone https://github.com/erlang/otp cd otp git tag git checkout -b OTP- OTP- ./otp_build all exp ...

  9. 0302借软件工程触IT

         没有不想学好的学生,也没有选择计算机软件专业后不想过能进军IT的行业的.就对于自己情况来说,大学选择计算机商业软件专业学习也有一年多时间了,未接触专业知识前IT是一个高大上的向往,在初学C语 ...

  10. 【BioCode】将多个蛋白质序列分成单个的txt文档

    代码说明: fasta格式的蛋白质序列,一个txt里面有很多蛋白质序列,计算ss.pssm或disorder score时候都需要单条计算,需要分开. 分割前: 分割后: show you the c ...