博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell编程基础入门笔记
阅读量:6437 次
发布时间:2019-06-23

本文共 6082 字,大约阅读时间需要 20 分钟。

hot3.png

1.什么是Shell

      Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。

      Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
      它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序。深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。

2.Shell执行命令有两种的方式

       交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。

       批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

3.几种常见的Shell

      sh

          sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
      bash
          bash是Linux标准默认的shell,bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。
         bash由Brian Fox和Chet Ramey共同完成,是 BourneAgain Shell的缩写,内部命令一共有40个。
     ash/csh/ksh

4.脚本语言与编译型语言的差异

         编译型语言: 很多传统的程序设计语言,例如C、C++和Java,都是编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。!

         解释型语言: 解释型语言也被称作“脚本语言”。执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code),再由计算机运行。因为每次执行程序都多了编译的过程,因此效率有所下降。
         脚本编程语言的例子有Python、Ruby、Perl与Shell等。

5.第一个Shell脚本--HelloWorld

          打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell)

输入一些代码:
#!/bin/bash
echo "Hello World !"
    “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。
      echo命令用于向窗口输出文本。

6.运行Shell脚本的两种方法

      (1)作为可执行程序

      将上面的代码保存为test.sh,并 cd 到相应目录:
      chmod +x ./test.sh  #使脚本具有执行权限
      ./test.sh  #执行脚本

      (2)作为解释器参数

      bin/bash test.sh
       这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用

7.shell中读取输入数据

        #!/bin/bash

       echo "What is your name?"
       read PERSON
       echo "Hello, $PERSON"

8.Shell变量

        定义变量:variableName="value"

        注意:变量名和等号之间不能有空格

        使用变量

         your_name="itcast"
         echo $your_name
         echo ${your_name}howareyou
        变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

        删除变量

        使用 unset 命令可以删除变量。语法:
        unset variable_name
        例:
        myUrl="http://www.itcast.cn"
        unset myUrl
        echo $myUrl
       只读变量
       使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

9.Shell特殊变量

变量

 含义

$0

 当前脚本的文件名

$n

 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

$#

 传递给脚本或函数的参数个数。

$*

 传递给脚本或函数的所有参数。

$@

 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

$?

 上个命令的退出状态,或函数的返回值。

$$  当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

举例:

#!/bin/bash

echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

10.命令替换

命令替换是指Shell可以先执行命令,将输出结果暂时保

存,在适当的地方输出
#!/bin/bash
DATE=`date`(注意是“ ` ”,而不是引号,表示引用的linux系统命令)
echo "Date is $DATE"
USERS=`who | wc -l`
echo "Logged in user are $USERS"
UP=`date ; uptime`
echo "Uptime is $UP"

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它

的值

形式

 说明

${var}

 变量本来的值

${var:-word}

 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。

${var:=word}

 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。

${var:+word}

 如果变量 var 被定义,那么返回 word,但不改变 var 的值。

11. Shell运算符

Bash 支持很多运算符包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

原生bash不支持数学运算,但是可以通过其他命令来实现,例如 expr
#!/bin/bash
val=`expr 2 + 2`
echo "Total value : $val"
(1)算术运算符:

运算符

 说明

 举例

+

 加法

 `expr $a + $b` 结果为 30。

-

 减法

 `expr $a - $b` 结果为 10。

*

 乘法

 `expr $a \* $b` 结果为  200。

/

 除法

 `expr $b / $a` 结果为 2。

%

 取余

 `expr $b % $a` 结果为 0。

=

 赋值

 a=$b 将把变量 b 的值赋给 a。

==

 相等。用于比较两个数字,相同则返回 true。

 [ $a == $b ] 返回 false。

!=

 不相等。用于比较两个数字,不相同则返回 true。

[ $a != $b ] 返回 true。

(2)关系运算符:

运算符

 说明

 举例

-eq

 检测两个数是否相等,相等返回 true。

 [ $a -eq $b ] 返回 true。

-ne

 检测两个数是否相等,不相等返回 true。

 [ $a -ne $b ] 返回 true。

-gt

 检测左边的数是否大于右边的,如果是,则返回 true。

 [ $a -gt $b ] 返回 false。

-lt

 检测左边的数是否小于右边的,如果是,则返回 true。

 [ $a -lt $b ] 返回 true。

-ge

 检测左边的数是否大等于右边的,如果是,则返回 true。

 [ $a -ge $b ] 返回 false。

-le

 检测左边的数是否小于等

[ $a -le $b ] 返回 true。

(3)布尔运算符:

运算符 说明 举例

!

 非运算,表达式为 true 则返回 false,否则返回 true

 [ ! false ] 返回 true

-o

 或运算,有一个表达式为 true 则返回 true

 [ $a -lt 20 -o $b -gt 100 ] 返回 true

-a

 与运算,两个表达式都为 true 才返回 true

 [ $a&

(4)字符串运算符:

运算符

 说明

 举例

=

 检测两个字符串是否相等,相等返回 true

 [ $a = $b ] 返回 false

!=

 检测两个字符串是否相等,不相等返回 true

 [ $a != $b ] 返回 true

-z

 检测字符串长度是否为0,为0返回 true

 [ -z $a ] 返回 false

str

 检测字符串是否为空,不为空返回 true

 [ str $a ] 返回 true

(5)文件测试运算符:

操作符

 说明

 举例

-d file

 检测文件是否是目录,如果是,则返回 true。

 [ -d $file ] 返回 false。

-f file

 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。

 [ -f $file ] 返回 true。

-r file

 检测文件是否可读,如果是,则返回 true。

 [ -r $file ] 返回 true。

-w file

 检测文件是否可写,如果是,则返回 true。

 [ -w $file ] 返回 true。

-x file

 检测文件是否可执行,如果是,则返回 true。

 [ -x $file ] 返回 true。

-s file

 检测文件是否为空(文件大小是否大于0),不为空返回 true。

 [ -s $file ] 返回 true。

-e file

 检测文件(包括目录)是否存在,如果是,则返回 true。  [ -e $file ] 返回 true。

13.Shell字符串

字符串是shell编程中最常用最有用的数据类型

字符串可以用单引号,也可以用双引号,也可以不用引号
字符串连在一起就能拼接

获取字符串长度

string="abcd"
echo ${#string} #输出 4
提取子字符串
string="alibaba is a great company"
echo ${string:1:4} #输出liba
查找子字符串
string="alibaba is a great company"
echo `expr index "$string" is`
14.shell中的数组

定义数组

在Shell中,用括号来表示数组,数组元素用“空格”符号分割开
array_name=(value0 value1 value2 value3)

还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
读取数组
valuen=${array_name[2]}
获取数组的长度
length=${#array_name[@]}   或  length=${#array_name[*]}
数组的遍历:for arr in ${array[*]}; do  echo $arr; done

15.Shell if else语句:

Shell 有三种 if ... else 语句:

if ... fi 语句;
if ... else ... fi 语句;
if ... elif ... else ... fi 语句。
例:
if [ $a == $b ]
then
   echo "a is equal to b"
fi

16.Shell for循环

for循环一般格式为:

for 变量 in 列表
do
    command1
    command2
    ...
    commandN
done

17.Shell while循环

语法示例:

COUNTER=0
while [ $COUNTER -lt 5 ]
do
    COUNTER='expr $COUNTER + 1 '
    echo $COUNTER
done

while循环可用于读取键盘信息

while read FILM
do
    echo "Yeah! great film the $FILM"
done

18.Shell函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加

清晰,代码重复利用率更高。
Shell 函数的定义格式如下:
function_name () {
     a=$1
    b=$2
    list of commands
    [ return value ]
}
function_name 10 20
echo $?
函数返回值,可以显式增加return语句;
如果不加,会将最后一条命令运行结果作为返回值。

Shell函数参数:

直接在调用函数名后传入参数

函数中获取参数用 $1, $2, ...

19.Shell输入输出重定向

Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。

输出重定向
命令的输出不仅可以是显示器,还可以很容易的转移到文件,这被称为输出重定向。
 command > file
输入重定向
和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
command < file

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null  , /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;
      command > /dev/null
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
      command  1 > file   2>&1
20.Shell文件包含

像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。

创建两个脚本,一个是被调用脚本 subscript.sh,内容如下:

url="
一个是主文件 main.sh,内容如下:
#!/bin/bash
. ./subscript.sh
echo $url

转载于:https://my.oschina.net/bigdataer/blog/539975

你可能感兴趣的文章
Java 开源库精选(持续更新)
查看>>
Scrum联盟发布2015年Scrum状况报告
查看>>
在 Ubuntu 16.04 LTS 上安装 Python 3.6.0
查看>>
CloudCare容器技术白皮书
查看>>
苦酒入喉心作痛,红酒入鹅鹅想哭——震惊!勒索病毒想哭靠wine感染了Ubuntu16.04 ...
查看>>
Kubernetes Nginx Ingress Controller源码分析
查看>>
Linux下区分物理CPU、逻辑CPU和CPU核数
查看>>
第二十一章:变换(三)
查看>>
同步异步阻塞非阻塞杂记
查看>>
2018年中国银行业十件大事,“Fintech深度融合,科技子公司遍地” ...
查看>>
Git SSH 连接phacility服务器
查看>>
【客户案例】智能驾驶行业如何上云?
查看>>
foreman源NO_PUBKEY 6F8600B9563278F6
查看>>
揭秘:蚂蚁金服bPaaS究竟是什么?
查看>>
mongo数据库单节点搭建
查看>>
WPF模糊和阴影效果
查看>>
增加关系型数据库驱动配置同步任务
查看>>
别用这种方式聊天,你都不知道自己是怎么聊死的
查看>>
中国香港地区 DDoS- botnet 态势分析
查看>>
另一个角度的架构师
查看>>