Linux编写Shell脚本入门
一、 一般编写shell需要分3个步骤
1. 新建一个脚本文件,并编写程序
vi hello.sh
#!/bin/bash #注释 #输出 printf '%s\n' "Hello World!" echo "Hello World!"
2. 给该文件添加执行权限
chmod +x hello.sh
如果权限不够,可以用管理员权限
sudo chmod +x hello.sh
3. 执行脚本
相对路径,在这个脚本所在的文件下,
./hello.sh
绝对路径,假设我的文件在/home/user/hello.sh
./home/user/hello.sh
可以不给文件加权限(即不要第2步)直接执行,如下命令:
bash hello.sh
sh hello.sh
4. 输出结果如下
Hello World!
Hello World!
二、 计算程序运行时间
1. 首先获取时间
#!/bin/bash #获取当前时间 yyyy-MM-dd HH:mm:ss 格式 nowtime=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"` #获取当前日间 HH:mm:ss 格式 nowtime2=`date --date='0 days ago' +%H:%M:%S` printf '%s\n' "A is: $nowtime" printf '%s\n' "A is: $nowtime2"
可以参考www.2cto.com/os/201512/455379.html
2. 执行程序
其中sum是我写的c语言程序编译后的文件
#!/bin/bash #绝对路径 /home/hadoop/zc/c/sum #相对路径 #./sum
3. 程序运行时间(延时)
Linux shell脚本中的延时
可以使用sleep或usleep函数:
i: sleep:默认为秒
sleep 1s 表示延时1秒
sleep 1m 表示延时1分钟
sleep 1h 表示延时1小时
sleep 1d 表示延时1天
ii: usleep:默认为微秒
1s = 1000ms = 1000000us
#!/bin/bash #s为单位 #date中有很多控制格式的,其中%s是获取当前时间距离1970-01-01 00:00:00 UTC的时间差。 #记录开始时间 start=$(date +%s) #程序 sleep 5s #记录结束时间 end=$(date +%s) #计算时差 time=$(( $end - $start )) #输出 #echo $time printf '%s\n' "sleep $time seconds"
4. 程序执行时间(以sum为例)
#!/bin/bash #s为单位 #date中有很多控制格式的,其中%s是获取当前时间距离1970-01-01 00:00:00 UTC的时间差。 #记录开始时间 start=$(date +%s) #程序 /home/hadoop/zc/c/sum #记录结束时间 end=$(date +%s) #计算时差 time=$(( $end - $start )) #输出 #echo $time printf '%s\n' "Program Finished in $time seconds"
三、 先后提交两个程序
如果两个程序在一个终端提交,则运行会出现问题。所以两个程序要在多个终端上运行。
linux Shell新建终端,可以参考Ubuntu下自动打开多终端的多个标签并执行不同脚本的方法
#!/bin/bash #新建终端 gnome-terminal #新建标签页 #gnome-terminal --tab
但是,新建终端后,两个程序还是在同一个终端上运行,还会出问题。
i: 一个脚本的实现,运行两个程序。(以sum为例,假设sum在/home/user下面)
#!/bin/bash printf '%s\n' "Hello test!" gnome-terminal -x bash -c "/home/user/sum;exec bash"
ii: 我用两个脚本做的,第一个脚本是wc.sh,第二个脚本是pi.sh,我们执行第一个脚本,第一个脚本延迟5s后自动调用第二个脚本如下:
#!/bin/bash printf '%s\n' "Hello WC!" #休眠5s sleep 5s # #./pi.sh gnome-terminal -x bash -c "bash ./pi.sh;exec bash"
#或者
#gnome-terminal -x bash -c "./pi.sh;exec bash"
#!/bin/bash #新建终端 #gnome-terminal -x bash -c "ls; exec bash" printf '%s\n' "Hello Pi!"
最后效果是先打印出Hello WC! ,然后等5秒,创建一个新终端,并调用pi.sh ,这时开始执行pi.sh,结果是打印Hello Pi!
关于怎样在新的终端调用程序,可以参考gnome-terminal技巧
四、 linux 下如何通过ssh到其他机器然后执行命令
这里ssh免密钥连接就不讲了。
如果我连到另一台机器上只是执行一个命令可以这样写:
ssh hostname@IP cd /opt/ #其中 hostname是你要连接机器的用户名,IP是其对应的IP地址
如果我连到另一台机器上执行多于一个命令可以这样写:
ssh hostname@IP "cd /opt/;pwd" #注意:当多于两个命令时,一定要把所有命令以分号的方式写在双引号里面。