十分钟学会写shell脚本
大家好!我是handsomecui,下面我为大家讲解一下shell脚本的写法,讲的不好的地方,欢迎大家留言拍砖。
1.在linux下会写shell脚本是非常重要的,下面我参照例子给大家展示几个脚本,顺带这学习shell 的语法:
什么时候helloworld是必不可少的,第一个脚本肯定与helloworld是离不开的:
#!/bin/sh
a="hello world!"
num=
echo "a is : $a num is : ${num}nd"
运行结果: a is : hello world! num is : 2nd
shell脚本简单易懂,只要有一点点c语言的基础,这些都是小case;
2.下面带着大家学学if语句:
先抛出一个问题:写一个脚本,判断当前所用的shell
#!/bin/sh
#注意if的空格以及[]里面的空格这里错了半天啊
if [ "$SHELL" = "/bin/bash" ];then
echo "your login shell is the bash \n"
echo "SHELL is : $SHELL"
else
echo "your login shell is not bash but $SHELL"
fi
#[ -f "somefile" ] : 判断是否是一个文件
#[ -x "/bin/ls" ] : 判断/bin/ls是否存在并有可执行权限
#{ -n "$var" } : 判断$var变量是否有值
#[ "&a" = "$b" ] : 判断$a和$b是否相等
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
if [ -f "/etc/shadow" ];then
echo "电脑密码使用隐藏字符"
else
echo "并没有"
fi
#是注释的意思,相关部分已经在里面详细给大家注释解释了,注意if语句的格式
if[];then
elif[];then
else
fi
另外注意if语句还可以简单的用&&与||或语句来代替;另外如果想要深入了解if可以找男人test(在linux遇到问题要学会找男人解决,man)
3.为了让大家更加熟练的运用shell,那么练习下吧,问题:写一个脚本使其从一个文件里面读入有echo的语句,并把其写在本文件末尾;
#!/bin/sh
#-r代表此文件是否可读,具体见man test
mailfolder=/home/handsome/work/linux_learn/shell_learn/readme.txt
#[ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit ;}
#echo "$mailfolder has mail from : "
#grep "^echo " $mailfolder if [ -r "$mailfolder" ];then
echo "$mailfolder has massage from : "
echo | grep '^echo ' $mailfolder >> readme2.txt
chmod +r readme2.txt
cat readme2.txt >> $mailfolder
rm -f readme2.txt
else
echo "Can not read $mailfolder"
touch $mailfolder
chmod +rw $mailfolder
echo "echo 人生自古谁无死,六区蛋清找旱情! " >> $mailfolder
fi
这里由于重定向不能本文见输出到本文件输出,于是我就想了个办法,新建个文件,再重定向到这个文件,大神有别的简单方法可以下面留言拍砖;
4.接下来,我们练习下while的用法,老规矩具体问题来分析;
问题:写一个脚本(不建议使用for变量--for是根据空格取值)
1.设定变量FILE的值为/etc/passwd
2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID什么(Hello,root,your UID is0.)
3.统计一个有多少个用户
#!/bin/bash
fl=/etc/passwd
count=`cat $fl | wc -l`
#下面是一个管道,下面循环读文件中的每一行
cat $fl |
while read line
do
user=`echo $line|awk -F ':' '{print $1}'`
#代表以 :分段$1就是取第1段
uid=`echo $line|awk -F ':' '{print $3}'`
echo "hello, $user Your UID is $uid"
done
echo "====User_count:$count===="
#前面求得的用户数
这里要注意到awk的用法,可以找linux的男人解决;
5.练习一下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===="
这个问题就相对简单了些,一个for语句就可以搞定,当然可以while搞搞
6.那么问题来了:
question:
传递两个整数给脚本,让脚本分别计算并显示这两个整数的和,差,积,商
#!/bin/bash
a=$
b=$
[ -z $a ] && echo "please \$1 number1" && exit
[ -z $b ] && echo "please \$2 number2" && exit
[ ! $# -eq ] && echo "--please num1 num2" && exit
# $#传递到脚本的参数个数
# -eq相当于=, -ne相当于不等于, -ge >= , -gt >, -le <=, -lt <
echo "$a + $b = $(($a+$b))"
echo "$a - $b = $(($a - $b))"
echo "$a * $b = $(($a*$b))"
echo "$a / $b = $(($a/$b))"
这里要注意的是,需要传入两个参数;
具体用到的一些知识请看下面:
读到这里大家对上面的小脚本是不是感觉特别easy了,哈哈;
7.写一个脚本;求1到100的和?
#!/bin/bash
sum=
i=
while [ $i -le ]
do
sum=$(($sum + $i))
i=$(($i+))
done
echo "$sum"
这个脚本就so easy了;
8.接下来,我们写个很实用的脚本吧,假设你现在在机房,你想要看看机房哪些ip在开着,方便咱。。。,是吧。
我们可以 通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线
#!/bin/bash
for i in `seq `
do
ping -c1 -w1 192.168..$i > /dev/null >&
#-c可以指定ping的次数,-w测试的时间 -w 1就是1秒中无论成功失败都结束
#-c -w后面都要输入参数所以都要带上l
#$?代表最后命令退出状态,0代表没错,其他代表有错
[ $? -eq ] && echo "192.168.51.$i IP is UP!" || echo "192.168.51.$i IP is down!"
done
在这里2>&1代表不显示错误信息,其实就是把错误重定向到标准输出,然后重定向到/dev/null,/dev/null就是个黑洞,写入的任何东西都会丢失,其实简要说就是把正确或错误的输出扔到垃圾桶。
写到这里大家是不是感觉耳目一新呐,哈哈!
随笔练习:还有点bug
#/bin/bash
i=
sum=
#while
while [ $i -le ]
do
((sum=sum+i))
((i=i+))
done
echo $sum
#for
sum=
for ((j=;j<=;j++))
do
((sum=sum+j))
done
echo $sum #select
select flag in $@
do
case $flag in
$)echo $;;
$)echo $;;
$)echo $;;
$)echo $;;
*)echo "input error"
break ;;
esac
done
#shift
echo -e "the all arg is\n"
while [ $ ]
do
echo $
shift
done
#if
num=`ls | wc -l`
[ num == ] && echo -e "have no file\n" || echo -e "there are $num files\n"
for file in `ls`
do
echo "this file $file is "
[ -f $file ] && echo -e "ordinary file"
if [ -d $file ];then
echo -e "dictionary file";
fi
done #function
filename=""
rename(){
filename=echo `date` | awk -F ' ' '{print $1 $2 $3}'
}
rename
echo -e "filename is $filename"
[ $? == ] && mkdir $filename || echo -e "have error\n"
转载请注明地址:http://www.cnblogs.com/handsomecui/
十分钟学会写shell脚本的更多相关文章
- PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony
这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人 ...
- 30分钟快速学习Shell脚本编程
什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...
- 使用C#给Linux写Shell脚本(下篇)
在上篇的<使用C#给Linux写Shell脚本>结尾中,我们留下了一个关于C#如何调用BashShell的问题.在文章发布之后,我留意到有读者留言推荐使用“Pash”(一款类PowerSh ...
- 写shell脚本速查笔记
linux shell脚本的语法蛋疼,而且对于java开发人员来说又不常用,常常是学了一次等到下次用的时候又忘记了.因此制作这个速查笔记,用于要写shell脚本时快速回忆&速查. 获取当前脚本 ...
- 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/
- 写Shell脚本自动生成首行
送给经常写shell脚本的兄弟们常写shell脚本的时候,大家一定都有困扰,怎么样能让.sh文件的表头自己生成,不用我们自己去敲呢 首先我们要编写一下/etc/vimrc执行 vim /etc/vim ...
- 让你十分钟学会shell
1.先介绍下shell的工作原理 Shell可以被称作是脚本语言,因为它本身是不需要编译的,而是通过解释器解释之后再编译执行,和传统语言相比多了解释的过程所以效率会略差于传统的直接编译的语言. 这是s ...
- 使用C#给Linux写Shell脚本
在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...
- 十分钟学会 tmux
tmux 是一款终端复用命令行工具,一般用于 Terminal 的窗口管理.在 macOS 下,使用 iTerm2 能应付绝大多数窗口管理的需求. 如上图所示,iTerm2 能新建多个标签页(快捷键 ...
随机推荐
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- 学习selenium所须要具备的技术
学习selenium所须要具备的知识或技术 1.selenium进行的自己主动化測试是基于ui层面的,所以html,css,javascript基本上是不可缺少的,至于javascript,有非常多的 ...
- Oracle—RMAN备份(一)
一.RMAN备份相关概念 1.RMAN备份中表空间不需要处于backup模式下,它备份数据文件,归档日志文件,控制文件,spfile和备份集片,但不备份联机重做日志文件,临时文件和口令文件. 2.备份 ...
- CentOS 6.5 升级内核 kernel
本文适用于CentOS 6.5, CentOS 6.6,亲测可行,估计也适用于其他Linux发行版. 1. 准备工作 1.1 下载源码包 Linux内核版本有两种:稳定版和开发版 ,Linux内核版本 ...
- WebAPI中Message Handler与Filter的区别
两者最主要的区别是关注点不同.Message Handlers应用到HTTP Request,Filters仅应用到controller/action上. 如果某种行为应用到大多数的Request时, ...
- 未能加载文件或程序集 system.data.sqlite 完美解决
错误提示如下图所示: 解决办法: 使用SQLITE 预编译的静态链接DLL 下载地址:http://pan.baidu.com/s/1kT5i8bP
- 吸血鬼数字算法参考 -- javascript版本
// 吸血鬼数字 java编程思想 第四章 75页 练习10 for (var i = 10; i <= 99; i++) { for (var j = i + 1; j < 99; j+ ...
- 《APUE》-第五章标准IO库
大多数UNIX应用程序都使用I/O库,本章说明了该库所包含的所有函数,以及某些实现细节和效率方面的考虑.同时需要重点关注标准I/O使用了缓冲的技术,但同时也是因为它的出现,产生了很多细节上的问题. 流 ...
- 读mongoose api 记录
mongoose 需要在Schemas基础上进行使用 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var blo ...
- 自定义textView的高度
原文地址: http://www.cocoachina.com/ios/20141226/10778.html iOS 8 之后的新特性