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

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值