shell

微笑

--------------------------shell script部分------------------------
一、什么是shell
shell是c程序写一门脚本语言,它主要承担是用户和linux系统使用的桥梁。
shell编程指两方面,一个是对shell程序进行编程。一个是使用shell进行编程。


二、shell有那些解释器?
/bin/bash
/bin/sh
/bin/tcsh
/bin/ksh (需要安装)
由于bash是开源免费易用,所以linux默认的shell也是采用的bash


三、shell运行的环境、运行方式
第一种方式运行脚本:
vi test1.sh
echo "123456...."
执行:在执行的时候指定解释器
/bin/sh ./test1.sh


第二种方式执行shell脚本
可以在脚本文件的第一行指定解释器
vi test2.sh
#!/bin/sh
echo "the second way to run shell"


用这种方式执行脚本,必须给脚本添加可执行权限
chmod u+x ./test2.sh 


执行:
./test2.sh


四、shell编程
(1).shell的变量定义和使用
变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
同时,变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。


使用一个定义过的变量,只要在变量名前面加美元符号即可,
vi test3.sh
#!/bin/sh
name="laowang"
echo "$JAVA_HOME"
echo "$name"


输出的结果:
/home/hadoop/jdk1.7.0_79
laowang


变量的定义可以使用双引号和单引号 
vi test4.sh
#!/bin/sh
name="laowang"
sex='gay'
echo '$JAVA_HOME'
echo '$name'
echo "$sex"
输出的结果:
$JAVA_HOME
$name
gay


所以:
 单引号字符串的限制:
(1).单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
(2).单引号字串中不能出现单引号(对单引号使用转义符后也不行)
 
 双引号的优点:
(1).双引号里可以有变量
(2).双引号里可以出现转义字符




只读变量:readonly
age=10
readonly age
age=20 #执行时报错,提示不能修改
echo "$age"


删除变量: unset
age=10
unset age
echo "$age" #没有结果


拼接字符串
name1="laoli"
echo "hi,$name1"
输出结果:
hi,laoli


获取字符串长度 
name1="laoli"
echo "${#name1}"


提取子字符串 
name1="laoli"
echo "${name1:1:2}" #从下标为1开始,长度2
输出的结果:
ao




(2).shell的数组
素组定义:
arr_name=("laowang" "xiaowang" "xiaoxiaowang")
或者
arr_name=(
"laowang" 
"xiaowang" 
"xiaoxiaowang"
)
获取某一个元素:
element1=${arr_name[0]}(注意不能$arr_name[0])
echo "$element1"
获取素组的长度
len=${#arr_name[*]}(可以这么写#arr_name[@])
echo "$len"




(3).shell运算符操作
1)算数运算符
 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,
 例如 awk 和 expr,expr 最常用。
 expr 是一款表达式计算工具,使用它能完成表达式的求值操作。 
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 -10。
* 乘法 `expr $a \* $b` 结果为  200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
 
vi test7.sh 
#!/bin/sh
a=10
b=20
c1=`expr $a - $b`
c2=`expr $a + $b`
c3=`expr $a \* $b`
c4=`expr $a / $b`
echo "$a -  $b => $c1"
echo "$a +  $b => $c2"
echo "$a \* $b => $c3"
echo "$a /  $b => $c4"




2)关系运算符
-eq : equal     检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne : not equal 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt : greater than 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt : less than 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge : greater equal 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le : less than 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。


案例:
vi test8.sh
#!/bin/sh
a=$1
b=$2
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi


运行:./test8.sh 100 200 
100 -eq 200: a 不等于 b
100 -ne 200: a 不等于 b
100 -gt 200: a 不大于 b
100 -lt 200: a 小于 b
100 -ge 200: a 小于 b
100 -le 200: a 小于或等于 b




3)布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o (or)或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a (and)与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。


#!/bin/sh
a=$1
b=$2
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi


if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi


运行:./test9.sh 10 20


4)字符串运算符
定变量 a 为 "abc",变量 b 为 "efg":
a=abc
b=efg
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。


vi test.10.sh


a="abcd"
b="werf"
if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi
if [ -n $a ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi


5)文件测试运算符
-d 检测文件是否是目录,如果是,则返回 true。
-f 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-s 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e 检测文件(包括目录)是否存在,如果是,则返回 true
案例:
#!/bin/sh
path=/home/hadoop/shell/newfile
if [ -d $path ];then
   echo "$path is a directory"
fi


if [ -f $path ] #判断是否为文件
 then 
   echo "$path is a file"
   if [ -s $path ] #判断文件是否为空
     then
 echo "$path is not empty"
    fi
fi


if [ -e $path ];then
   echo "the path exists!"
else
 echo "the path not exists!"
fi


(4).shell的条件判断
if [ $a -eq $b ]
 then
  echo " ......"
fi
  
if [ $a -eq $b ]
 then
  echo " ......"
else
  echo " ++++++"
fi


if [ $a -eq $b ]
 then
  echo "-eq"
elif [ $a -gt $b ]
 then
  echo " -gt "
else
  echo " other "
fi  

 
(5).shell for/while循环
vi test12.sh
#!/bin/sh
for i in 1 2 3 4 5
 do
   echo $i
 done
 


 vi test13.sh
#!/bin/sh
for i in `seq 1 5`
 do
   echo $i
 done
 
 vi test14.sh
#!/bin/sh
for((i=1;i<=5;i++))
 do
   echo $i
 done
 
常用的案例效果: 输出当前路径下所有文件夹的路径
vi test15.sh
!/bin/sh
path=`pwd`
echo "$path"
for file in `ls ./`
do
   if [ -d $path/$file ];then
    echo $path/$file
   fi
 done
 
 
 
 while 判断:
vi test16.sh
#!/bin/sh
i=1
while(($i<=5))
do
  echo "$i"
 # let "i++"
  i=`expr $i + 1`
done
 
 
 
(6).shell的方法定义
(7).shell时间




五、综合案例
1、删除当前目录下大小为0的文件
2、给某个文件夹下所有文件问好
3、列出某个路径下所以文件的路径(非文件夹)
4、判断hdfs文件是否存在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值