`
weitao1026
  • 浏览: 992052 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

十分钟学会写shell脚本

 
阅读更多

大家好!我是handsomecui,下面我为大家讲解一下shell脚本的写法,讲的不好的地方,欢迎大家留言拍砖。

1.在linux下会写shell脚本是非常重要的,下面我参照例子给大家展示几个脚本,顺带这学习shell 的语法:

什么时候helloworld是必不可少的,第一个脚本肯定与helloworld是离不开的:

#!/bin/sh
a="hello world!"
num=2
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 1;}
#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目录下共有多个文件,并显示出来

 

1
2
3
4
5
6
7
8
#!/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=$1
b=$2
[ -z $a ] && echo "please \$1 number1" && exit 1
[ -z $b ] && echo "please \$2 number2" && exit 2
[ ! $# -eq 2 ] && echo "--please num1 num2" && exit 3
# $#传递到脚本的参数个数
# -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=0
i=1
while [ $i -le 100 ]
do
    sum=$(($sum + $i))
    i=$(($i+1))
done
echo "$sum"
复制代码

这个脚本就so easy了;

8.接下来,我们写个很实用的脚本吧,假设你现在在机房,你想要看看机房哪些ip在开着,方便咱。。。,是吧。

我们可以 通过ping命令测试192.168.0.151192.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就是个黑洞,写入的任何东西都会丢失,其实简要说就是把正确或错误的输出扔到垃圾桶。

写到这里大家是不是感觉耳目一新呐,哈哈!

随笔练习:还有点bug

复制代码
#/bin/bash
i=1
sum=0
#while
while [ $i -le 100 ]
do
        ((sum=sum+i))
        ((i=i+1))
done
echo $sum
#for
sum=0
for ((j=1;j<=100;j++))
do
        ((sum=sum+j))
done
echo $sum

#select
select flag in $@
do
        case $flag in
                $1)echo $1;;
                $2)echo $2;;
                $3)echo $3;;
                $4)echo $4;;
                *)echo "input error"
                break ;;
        esac
done
#shift
echo -e "the all arg is\n"
while [ $1 ]
do
        echo $1
        shift
done
#if
num=`ls | wc -l`
[ num == 0 ] && 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"
[ $? == 0 ] && mkdir $filename || echo -e "have error\n"
复制代码
分享到:
评论

相关推荐

    LinuxShell脚本学习基础视频

    资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...

    shell脚本写的加密脚本

    学习shell脚本,了解linux知识。

    python编写shell脚本

    python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本

    shell 脚本shell 脚本shell 脚本

    shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本

    Shell脚本中获取进程ID的方法

    我该如何在shell脚本中得到PID。 当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要...

    shell脚本读写sd卡的案例

    shell脚本一个读写sd卡的案例,这个例子可以帮助出学者进步了解shell编程

    Linux shell 脚本 markdown文本编辑

    有关几个shell脚本的编写,如:编写一个shell脚本程序,它带一个命令行参数,这个参数是一个文件。如果这个文件是一个普通文件,则打印文件所有者的名字和最后的修改日期...加入了自己的注释理解

    250个shell脚本

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来...

    Linux_shell脚本全面学习

    Linux_shell脚本全面学习 Linux_shell脚本全面学习

    Shell脚本编程100例

    Shell脚本编程100例。 融汇 shell 脚本知识点,集大成之作。 本书实在是学习、进修、面试、居家旅行必备精品!

    IDEA中编写并运行shell脚本的实现

    主要介绍了IDEA中编写并运行shell脚本的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Shell脚本中让进程休眠的方法(sleep用法)

    有时候写Shell的脚本,用于顺序执行一系列的程序。 有些程序在停止之后并没能立即退出,就例如有一个 tomcat 挂了,就算是用 kill -9 命令也还没瞬间就结束掉。 这么如果 shell 还没等其退出就接着执行下一行,这么...

    shell脚本shell脚本shell脚本

    shell脚本shell脚本shell脚本

    Shell脚本专家指南

    Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...

    109个shell脚本合集.pdf

    109个shell脚本合集.pdf

    shell 脚本 实例 shell 脚本 实例

    参考shell脚本实例.rar参考shell脚本实例.ra参考shell脚本实例.rarr

    linux下shell脚本实现数据的导出

    第一次接触linux系统,之前写的数据导出不好使了。...找了好多资料,最后决定写个shell脚本;没接触过shell脚本,网上大部分例子都写的挺复杂的;贴个简单的,不带传参什么的;只是最简单的数据表的导出备份

    Linux-shell脚本全面学习.pdf

    Linux-shell脚本全面学习.pdf

    提高cpu利用率的shell脚本

    需要提高cpu利用率的shell脚本

Global site tag (gtag.js) - Google Analytics