编写你的shell其实很简单

来源:http://www.youlihuishou.com 作者:杏彩平台注册网址-操作系统 人气:159 发布时间:2019-10-17
摘要:一、简单的多级菜单 [root@web129 ~]# cat menu.sh #!/bin/bash#shell菜单演示function menu(){echo -e `date`cat EOF-----------------------------------菜单主页:`echo -e "33[35m 1)系统状态33[0m"``echo -e "33[35m 2)服务管理

一、简单的多级菜单

[root@web129 ~]# cat menu.sh 
#!/bin/bash
#shell菜单演示
function menu()
{
echo -e `date`
cat <<EOF
-----------------------------------
>>>菜单主页:
`echo -e "33[35m 1)系统状态33[0m"`
`echo -e "33[35m 2)服务管理33[0m"`
`echo -e "33[35m 3)主菜单33[0m"`
`echo -e "33[35m Q)退出33[0m"`
EOF
read -p "请输入对应序列号:" num1
case $num1 in
    1)
    echo -e "33[32m >>>系统状态-> 33[0m"
    system_menu
    ;;
    2)
    echo -e "33[32m >>>服务管理-> 33[0m"
    server_menu
    ;;
    3)
    echo -e "33[32m >>>返回主菜单-> 33[0m"
    menu
    ;;
    Q|q)
    echo -e "33[32m--------退出--------- 33[0m"
    exit 0
    ;;
    *)
    echo -e "33[31m err:请输入正确的编号33[0m"
    menu
esac
}
function system_menu()
{
cat<<EOF
------------------------
********系统状态********
------------------------
1)nginx 状态
2)http 状态
3)tomcat 状态
X)返回上一级目录
------------------------
EOF
read -p "请输入编号:" num2
case $num2 in
    1)
    `echo -e "systemctl status nginx.service"`
    system_menu
    ;;
    2)
     `echo -e "systemctl status httpd.service"`
    system_menu
    ;;
    3)
     `echo -e "systemctl status tomcat.service"`
    system_menu
    ;;
    x|X)
    echo -e "33[32m---------返回上一级目录------->33[0m"
    menu
    ;;
    *)
    echo -e "请输入正确编号"
    system_menu
esac
}
function server_menu()
{
cat<<EOF
------------------------
1)开启服务
2)停止服务
X)返回上一级目录
------------------------
EOF
read -p "请输入编号:" num3
case $num3 in
        1)
        op_menu
        ;;
        2)
        op_menu1
        ;;
        x|X)
        echo -e "33[32m-- -----返回上一级目录---------> 33[0m"
        menu
        ;;
        *)
        echo -e "请输入正确编号"
        system_menu
esac
}

function op_menu()
{
cat<<EOF
------------------------
1)开启nginx服务
2)开启http服务
3)开启tomcat服务
X)返回上一级目录
------------------------
EOF
read -p "请输入编号:" num4
case $num4 in
        1)
    `echo -e "systemctl start nginx.service"`
    op_menu
        ;;
        2)
    `echo -e "systemctl start httpd.service"`
        op_menu
    ;;
    3)
    `echo -e "systemctl start tomcat.service"`
        op_menu
        ;;
        x|X)
        echo -e "33[32m--------返回上一级目录------->33[0m"
        server_menu
        ;;
        *)
        echo -e "请输入正确编号"
    op_menu
esac
}
function op_menu1()
{
cat<<EOF
------------------------
1)停止nginx服务
2)停止http服务
3)停止tomcat服务
X)返回上一级目录
------------------------
EOF
read -p "请输入编号:" num5
case $num5 in
        1)
        `echo -e "systemctl stop nginx.service"`
        op_menu1
        ;;
        2)
        `echo -e "systemctl stop httpd.service"`
        op_menu1
        ;;
        3)
        `echo -e "systemctl stop tomcat.service"`
        op_menu1
        ;;
        x|X)
        `echo -e "33[32m >>>返回上一级目录---> 33[0m"`
        server_menu
        ;;
        *)
        echo -e "请输入正确编号"
        op_menu1
esac
}
menu
[root@web129 ~]# 

 

显示效果如下:

杏彩平台注册网址 1

杏彩平台注册网址 2

 

上节课我们一起学习了Sqoop(数据迁移工具),这节课我们一起简单学习一下Shell脚本。

引语:我本人以前并没有写过shell脚本,也许是因为懒,也许是没有被逼到要去写shell的地步。但是,前段时间,工作需求,要求重新跑几个月的脚本,这些脚本是每天定时进行跑的,而且每天是好几个脚本一起关联跑的。你也许会说,这太简单了,写个循环,然后,让他自己去跑就行了。是的,你可以很顺手的用你的编程语言去写循环,如PHP。但是,你知道,这样做其实是改变了代码结构了,鬼知道会导致什么结果呢? 并且,我并不保证里面所有代码的意思,我都懂!那么,问题来了,在不改变原代码的前提下,怎样去循环这几个月的时间呢? 没错,那就是,模拟真实运行时的情况,传入需要接收的日期参数(前提是你的代码里面已经有了这个门)!你知道,这种定时脚本都有一个优雅的名字,crontab,那么,就是shell了,你要做的就是写shell了。

 首先我们来新建一个test.sh文件,并在文件内输入一句用来输出的语句,如下所示。

  没有写过shell? 没关系了,其实需求确定之后,你显然已经知道,这太简单了。不就是语法问题吗? 你别告诉我你不会谷歌,不会百度!

[root@itcast03 ~]# vim 杏彩平台注册网址,test.sh
echo '123'

  我就先抛几个需要考虑的点,后面直接给代码吧!

保存上面的内容,我们试着执行一下test.sh,发现会报如下所示的提示,说没有权限执行。

    1、怎样获取当前时间,并转换成你需要的格式? 关键词: date

[root@itcast03 ~]# ./test.sh
-bash: ./test.sh: Permission denied
[root@itcast03 ~]#

    2、怎样防止同时多次运行同一个内容? 关键词: lock

因为我们是在root用户下,我们可以使用sh test.sh来强制执行,如下所示,发现执行成功了。

    3、怎样让程序运行完一次之后,冷却执行? 关键词: sleep

[root@itcast03 ~]# sh test.sh
123
[root@itcast03 ~]#
我们也可以增加对当前目录下的test.sh文件的所有者增加可执行权限,然后再执行test.sh,如下所示,发现执行成功。(我们来说一下chmod u+x test.sh这句话的意思,chmod是权限管理命令change the permissions mode of a file的缩写。u代表所有者,x代表执行权限。 + 表示增加权限。chmod u+x test.sh就表示对当前目录下的test.sh文件的所有者增加可执行权限)

    4、怎样指定运行时间段,counter或者起始日期? 关键词: while, let, expr

[root@itcast03 ~]# chmod u+x test.sh
[root@itcast03 ~]# ./test.sh
123
[root@itcast03 ~]#

    5、附加:怎样知道当前的运行状态如何了? 关键词: echo ,  progress

接着我们再定义一个变量并打印出这个变量的值,我们先注释掉echo '123',在文件中注释的话,在前面加"#"就可以。并新增蓝色字体的内容,如下所示。

把这些问题考虑好了,你就一步步去写吧,不知道语法的,直接谷歌、百度,代码参考如下:

[root@itcast03 ~]# vim test.sh
直接打印123
echo '123'
定义变量并打印输出变量的值
STR="HELLO WORLD"
echo "$STR"
保存退出后test.sh文件之后,我们来执行一下该脚本。发现真的打印出了我们定义的变量STR的值。
[root@itcast03 ~]# ./test.sh
HELLO WORLD
[root@itcast03 ~]#

#/bin/bash
# @author: youge
# @date: 2015-12-22

startDate="2015-11-24"    # when to start 
startDateTimestamp=`date -d "$startDate" +%s`
endDate="2015-12-14"      # when to end
endDateTimestamp=`date -d "$endDate" +%s`
sleepTime=25        # to take a break
haveSthUndo=0      # check if there is something undo , if not , exit the program

rootDir='/cygdrive/d/wamp/ppi/'
dir=$rootDir"cron/"

itemArr=("itemA" "itemB" "itemC")  # the items you want to run there
for item in ${itemArr[@]}
do
  runFile=$rootDir$item".run";
  if [ ! -f "$runFile" ] ; then
  haveSthUndo=1;
  echo $item" runs on me" $runFile " touched";
  echo -e "script startTime: "`date "+%Y-%m-%d %H:%M:%S"` "nbeginDate:" $startDate "nendDate:" $endDate "npath:" $dir >> $runFile
  touch "$runFile";
  break;
  else
  echo $item "is runing, skipped. " $runFile;
  fi
done;
if [ $haveSthUndo -ne 1 ]; then
  echo -e "Nothing to do now ...ncheck it...";
  exit;
fi
echo "haveSthUndo eq: " $haveSthUndo;

while [[ $endDateTimestamp -ge $startDateTimestamp ]]
do
  runDate=`date -d @$startDateTimestamp +%Y-%m-%d`;    #1987-01-06
  params="item=$item&d=$runDate";
  msg="[`date "+%Y-%m-%d %H:%M:%S"`] now we run the date: "${runDate}" [params]: "${params};
  echo $msg;          # to show me ...
  echo $msg >> $runFile;

  # run the scripts below
  cd $dir &&
    /bin/php ./script1.php $params &&
    /bin/php ./script2.php $params &&    
    /bin/php ./scriptx.php $params
  # run the scripts upon

  startDateTimestamp=`expr $startDateTimestamp + 86400`;    # run the next day ...

  echo " ___sleeping for $sleepTime seconds ... ";
  x='';
  for ((itime=0; itime<$sleepTime; itime++)); do
    let itime2=$itime+1;
    progress=`expr $itime2 * 100 / $sleepTime`;
    printf "cooling:[%-"$sleepTime"s]%d%%r" $x $progress
    x=#$x
    sleep 1;              # sleep xx seconds to run the next time, show the progress
  done;
  echo;
done;
echo "[`date "+%Y-%m-%d %H:%M:%S"`] the end." >> $runFile;

#end of the file

假如我们想要看下这个变量打印的执行过程,我们可以在脚本中添加一句"set -x",如下所示。
set -x

附录:

定义变量并打印输出变量的值

STR="HELLO WORLD"
echo "$STR"
我们再来执行一下test.sh这个脚本,会发现多了下面蓝色字体的两行内容,这两行内容就是过程信息,显示了为何会打印出这个结果。
[root@itcast03 ~]# ./test.sh
++ STR='HELLO WORLD'
++ echo 'HELLO WORLD'
HELLO WORLD
[root@itcast03 ~]#
接着我们用该脚本来执行一下我们那个wordcount,当然,前提是我们的HDFS系统根目录下已经有wc.txt文件了,wc.txt文件的内容如下图所示。

杏彩平台注册网址 3

image

然后我们在test.sh文件中输入如下蓝色字体的内容并保存退出。

[root@itcast03 ~]# vim test.sh
直接打印123
echo '123'

set -x
定义变量并打印输出变量的值
STR="HELLO WORLD"
echo "$STR"

hadoop jar /itcast/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /wc.txt /wcout

我们执行test.sh脚本,如下所示,由于信息太多,我只截取了一部分。

[root@itcast03 ~]# ./test.sh
++ hadoop jar /itcast/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /wc.txt /wcout
16/10/29 23:20:19 INFO client.RMProxy: Connecting to ResourceManager at itcast03/169.254.254.30:8032
16/10/29 23:20:19 INFO input.FileInputFormat: Total input paths to process : 1
16/10/29 23:20:26 INFO mapreduce.Job: map 0% reduce 0%
16/10/29 23:20:32 INFO mapreduce.Job: map 100% reduce 0%
16/10/29 23:20:40 INFO mapreduce.Job: map 100% reduce 100%
16/10/29 23:20:40 INFO mapreduce.Job: Job job_1477726373472_0008 completed successfully
16/10/29 23:20:40 INFO mapreduce.Job: Counters: 43

既然脚本执行成功了,我们到HDFS系统来看一下是否正确帮我们统计好了单词的数量,如下图所示,发现确实帮我们正确统计出了单词的数量。

杏彩平台注册网址 4

image

现在假如我们不想在控制台打印日志,而是把日志放到某个日志文件当中并且让后台进程来执行该脚本。执行的脚本内容如下,刚才我们的服务器上已经有wcout文件夹了,现在我们改为输出到服务器的wcout2文件夹当中,其中>> /root/logs的意思是将控制台的信息输出到root目录下的logs文件当中。2>&1的意思是将错误及标准的信息都输出到root目录下的logs文件当中。最后一个&的意思是让脚本在后台进程运行。(这里说一个小技巧,就是如果你的鼠标当前在一句很长的话开头的地方,如果想让光标直接定位到最后的位置,可以按Shift+A组合键来实现,前提是非编辑模式

[root@itcast03 ~]# vim test.sh

根据本人初涉shell,遇到的问题例举如下,希望可以减少大家走弯路的时间:

直接打印123

  1、整个shell脚本,其实就相当于你在终端输入的一系列命令,如果想在shell里做什么,就先想想在终端可以做什么吧,字符的的连接,就是直接用 "" 双引号,输出,变量定义无 $ 符号,但是使用时一定要加上 $ 符号。

echo '123'

  2、"="  赋值符号,两边一定不能有空格,这和其他语言有区别,尤其是你还有自己代码美观风格时特别注意,否则会报语法错误!

用来打印出执行过程的语句

set -x
定义变量并打印输出变量的值
STR="HELLO WORLD"
echo "$STR"
hadoop jar /itcast/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /wc.txt /wcout2 >> /root/logs 2>&1 &

我们来运行下test.sh脚本,运行情况如下所示,发现这次控制台没有打印任何信息,而且一敲回车,当前进程并没有等待worldcount程序执行完再有反应,而是直接就返回了,真正执行脚本的是后台的一个进程。

[root@itcast03 ~]# ./test.sh
[root@itcast03 ~]#

   我们来看一下是不是控制台信息输入到root目录下的logs文件了,发现确实如我们所愿。

杏彩平台注册网址 5

image

我们再来看一下HDFS文件系统是不是生成了wcout2文件夹并且该文件夹下的结果文件中的结果是否正确,如下图所示,发现结果完全正确。

杏彩平台注册网址 6

image

接着我们来看一下如何打印date信息,我们在脚本中输入如下内容。

CURRENT=date +%Y-%m-%d
echo $CURRENT

写好了内容,我们来执行脚本,执行的内容如下,发现正确打印出了今天的日期。

[root@itcast03 ~]# ./test.sh
2016-10-30
[root@itcast03 ~]#

** 最后我们来简单弄一个定时器的例子,如下所示,其中五个号代表的意思为:第一个意思是分钟,第二个的意思是小时,第三个的意思是日期,第四个的意思是月份,第五个的意思是星期。/bin/date >> /root/time相当于第六个,意思是要执行的命令。这些如果指定了具体的值就用具体的值,如果没有指定的话,就用默认值,我们现在有五个,那么就默认是1分钟执行一下/bin/date并将信息写到/root/time文件当中。*

**[root@itcast03 ~]# crontab -e

          • /bin/date >> /root/time**

过段时间我们来查看一下time文件中的内容,如下所示,发现确实是每隔1分钟执行一次命令。

** [root@itcast03 ~]# more time
Sun Oct 30 00:56:01 CST 2016
Sun Oct 30 00:57:01 CST 2016
Sun Oct 30 00:58:01 CST 2016
Sun Oct 30 00:59:01 CST 2016
Sun Oct 30 01:00:01 CST 2016**

** 当然这里只是说了一个最简单的例子,大家可以从网上查询更加详细的定时器的例子来学习。**

** 好了,本小节关于Shell脚本简单入门就说到这儿吧,后面还会深入学习。**

  3、for 中的数组内容是以 " " 空格分隔,而非 "," 逗号分格

  4、条件判断 [ true ] 中括号 后面需要有一个空格,但是两个中括号之间不能有空格如 [[ true ]]

  5、while 条件判断可以用 () 括号,也可以用 [[ ]] 中括号

  6、如果用windows写shell,一定要注意换行符格式 n 而非 rn , 需要借助一些编辑器(如notepad++)更改换行符格式!

终了: 其实,语言只是一种工具,永远不会太难(太难也不会有人用啊),真正能让工具工作起来的,是你的思想!

其实很简单,Just do it .

[ root @my-pc ]$ sh urScripts.sh    #see you next time

以上就是本文的详细内容,希望对大家的学习有所帮助。

您可能感兴趣的文章:

  • shell结合expect写的批量scp脚本工具
  • 大小写字母转换的shell脚本代码
  • windows下写的shell脚本在linux执行出错的解决办法
  • shell脚本编写的俄罗斯方块游戏代码
  • 用PHP和Shell写Hadoop的MapReduce程序
  • Shell脚本注释写法
  • shell脚本连接、读写、操作mysql数据库实例
  • PowerShell入门教程之编写和使用脚本模块实例
  • Shell脚本一次读取文件中一行的2种写法

本文由杏彩彩票app发布于杏彩平台注册网址-操作系统,转载请注明出处:编写你的shell其实很简单

关键词:

上一篇:【杏彩平台注册网址】firewall防火墙使用

下一篇:没有了

最火资讯