Shell快速入门

Shell快速入门教程

1. Shell程序

1.1 基本概念

以文件的形式批量的存放linux 的命令集合。可以被shell解释执行,这种文件就是shell脚本程序。

l Shell程序通常由linux命令,shell命令,控制语句以及注释语句构成。

l Shell脚本是纯文本文件,可以由任何文本编辑器编写,shell文件通常是以 .sh 为文件后缀。

.bash 结尾的

 

Shell脚本 就是可执行命令 + 控制语句

1.2 编写规范

第一行,指定哪个程序来执行脚本

#!/bin/bash

或者

#!/bin/sh

 

注意:#可以有空格,也可以没有空格

      这一行甚至可以没有,但是这样不符合一般的规范

 

# 表示注释

第一种方式:

Shell 如何执行

Sh xxx.sh

Bash xxx.sh

第二种方式:为这个shell脚本添加可执行权限

Chmod +x xxx.sh

./xxx.sh

 

 

2. 变量

2.1 变量命名

l 变量名必须是以字母或者下划线开头,不能以数字开头,后面可以接字母,数字,下划线。

l 变量区分大小写

2.2 变量类型

Shell中变量没有严格的类型,只有字符串和数字类型。

l 变量往往根据作用域,可以分为本地变量和环境变量。

 

本地变量只是在创建这个变量的shell程序中可以使用。而环境变量可以在shell中,所有的用户进程中使用,通常也被称为全部变量。

2.3 变量赋值

l 等号两边不能有空格

如果要给变量赋空值,可以在等号后面接一个换行符

 

在控制台打印变量的值

echo $variable 或者 ${variable}

 

清除变量

unset variable

 

显示所有变量,包括本地变量和环境变量

Set

 

如何把命令的输出,赋值给一个变量

` ` 这个叫飘号

A=``里面放命令,就是把这个命令输出的结果赋值给a

 

[hadoop@huawei shellDemo]$ a=`ls`

[hadoop@huawei shellDemo]$ echo $a

demo01.sh helloWorld01.sh helloWorld.sh ls.sh out specailVar01.sh specailVar02.sh specailVar.sh test

 

[hadoop@huawei shellDemo]$ ls

demo01.sh  helloWorld01.sh  helloWorld.sh  ls.sh  out  specailVar01.sh  specailVar02.sh  specailVar.sh  test

 

2.4 环境变量

环境变量简称全局变量,按照惯例需要大写

export VAR

注意:可以被所有的shell环境下访问

如果父shell进程下产生了子shell进程,那么环境变量可以被“继承”并复制

2.5 位置参量

讲的是给shell脚本传参数的问题

1. 如何给shell脚本穿参: xxx.sh + 空格+参数1+空格+参数2

2. shell脚本里面,得有类似占位符的东西,$1 表示第一个参数,$2表示第二个参数,如果不传,这个参数就是空,传多了,截取前面几个

 

位置参量是一组特殊的内置变量,通常被shell脚本用来执行命令行接收参数,或者函数用来保存换地给它的参数。

执行shell脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。

 

在脚本中需要使用这些参数的时候需要通过位置参量来引用,例如:

sh  shell_03.sh hahhaha

#!/bin.sh

A=$1

echo $A

 

结果是:hahhaha

 

 

 

 

2.5.1 位置参量列表

$0

当前脚本的文件名

$1-$9

1个到第9个位置参数

${10}

10个位置参数,类似有,${11} , ${12}....

$#

位置参数的个数,注意:你传入几个,就打印几个

$*

以单字符串显示所有位置参数,其实就是把位置参数打印出来

$@

没有加双引号的时候与$*含义相同,加双引号的时候有区别

$$

脚本运行的当前进程号

$!

最后一个后台运行的进程的进程号

$?

显示前面最后一个命令的退出状态

0 表示没有错误,其他任何值表示有错误

 

案例:

 shell_04.sh

#!/bin/sh

echo "the count of parameters:$#"

echo "first param=$1"

echo "second param=$2"

echo "all paramers=$*"

 

shell程序传递参数

[hadoop@huawei test]$ sh shell_04.sh this is perter

the count of parameters:3

first param=this

second param=is

all paramers=this is perter

 

如果位置参数中含有空格,则需要使用双引号

[hadoop@huawei test]$ sh shell_04.sh "this is"  perter

the count of parameters:2

first param=this is

second param=perter

all paramers=this is perter

2.5.2 退出码

l 任何命令进行时都将返回一个退出状态

查看命令:echo $?

应用中通常会在关键的步骤后判定$?,用来确定关键步骤的执行是否成功。尤其是调度系统里面需要监控sh返回码。在我们的项目中,书写调度脚本就用到了这个。

l Shell脚本的返回码取决于最后一个命令的返回码

程序控制返回码:exit N

退出状态0,成功,没有错误

退出状态不为0,失败,某处有错误

 

2.6 shell 自定义函数

语法

 [ function ] funname [()]

{

    action;

    [return int;]

}

 

function start()  / function start / start()

 

1.必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译

2.函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

2.7 运算符

格式 :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+3)*4))

 

 

3.数组

l 数组定义

Arr=(math english chinese)

l 数组初始化

Arr =(math english chinese)

l 数组引用

引用变量:${arr[0]}

数组个数:${#arr[*]}

所有元素:${arr[*]}

l 数组赋值

arr[0]=chinese

 

3.date命令

Date命令是比较重要的,因为我们在书写调度程序的时候,得考虑是用执行那一天的数据

 

如果想知道Linux系统的时间,那么就直接在指令列模糊输入date即可

[hadoop@huawei test]$ date

20171008日 星期日 13:12:23 CST

也可以制定日期格式

[hadoop@huawei test]$ date +%Y/%M/%D

2017/16/10/08/17

注意:m 小写表示月份month

      M  大写表示MINUTE 分钟

之前的时间

date --date='1 days ago' +%y/%m/%d

4.cal命令

显示当月的月历,cal

[hadoop@huawei test]$ cal

      十月 2017     

日 一 二 三 四 五 六

 1  2  3  4  5  6  7

 8  9 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25 26 27 28

29 30 31

显示哪一年所有的月历 cal year

[hadoop@huawei test]$ cal 2010

                               2010                               

 

        一月                   二月                   三月        

日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六

                1  2       1  2  3  4  5  6       1  2  3  4  5  6

 3  4  5  6  7  8  9    7  8  9 10 11 12 13    7  8  9 10 11 12 13

10 11 12 13 14 15 16   14 15 16 17 18 19 20   14 15 16 17 18 19 20

17 18 19 20 21 22 23   21 22 23 24 25 26 27   21 22 23 24 25 26 27

24 25 26 27 28 29 30   28                     28 29 30 31

31

        四月                   五月                   六月        

日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六

             1  2  3                      1          1  2  3  4  5

 4  5  6  7  8  9 10    2  3  4  5  6  7  8    6  7  8  9 10 11 12

11 12 13 14 15 16 17    9 10 11 12 13 14 15   13 14 15 16 17 18 19

18 19 20 21 22 23 24   16 17 18 19 20 21 22   20 21 22 23 24 25 26

25 26 27 28 29 30      23 24 25 26 27 28 29   27 28 29 30

                       30 31

        七月                   八月                   九月        

日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六

             1  2  3    1  2  3  4  5  6  7             1  2  3  4

 4  5  6  7  8  9 10    8  9 10 11 12 13 14    5  6  7  8  9 10 11

11 12 13 14 15 16 17   15 16 17 18 19 20 21   12 13 14 15 16 17 18

18 19 20 21 22 23 24   22 23 24 25 26 27 28   19 20 21 22 23 24 25

25 26 27 28 29 30 31   29 30 31               26 27 28 29 30

 

        十月                  十一月                 十二月       

日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六

                1  2       1  2  3  4  5  6             1  2  3  4

 3  4  5  6  7  8  9    7  8  9 10 11 12 13    5  6  7  8  9 10 11

10 11 12 13 14 15 16   14 15 16 17 18 19 20   12 13 14 15 16 17 18

17 18 19 20 21 22 23   21 22 23 24 25 26 27   19 20 21 22 23 24 25

24 25 26 27 28 29 30   28 29 30               26 27 28 29 30 31

31

 

显示某年某月的月历:cal month year

[hadoop@huawei test]$ cal 12 2010

     十二月 2010    

日 一 二 三 四 五 六

          1  2  3  4

 5  6  7  8  9 10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28 29 30 31

5.判断

6.1文件的判断

关于某个档名的【文件类型】判断,如test -e filename 表示存在是否

-e

根据文件名判断是否存在 exist

-f

判断目标文件是不是文件  isFile

-d

判断目标文件是不是目录  isDirectory

 

判断目标文件的权限  test -r xxxx

-r

判断该文件是否有可读权限

-w

判断该文件是否有可写权限

-x

判断该文件是否有可执行权限

6.2数值的判断

两个整数之间的判断,例如 test n1 -eq n2

-eq

两数值是否相等(equal

-ne

两数值不等(not equal

-gt

n1 大于 n2 greater than

-lt

n1 小于n2  less than

-ge

n1 大于等于n2

-le

n1 小于等于n2

 

判断字符串的数据

Test -z string

判断字符串是否为0?若string为空字符串,则为true

Test -n string

判断字符串是否为0?若string为空字符串,则返回false

Test str1=str2

判断str1 是否等于str2,若相等,则回传true

Test str1!=str2

判断str1是否不等于str2,若相等,则回传false

 

利用判断符号, [] 中括号代替test,如果想知道$HOME 这个变量是否为空

[hadoop@huawei ~]$ [ -z "$HOME" ];echo $?

1

[hadoop@huawei ~]$ [ -n "$HOME" ];echo $?  

0

注意中括号必须有空格,前面有空格,后面也得有空格

 

 

6.If判断语句

7.1 单层判断

l 单层,简单条件判断式

如果只有一个判断式要进行,那么我们可以简单的这么看:

If [ 条件判断式 ];then

      当条件判断式成立时,可以进行的指令工作内容;

fi 结束if语句

如果有多个条件要判断的时候,可以将多个条件写入到一个中括号,还可以有多个中括号来隔开,而括号与括号之间,则用&& 或者|| 来隔开,意义是:

l &&表示and

l || 代表or

 

If 后面也有一个空格

 

例子:

#!/bin/bash

read -p "please input your name:" NAME

#printf '%s\n' $NAME

if [ $NAME = root ]

        then

                echo "hello ${NAME},  welcome !"

        elif [ $NAME = beicai]

                then

                        echo "hello ${NAME},  welcome !"

        else

                echo "SB, get out here !"

fi

 

 

脚本案例:sh ./hive_load_day.sh /home/hadoop/data/twnews_context_by_date/

#!/bin/bash

 

function show()

{

// /home/hadoop/data/twnews_context_by_date/  就是$1

    cd $1

 

    for i in `ls`

    do

        if [ -d "$i" ]

        then

var="$i"

varin1="${var#*=}"

## echo  $varin1

varin2="'/home/hadoop/data/twnews_context_by_date/sendtime="$varin1"/000000_0'"

##  echo $varin2

vartsp="'${var#*=}'"

##  echo $vartsp

 $HIVE_HOME/bin/hive -e 'LOAD DATA local INPATH '$varin2' OVERWRITE INTO TABLE thnews_new.twnews_context_by_date PARTITION( sendtime='$vartsp')'

 

show "$i"

        fi

    done

 

    cd ..

}

show $1

 

exit 0

 

 

7.2 双层判断

If[ 条件判断式 ];then

     当条件判断式成立时,执行操作;

else

     当条件判断式不成立时,可以进行指令工作内容;

fi

7.3 多层判断

多个条件判断(if...elif...else)分多种不同的情况执行

If[ 条件判断式一 ];then

当条件判断式一成立时,可以进行指令工作内容

elif[ 条件判断式二 ];then

当条件判断式二成立时,可以进行的指令工作内容

else

当之前的条件判断式不成立,可以进行的指令工作内容;

fi

7.for循环

For((初始值;限制值;执行步阶))

do

  程序段

done

 

这种语法适合于数值方式的运算中,在for后面的括号内的三串内容的意义是:

初始值:某个变量在循环中的起始值,直接类似于i=1

限制值:当变量的值在这个限制值的范围内,就继续进行循环。例如i <= 100

执行步阶:每作一次循环,变量的变化值,例如:i=i+1

案例:

For in

s=0

for((i=1;i<=100;i=i+1))

do

  s=$(($s+$i))

  echo $s

done   

 

1

3

6

10

15

21

28

36

第二种:

for N in 1 2 3

do

echo $N

done

for N in 1 2 3; do echo $N; done

for N in {1..3}; do echo $N; done

 

 

 

8.while 循环

while do done,until do done(不定循环)

一般来说,不定循环最常见的就是底下两种状态:

while [ condition ]  

do

   程序段落

done

While 的中文是:当...时,这种方式说的是,就进行循环,直到condition的条件不成立才停止的意思:

until [ condition ]

do

   程序段落

done

 

这种方式恰恰与while相反,它说的是当condition条件成立时,就终止循环,否则就持续进行循环的程序段。

 

 

第一种

while expression

do

command

done

 

第二种

i=1

while ((i<=3))

do

  echo $i

  let i++

done

 

9.case语句

格式

case $1 in

start)

echo "starting"

;;

stop)

echo "stoping"

;;

*)

echo "Usage: {start|stop}

esac

 

 

 

问题:如何把一个命令的输出赋值给某个变量??

A=`ls -l`

echo $A

 

 

 

 

 

 

 

 

你可能感兴趣的:(Shell快速入门)