因为马上学习Hadoop和Spark,所以把shell脚本相关知识总结一下。
1.关于shell:
1.1.Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell.
2.Shell也是一门编程语言<解释型的编程语言>,即shell脚本.
3.一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的.
4.shell的语法有时候会变化,所以最好是使用最常用的算法!
2.shell 脚本的执行方式:
1. 输入脚本的绝对路径或相对路径首先要赋予+x权限,也就是可执行的权限:
/root/helloWorld.sh
./helloWorld.sh
2. 不用赋予+x权限,而用解释器解释执行:
sh helloworld.sh
3. bash或sh +脚本
sh /root/helloWorld.sh
sh helloWorld.sh
4. 在脚本的路径前再加". "
. /root/helloWorld.sh
. ./helloWorld.sh
区别: 前面三个会新开一个bash,不同bash中的变量无法共享!
注意:shell在linux中以bash的形式存在,并且可以同时存在多个shell进程。
3.shell中的变量:
Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看那系统变量.
系统变量:$HOME、$PWD、$SHELL、$USER等等.
set 显示当前shell中所有变量
4.shell 脚本中的语法:
定义变量:变量=值 (例如STR=abc)
注意事项:(1)等号两边不能有空格,也就是说STR = abc这种是不可以的。如果需要写空格,那么需要双引号来讲空格脱意。
(2)变量名称一般习惯为大写
(3)双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意。如下图:
撤销变量: 例如A=9,撤销变量A则是unset A
注意事项: (1)readonly B=2 声明静态的变量 B=2 ,不能 unset (不过readonly使用的很少!!)
export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用。
注意事项: source就是将profile中的export指令执行一遍。
将命令的返回值赋给变量:
第一种: 使用反引号,就是在1旁边的波浪线那个键。例如:A=ls -la
反引号,运行里面的命令,并把结果返回给变量A 。
第二种: A=$(ls -la) 等价于反引号注意事项:这个命令会很常用!
shell中的特殊变量(常用的):
注意,这些都是在编辑shell脚本的时候使用的,不是在常规命令行。
$? 表示上一条命令输出的结果,也就是上一条命令的返回值。一般情况下,如果执行成功就返回0,失败的话返回的是非零值。 $$ 表示当前进程号 $0 表示当前脚本名称 $n 表示n位置的输入参数(n代表数字,n>=1) 就是在运行脚本时候传入的参数。 $# 表示参数的个数,常用于循环 $* 和 $@ 都表示参数列表。$*与$@区别: >(1)$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1 $2 … $n 的形式输出所有参数。 >(2)当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
$n示意:
$@ 示范:
运算符:(shell脚本中对于算数的需求并不大,但是还是要知道一下的)
格式 :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))
for循环:
第一种:
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 第二种: for ((i = 0; i <= 5; i++)) do echo "welcome $i times" done 或 for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
while循环:
第一种: while expression do command … done 第二种: i=1 while ((i<=3)) do echo $i let i++ done
- case语句:
格式:
case $1 in
first)
echo “starting”
;;
second)
echo “stoping”
;;
*)
echo “Usage: {start|stop} “ #这个是默认的,如果都不匹配就是这个
esac read 命令:用来在终端进行交互式输入的
read -p(提示语句)-n(字符个数) -t(等待时间)
read -p “please input your name: ” NAME
例如:
if判断:
语法
if condition
then
statements
[elif condition
then statements. ..]
[else
statements …]
fi
实例:
#!/bin/bash
read -p “please input your name:” NAME
#printf ‘%s\n’ NAMEif[ N A M E i f [ NAME = root ]
then
echo “hello NAME,welcome!”elif[ N A M E , w e l c o m e ! ” e l i f [ NAME = itcast ]
then
echo “hello ${NAME}, welcome !”
else
echo “SB, get out here !”
fi判断语句:
[ condition ] (注意condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
#空返回false[ condition ] && echo OK || echo notok 条件满足,执行&&后面的语句;不满足就执行||后面的语句 (1)常用判断条件: = 字符串比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 (2)常用判断条件: -r 有读的权限 -w 有写的权限 -x 有执行的权限 -f 文件存在并且是一个常规的文件 -s 文件存在且不为空 -d 文件存在并是一个目录 -b文件存在并且是一个块设备 -L 文件存在并且是一个链接
13.shell自定义函数:
语法:
[ function ] funname [()] #注意:是不能接收参数的
{
action;
[return int;]
}三种写法: function start() function start # 可以不写括号,但是前面一定有function start() #前面没有function,所以括号必须写 注意事项: 1.必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译。 2.函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
注意:上面的虽然第一行报错,但是不影响下面的运行!
14.脚本调试:
sh -vx helloWorld.sh
或者在脚本中增加set -x
上面是shell脚本的基本语法!