shell入门
什么是Shell
- shell是一个命令行解释器, 他接受应用程序/用户命令,然后调用操作系统内核
- shell还是一个相当强大的脚本语言,易编写,易调试,灵活性强
系统拥有的shell
cat /etc/shells
: 查看系统支持的shell
shell脚本
- 脚本格式
#!/bin/bash
shell变量
- 变量定义使用
- 定义变量:
i=0
- 撤销变量:
unset 变量
- 声明静态变量:
readonly 变量
- 不能unset
- 不能修改
- 提升为环境变量: export
- 定义变量:
- 系统环境变量
$HOME, $PWD, $SHELL, $USER
- 显示Shell中所有变量:
set
- 特殊变量
$n
$n
: (功能描述,n为数字,$0代表该脚本名称, $1~ 9 代 表 第 一 个 到 第 9 个 参 数 , 十 以 上 的 参 数 , 需 要 使 用 大 括 号 包 含 9代表第一个到第9个参数, 十以上的参数,需要使用大括号包含 9代表第一个到第9个参数,十以上的参数,需要使用大括号包含{10})
- 特殊变量
$#
- 基本功能
$#
: 获取所有输入参数个数,常用于循环
- 基本功能
- 特殊变量
$?
$?
: 最后一次执行的命令的返回状态,如果这个变量的值是0,证明上一个命令执行成功,如果这个值是非零。则证明执行失败。
运算符
-
基本语法
$((运算式))
或$[运算式]
expr
,+, -, \*, / %
-
演示
- add
a=5 b=10 echo $[$a+$b] echo $(($a+$b)) expr $a + $b # expr运算符之间要有空格
判断式
- 基本语法
[ condition ]
: 注意,condition前后要有空格- 条件非空为true,
[lcw]
: true,[]
: 返回false
- 常用判断条件
- 两个整数之间比较
=
: 字符串比较-lt
: 小于(less than)-le
: 小于等于(less equal)-eq
: 等于(equal)-gt
: 大于(greater than)-ge
: 大于等于(greater equal)ne
: 不等于(not equal)
- 按照文件权限进行判断
-r
: 有读的权限(read)-w
: 有写的权限(write)-x
: 有执行的权限(execute)
- 按照文件类型进行判断
-f
: 文件存在并且是一个常规的文件(file)-e
: 文件存在(existence)-d
: 文件存在并且是一个目录(directory)
- 两个整数之间比较
流程控制
-
if判断
-
基本语法
if [ 条件判断式 ];then 程序 fi
if [ 条件判断 ]; then 程序 elif [ 条件判断 ] then 程序 else 程序 fi
-
小练习
#!/bin/bash # 查看是否存在一个叫做bbb的文件,如果不存在,我们就新建一个并输入b作为内容,存在就显示文件内容 if [ -f bbb ]; then cat bbb else echo "b" > bbb fi
-
-
cast语句
-
基本语法
case $变量名 in "值1") 程序1 ;; "值2") 程序2 ;; *) 默认程序 ;; esac
-
-
for循环
-
基本语法
for ((初始值;循环控制条件;变量变化)) do 程序 done
-
实例
#!/bin/bash # 累加1到100 s=0; for((i=1;i<=100;i++)) do s=$[$s+$i] done echo $s
-
语法2
for 变量 in 值1 值2 值3 do 程序 done
-
read读取控制台输入
- 基本语法
read 选项 参数
- 基本参数
-p
:read -p "请输入" i
-t 5
: 5秒内输入东西
函数
-
自定义函数语法
[function] funcname[()] { Action; [return int;] } function
-
技巧
- 必须在调用函数地方之前,先声明函数,shell脚本会逐行执行
- 函数返回值,只能通过$?系统变量获得
- 可以显示返回一个值
- 如果不显示返回,将以最后一条命令运行结果作为返回值
-
实例
-
实例一
# function可以省略,()可以省,但是不能同时省略 function aaa() { echo abcd } aaa
-
远程文件拷贝命令
- scp(secure copy): 安全拷贝
- scp定义
- scp可以实现服务器与服务器之间的数据拷贝(from server1 to server2)
- 基本语法
scp -r $pidr/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目录用户@主机:目的路径/名称
- 实践
scp -r hadoop101:/opt/module/hadoop-2.7.2 hadoop102:/opt/module
- scp定义
- rsync远程同步工具
- rsync主要用于备份和镜像,具有速度快,避免复制相同内容和支持符号连接的优点
- rsync和scp的区别
- 用rsync做文件的复制要比scp速度快,rsync只对差异文件做更改,scp是把所有文件都复制过去
- 基本语法
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
- 选项参数
-a
: 归档拷贝-v
: 显示复制过程
远程文件批量拷贝脚本
#!/bin/bash
# 1. 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if ((pcount==0)); then
echo no args;
exit;
fi
# 2. 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$name
# 3. 获取上级目录的绝对路径
pdir=`cd -P $(dirname $p1); pwd` # -P 如果时链接,进入真实目录
echo pdir=$pdir
# 4. 获取当前用户名称
user=`whoami`
# 5. 循环
for((host=2; host<4; host++)); do
echo ----------------------hadoop_$host------------------
rsync -av $pdir/$fname $user@hadoop_00$host:$pdir
done