shell

Posted liqian-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell相关的知识,希望对你有一定的参考价值。

大数据技术之Shell

 

第1章 Shell概述

 

1编译型语言:

程序在执行之前需要个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依养编译器,跨平台性差些。如CC++java

2解释型语言:

程序不需要编译,程序在运行时由解释器翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/javascript/Shell等都是解释型语言。

 

2 Shell解析器

1Linux提供的Shell解析器有:

[jinghang@hadoop101 ~]$ cat /etc/shells

/bin/sh       bash的一个快捷方式

/bin/bash     bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能

/sbin/nologin   表示非交互,不能登录操作系统

/bin/dash     小巧,高效,功能相比少一些

/bin/tcsh     具有C语言风格的一种shell,具有许多特性,但是也有一些缺陷

?。 /bin/csh      csh的增强版本,完全兼容csh

2bashsh的关系

[jinghang@hadoop101 bin]$ ll | grep bash

-rwxr-xr-x. 1 root root 941880 5月  11 2016 bash

lrwxrwxrwx. 1 root root      4 5月  27 2017 sh -> bash

3Centos默认的解析bash

[jinghang@hadoop101 bin]$ echo $SHELL

/bin/bash

第3章 Shell脚本入门

一句话概括:

简单来说脚本就是将需要执行的命令保存到文本中,按照顺序执行(由上往下执行),它是解释型的,不需要编译。

1脚本格式

脚本以#!/bin/bash或者#!/bin/env bash开头(指定解析

2第一个Shell脚本helloworld

1)需求:创建一个Shell脚本,输出helloworld

2案例实操:

[jinghang@hadoop101 datas]$ touch helloworld.sh

[jinghang@hadoop101 datas]$ vi helloworld.sh

 

helloworld.sh中输入如下内容

#!/bin/bash

echo "helloworld"

3脚本的常用执行方式

种:采用bashsh+脚本相对路径或绝对路径(不用赋予脚本+x权限)

sh+脚本的相路径

[jinghang@hadoop101 datas]$ sh helloworld.sh

Helloworld

sh+脚本的绝对路径

[jinghang@hadoop101 datas]$ sh /home/jinghang/datas/helloworld.sh

helloworld

bash+脚本的相对路径

[jinghang@hadoop101 datas]$ bash helloworld.sh

Helloworld

bash+脚本绝对路径

[jinghang@hadoop101 datas]$ bash /home/jinghang/datas/helloworld.sh

Helloworld

种:采用输入脚本的绝对路径或相对路径执行脚本必须具有可执行权限+x推荐采用这种方式

a)首先要赋予helloworld.sh 脚本的+x权限

[jinghang@hadoop101 datas]$ chmod +x helloworld.sh

b)执行脚本

相对路径

[jinghang@hadoop101 datas]$ ./helloworld.sh

Helloworld

绝对路径

[jinghang@hadoop101 datas]$ /home/jinghang/datas/helloworld.sh

Helloworld

注意:第一种执行方法,本质bash解析器帮你执行脚本,所以脚本本身不需要执行权限。二种执行方法,本质是脚本需要自己执行需要执行权限。

3Shell脚本:多命令处理

1)需求

创建一个Shell脚本: 

1./home/jinghang/目录下创建一个banzhang.txt,

2.banzhang.txt文件中增加“I love you”,

3.执行完毕后打印“报告班长,任务在20191214xx:xx:xx 执行完毕”

  1. 案例实操:

[jinghang@hadoop101 datas]$ touch batch.sh

[jinghang@hadoop101 datas]$ vi batch.sh

 

batch.sh中输入如下内容

 

#!/bin/bash

 

cd /home/jinghang

touch banzhang.txt

echo "I love you" >>banzhang.txt

echo "报告班长,任务于 `date "+%Y-%m-%d %H:%M:%S"`执行完毕"

 

  1. 查看脚本的执行流程(一般使用这个命令来查看脚本执行的步骤,错误)

[jinghang@hadoop101 datas]$ bash -x  batch.sh

  1. 查看脚本的语法(一般使用这个命令来查看脚本语法错误)

[jinghang@hadoop101 datas]$ bash -n  batch.sh

第4章 Shell中的变量

变量是用来临时保存数据的,该数据是可以变化的数据

4.1 什么时候需要定义变量?

1.多次使用,在代码中重复出现,这样在修改内容的时候,仅仅需要修改变量的值。

2.代码运作的过程中,后续代码需要使用某些命令的执行结果,可以使用变量保存执行结果。

4.2 系统变量

1. 常用系统变量

$HOME$PWD$SHELL$USER

2案例实操

1)查看系统变量的值

[jinghang@hadoop101 datas]$ echo $HOME

/home/jinghang

2显示当前Shell中所有变量:set

[jinghang@hadoop101 datas]$ set

BASH=/bin/bash

BASH_ALIASES=()

BASH_ARGC=()

BASH_ARGV=()

4.3 自定义变量

1基本语法

1)定义变量:变量=变量 

2)撤销变量:unset 变量

3)声明静态变量:readonly变量,注意:不能unset

2变量定义规则

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头环境变量名建议大写

2)等号两侧不能有空格

3bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

4)变量的值如果有空格,需要使用双引号或单引号括起来。

3案例实操

1)定义变量A

[jinghang@hadoop101 datas]$ A=5

[jinghang@hadoop101 datas]$ echo $A

5

2变量A重新赋值

[jinghang@hadoop101 datas]$ A=8

[jinghang@hadoop101 datas]$ echo $A

8

3)撤销变量A

[jinghang@hadoop101 datas]$ unset A

[jinghang@hadoop101 datas]$ echo $A

4)声明静态的变量B=2,不能unset

[jinghang@hadoop101 datas]$ readonly B=2

[jinghang@hadoop101 datas]$ echo $B

2

[jinghang@hadoop101 datas]$ B=9

-bash: B: readonly variable

5bash中,变量默认类型都是字符串类型,无法直接进行数值运算

[jinghang@hadoop101 ~]$ C=1+2

[jinghang@hadoop101 ~]$ echo $C

1+2

6变量的值如果有空格,需要使用双引号或单引号括起来

[jinghang@hadoop101 ~]$ D=I love banzhang

-bash: world: command not found

[jinghang@hadoop101 ~]$ D="I love banzhang"

[jinghang@hadoop101 ~]$ echo $A

I love banzhang

7)可把变量提升为全局环境变量,可供其他Shell程序使用

export 变量名

[jinghang@hadoop101 datas]$ vim helloworld.sh

 

helloworld.sh文件中增加echo $B

#!/bin/bash

 

echo "helloworld"

echo $B

 

[jinghang@hadoop101 datas]$ ./helloworld.sh

Helloworld

发现并没有打印输出变量B的值

[jinghang@hadoop101 datas]$ export B

[jinghang@hadoop101 datas]$ ./helloworld.sh

helloworld

2

4.4 特殊变量$n

1基本语法

$n (功能描述:n为数字,$0代表该脚本名称$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}

2案例实操

1)输出该脚本文件名称输入参数1和输入参数2

[jinghang@hadoop101 datas]$ touch parameter.sh

[jinghang@hadoop101 datas]$ vim parameter.sh

 

#!/bin/bash

echo "$0  $1   $2"

 

[jinghang@hadoop101 datas]$ chmod 777 parameter.sh

 

[jinghang@hadoop101 datas]$ ./parameter.sh cls  xz

./parameter.sh  cls   xz

4.5 特殊变量$#

1基本语法

$# (功能描述:获取所有输入参数个数,常用于循环

2案例实操

1获取输入参数的个数

[jinghang@hadoop101 datas]$ vim parameter.sh

 

#!/bin/bash

echo "$0  $1   $2"

echo $#

 

[jinghang@hadoop101 datas]$ chmod 777 parameter.sh

 

[jinghang@hadoop101 datas]$ ./parameter.sh cls  xz

parameter.sh cls xz

2

4.6 特殊变量$*$@

1基本语法

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

2案例实操

1)打印输入所有参数

[jinghang@hadoop101 datas]$ vim parameter.sh

 

#!/bin/bash

echo "$0  $1   $2"

echo $#

echo $*

echo $@

 

[jinghang@hadoop101 datas]$ bash parameter.sh 1 2 3

parameter.sh  1   2

3

1 2 3

1 2 3

4.7 特殊变量$

1基本语法

$ (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

2案例实操

1判断helloworld.sh脚本是否正确执行

[jinghang@hadoop101 datas]$ ./helloworld.sh

hello world

[jinghang@hadoop101 datas]$ echo $?

0

5Shell 中的数组

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

方式2: arr=(value1 value2 value3)   (这种方式带值)

 

注意:往数组里添加值,数组的长度自动增长

5.1 案例实操

#!/bin/bash

my_array=(A B "C" D)

我们也可以使用下标来定义数组:

array_name[0]=value0

array_name[1]=value1

array_name[2]=value2

读取数组元素值的一般格式是:

$ echo {array_name[index]}

5.2 案例实操

#!/bin/bash

my_array=(A B "C" D)

 

echo "第一个元素为: ${my_array[0]}"

echo "第二个元素为: ${my_array[1]}"

echo "第三个元素为: ${my_array[2]}"

echo "第四个元素为: ${my_array[3]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh

$ ./test.sh第一个元素为: A第二个元素为: B第三个元素为: C第四个元素为: D

5.3 获取数组中的所有元素

使用@ * 可以获取数组中的所有元素,例如:

#!/bin/bash

my_array[0]=A

my_array[1]=B

my_array[2]=C

my_array[3]=D

 

echo "数组的元素为: ${my_array[*]}"

echo "数组的元素为: ${my_array[@]}"

5.4 获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

#!/bin/bash

my_array[0]=A

my_array[1]=B

my_array[2]=C

my_array[3]=D

 

echo "数组元素个数为: ${#my_array[*]}"

echo "数组元素个数为: ${#my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh

$ ./test.sh数组元素个数为: 4数组元素个数为: 4

5.5 遍历数组

案例实操

#!/bin/bash

arr=(1 2 3 4 5 6 7)

for i in ${arr[*]}

do

echo $i

done

以上是关于shell的主要内容,如果未能解决你的问题,请参考以下文章

Shellshell脚本练习

Shellshell 的执行流控制

shellshell-grep -v 排除多个输出结果

Shellshell中的常用基础命令

shellshell中各种括号的作用()(())[][[]]{}

Shellshell脚本中的变量