java大数据开发训练营--Shell编程

快速入门

 

1 编写脚本

新建 /usr/shell/hello.sh 文件

 

#!/bin/bash

echo 'hello lagou'

!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell

echo 命令用于向窗口输出文本。

2 执行shell脚本

执行方式1

 

[root@centos7-1 shell]# /bin/sh hello.sh hello lagou

[root@centos7-1 shell]# /bin/bash hello.sh hello lagou

 

问题: bash 和 sh 是什么关系?

 

sh  bash 的 快捷方式

执行方式2

 

[root@node04 shells]# bash hello.sh 

hello world

[root@node04 shells]# sh hello.sh 

hello world

 

1.查看环境变量path:

echo $PATH

2.添加执行权限

chmod +x 文件名称

4.变量

shell脚本中, 定义变量时,变量名不加美元符号($),如: username="tom"

注意 : 变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。 同时,变量名的命名须遵循如下规则:

 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

 中间不能有空格,可以使用下划线(_)。

 不能使用标点符号。

 不能使用bash里的关键字(可用help命令查看保留关键字)。

有效的 Shell 变量名示例如下:

 

JACK

LD_LIBRARY_PATH _demo

var2

无效的变量命名:

 

?var=123 user*name=runoob

使用语句给变量赋值

举例:

 

for file in`ls /etc`

 

for file in $(ls /etc)

以上语句是将/etc下目录的文件名循环出来

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:your_name="tom" echo $your_name echo ${your_name}

 

变量名外面加花括号是可选的, 添加花括号是帮助解释器识别变量边界

举例:

habby="i like ${course}script"

habby="i like $coursescript"

 

只读变量

使用readyonly命令可以将变量定义为只读变量, 只读变量的值不能被改变

 

readonly 变量名

举例:

username=tom readonly username

username=jack 

报错 /bin/sh: NAME: This variable is read only.

删除变量

使用unset命令可以删除变量

unset variable_name

注意:unset命令不能删除只读变量

5.字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单 引号,也可以用双引号,也可以不用引号。

单引号

skill='java'

str='I am goot at $skill' 

echo $str

输出结果为:I am goot at $skill

单引号字符串的限制:

 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行)

双引号

skill='java'

str="I am goot at $skill"

echo $str

输出结果为:I am goot at java

双引号的优点:

  •  双引号里可以有变量
  •  双引号里可以出现转义字符

获取字符串长度

skill='java'

echo ${skill} # 输出结果: java

echo ${#skill} # 输出结果: 4

提取子字符串

实例从字符串第2个字符开始截取4个字符

str="i like hadoop"

echo ${str:2} #substring(2)

echo ${str:2:2} #substring(2,2)

查找子字符串

查找字符o在那个位置(最先出现的字符)

str="hadoop is so easy"

echo `expr index "$str" o`

找的时候是从1开始查找

6.运算符

Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符。原生 bash 不支持 简单的数学运算,但是可以通过其他命令来实现,例如exprexpr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加

val=`expr 1 + 2`

echo $val

注意:

表达式和运算符之间要有空格,例如 1+2 是不对的,必须写成 1 + 2

完整的表达式要被 ` 包含,注意不是单引号,在 Esc 键下边。

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

1) 算数运算符

注意:条件表达式要放在方括号之间,并且要有空格,

例如: [$a==$b] 是错误的,必须写成 [ $a == $b ] 。

案例

#!/bin/bash a=4

b=20

#加法运算 each expr $a + $b

#减法运算 echo expr $a - $b

#乘法运算,注意*号前面需要反斜杠 echo expr $a \* $b

#除法运算 echo $a / $b

此外,还可以通过(())$(())$[]进行算术运算。

((a++))

echo "a = $a" c=$((a + b))

d=$[a + b]

echo "c = $c" echo "d = $d"

2)关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为10,变量 b  20:

7.流程控制

1)if语句

  if语句格式

if condition then

command1

command2

...

commandN

fi

if.else语句

if condition then

command1

...

commandN

else

command

fi

 

if..elif..else

if condition1 then

command1 elif condition2 then

command2

else

commandN

fi

 

案例

[root@hadoop01 export]# cat if_test.sh 

#!/bin/bash

a=20 b=10

  • 需求1: 判断 a 是否 100 

if [ $a > 100 ];

 then echo "$a 大于 100"

fi

  • 需求2: 判断 a 是否等于 b 

if [ $a -eq $b ]; 

then echo "$a 等于 $b"

else

echo "$a 不等于 $b" 

fi

  • 需求3: 判断 a 与 b 比较

if [ $a -lt $b ]; 

then

echo "$a 小于 $b"

elif [ $a -eq $b ];

then

echo "$a 等于 $b"

else

echo "$a 大于 $b"

fi

  • 需求4: 判断 (a + 10) 和 (b * b) 比较大小

if test $[ a + 10 ] -gt $[ b * b ]; 

then

echo "(a+10) 大于 (b * b)"

 else

echo "(a+10) 小于或等于 (b*b)"

fi

 

2)for 循环

格式

for variable in (list); do command

command

...

done

练习

  • 需求1: 遍历 1~5
  • 需求2: 遍历 1~100
  • 需求3: 遍历 1~100之间的奇数
  • 需求4: 遍历 根目录 下的内容

[root@hadoop01 export]# cat for_test.sh

 #!/bin/bash

# 需求1: 遍历 1~5

for i in 1 2 3 4 5; 

do echo $i;

done

  • 需求2: 遍历 1~100

for i in {1..100}; 

do echo $i

done

  • 需求3: 遍历 1~100之间的奇数

​​​​​​​for i in {1..100..2}; 

do echo $i

done

  • 需求4: 遍历 根目录 下的内容

​​​​​​​for f in `ls /`;

do

echo $f 

done

3) while 语句

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。

其格式为

while condition;

do

command

done

​​​​​​​需求: 计算 1~100 的和

#!/bin/bash

sum=0 i=1

while [ $i -le 100 ]; 

do

sum=$[ sum + i]

i=$[ i + 1 ]

done

echo $sum

运行脚本,输出:5050

4)无限循环

for ((;;)) do

command

done

while true do

command

done

8 case

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case 语句格式如下:

case  in

模式1)

command1

command2

...

commandN

;;

模式2

command1

command2

...

commandN

;;

esac

case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模 式,使用星号 * 捕获该值,再执行后面的命令。

下面的脚本提示输入14,与每一种模式进行匹配:

echo '输入 1  4 之间的数字:' 

read aNum

case $aNum in 

1) echo '你选择了 1'

;;

2) echo '你选择了 2'

;;

3) echo '你选择了 3'

;;

4) echo '你选择了 4'

;;

*) echo '你没有输入 1  4 之间的数字'

;;

esac

9 跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:breakcontinue

1) break命令

break命令允许跳出所有循环(终止执行后面的所有循环)。

需求: 执行死循环 每隔1秒打印当前时间, 执行10次停止

 

#!/bin/bash

# 需求: 执行死循环 每隔1秒打印当前时间, 执行10次停止 i=0;

while true; do sleep 1

echo $i `date +"%Y-%m-%d %H:%M:%S"` i=$[ i + 1]

if [ $i -eq 10 ]; then break

fi

done

2)continue

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

需求: 打印 1~30, 注意 跳过3的倍数

#!/bin/bash

# 需求: 打印 1~30, 注意 跳过3的倍数 for i in {1..30}; do

if test $[ i % 3 ] -eq 0; then continue

fi echo $i

done

10.函数使用

1) 函数的快速入门

格式

[ function ] funname()

{

action; [return int;]

}

 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

快速入门

#!/bin/bash

demoFun(){

echo "这是我的第一个 shell 函数!"

}

echo "-----函数开始执行-----" demoFun

echo "-----函数执行完毕-----"

2) 传递参数给函数

Shell中,调用函数时可以向其传递参数。在函数体内部,通过的形式来获 的值,

例如, 1表示第一个 参数,$2表示第二个参数... 带参数的函数示例:

#!/bin/bash

funWithParam(){

echo "第一个参数为 $1 !"

echo "第二个参数为 $2 !"

 echo "第十个参数为 $10 !" 

echo "第十个参数为 ${10} !" 

echo "第十一个参数为 ${11} !" 

echo "参数总数有 $# !"

echo "作为一个字符串输出所有参数 $* !"

}

funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出结果:第一个参数为 1 ! 第二个参数为 2 ! 第十个参数为 10 ! 第十个参数为 34 ! 第十一个参数为 73 ! 参数总数有 11 个!

作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值