简单的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就是个黑洞,写入的任何东西都会丢失,其实简要说就是把正确或错误的输出扔到垃圾桶。
991

被折叠的 条评论
为什么被折叠?



