shell脚本的编写

简单的shell脚本的编写

1.helloworld脚本的编写

#!/bin/bash  //这是sh指令的路径
a="hello world!"  //定义一个变量并赋值"hello world"
num=2  //定义一个变量  赋值2
echo "a is:$a  num is :$num"//$符号加上变量是取变量的值的意思

运行结果: a is:hello world! num is :2

2.if的用法

先看看if的语法:

   if[];then   //注意if后加空格   [ 内容前边有空格,后边也要有空格 ]
    
    elif[];then
    
    else
    
    fi  //if语句的结束语句
  • 搞上一个例子

test_if.sh

#!/bin/sh
if [ "$SHELL" = "/bin/bash" ];then
echo "your login shell is the bash"
echo "SHELL is : $SHELL"
else 
echo "your login shell is not bash but $SHELL"
fi

运行指令 sh test_if.sh
运行结果:
your login shell is the bash
SHELL is : /bin/bash

  • 再来一个if的例子

study_if.sh

#!/bin/bash
num=10
if [ $num -gt 10 ];then
echo "num<10"
elif [ $num -lt 10 ];then
echo "num >10"
else
echo "num=10"
fi

注意:

-eq 等于,如:if [ "$a" -eq "$b" ]   
-ne 不等于,如:if [ "$a" -ne "$b" ]   
-gt 大于,如:if [ "$a" -gt "$b" ]   
-ge 大于等于,如:if [ "$a" -ge "$b" ]   
-lt 小于,如:if [ "$a" -lt "$b" ]   
-le 小于等于,如:if [ "$a" -le "$b" ]   
<   小于(需要双括号),如:(("$a" < "$b"))   
<=  小于等于(需要双括号),如:(("$a" <= "$b"))   
>   大于(需要双括号),如:(("$a" > "$b"))   
>=  大于等于(需要双括号),如:(("$a" >= "$b"))   

运行上边的脚本:sh study_if.sh
运行结果:num=10

  • 实例
    需求,/home/hadoop/shells中有一个test1.txt的文件,编写脚本将test1.txt中的以chang开头的行的内容追加到text2.txt中
    需求分析:

  • 首先要判断test.txt是否可读,如果可读的话进行查找

  • 如果不可读的话将其属性搞成可读

  • 之后按照正则表达式来匹配以"chang"开头的行

  • 判断test2.txt是否存在,如果存在判断是否可写,如果不可写的话将其可写

  • 如果test2.txt不存在的话,创建
    编写select_insert.sh

#!/bin/bash
inpath=/home/hadoop/shells/test1.txt
outpath=/home/hadoop/shells/test2.txt
#判断输入路径是否存在并有可执行的权限
if [ -e $inpath ];then
  echo "输入的路径存在"
  #如果存在的话判断是否可读
  if [ -r $inpath ];then
        echo "输入路径正常"
  else
     chomd +r $inpath
  fi
  #判断输出路径是否存在
  if [ -e $outpath ];then
        echo "outpath exists"
        if [ -w $outpath ];then
                echo "outpath can be write"
                echo | grep "^chang" $inpath >> $outpath
        else
                chomd +w $outpath
                echo | grep "^chang" $inpath >> $outpath
        fi
  else
        echo "outpath is not exists"
        mkdir $outpath
        echo | grep "^chang" $inpath >> $outpath
  fi
else

  echo "输入的路径不存在"
fi

这里注意常用判断文件和目录的几张用法

-e filename 如果 filename存在,则为真 
-d filename 如果 filename为目录,则为真 
-f filename 如果 filename为常规文件,则为真 
-L filename 如果 filename为符号链接,则为真 
-r filename 如果 filename可读,则为真 
-w filename 如果 filename可写,则为真 
-x filename 如果 filename可执行,则为真 
-s filename 如果文件长度不为0,则为真 
-h filename 如果文件是软链接,则为真

3.while的用法

  • 案例一

编写一个脚本 读取/home/hadoop/shells/user.txt
文件中的内容格式如下:中间用"\t"进行分割
zhangsan 1
lisi 2
wangwu 3
zhaoliu 4
要求实现输出:
zhangsan 你好,你的id是1

编写脚本

#!/bin/bash
inpath=/home/hadoop/shells/user.txt
count=`cat $inpath | wc -l`
cat $inpath |
while read line
do
        username=`echo $line|awk -F '|' '{print $1}'`
        uid=`echo $line|awk -F '|' '{print $2}'`
        echo "$username 你好,你的id是 $uid"
done
echo "一共$count人"

注意:

  • 1.当给变量赋值的时候需要 值如果以命令的形式存在的话需要将命令加上``号
  • 2.wc的用法

语法:wc [选项] 文件…

说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。

该命令各选项含义如下:

  • c 统计字节数。

  • l 统计行数。

  • w 统计字数。

这些选项可以组合使用。

输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。

行数、字数、字节数、文件名

如果命令行中没有文件名,则输出中不出现文件名。

  • 3.awk的用法
    awk -F 指定分隔符
    {print $1}打印出第一个元素 起始元素的下标是1 如果{print $0}打印出分割之前的所有
  • 案例二
    用编写脚本实现用while实现1-100的加法
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
let sum=$sum+$i
let i++
done
echo "$sum"

4.for循环

编写脚本实现如下功能 :
1.切换工作目录至/tmp
2.依次向/tmp目录中的每个文件或子目录问好(Hello,log)
3.统计/tmp目录下共有多个文件,并显示出来

#!/bin/bash
cd /tmp
for i in /tmp/*
do
    echo "Hello , $i"
done
count=`ls -l|grep '^-'|wc -l`
echo "====file_count:$count===="

5.实际案例

假设你现在在机房,你想要看看机房哪些ip在开着,方便咱。。。,是吧。

我们可以 通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线

#!/bin/bash
for i in `seq 2 254`
do
    ping -c1 -w1 192.168.51.$i > /dev/null 2>&1
    #-c可以指定ping的次数,-w测试的时间 -w 1就是1秒中无论成功失败都结束
    #-c -w后面都要输入参数所以都要带上l
    #$?代表最后命令退出状态,0代表没错,其他代表有错
    [ $? -eq 0 ] && echo "192.168.51.$i IP is UP!" || echo "192.168.51.$i IP is down!"
done

在这里2>&1代表不显示错误信息,其实就是把错误重定向到标准输出,然后重定向到/dev/null,/dev/null就是个黑洞,写入的任何东西都会丢失,其实简要说就是把正确或错误的输出扔到垃圾桶。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值