0. Shell脚本中,变量名和等号之间不能有空格!!!
1. 按固定周期执行命令:
while true
do
cmd(shell 命令)
sleep x(x为秒数)
done
n=0;
while(($n<=100));
do
top -n 1;
n=$((n + 1));
sleep 10;
done
2.获取当前时间
date "+%Y-%m-%d %H:%M:%S"
按照%Y-%m-%d %H:%M:%S格式输出当前时间
输出如下所示
3. 重定向
sh batchjob.sh 2>&1 | tee mylog.log
其中sh batchjob.sh:表示要执行的shell脚本;0,1,2:在linux分别表示标准输入、标准输出和标准错误信息输出。
tee命令
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
输入输出重定向之:'<' and '>'
'<' and '>'分别用来支持linux中的输入输出重定向,其中'<'支持输入重定向,'>'支持输出重定向。
- '<':重定向输入
sh test.sh < hadoop-hadoop-jobtracker-brix-00.out,将hadoop-hadoop-jobtracker-brix-00.out的内容作为test.sh的输入
- '>':将内容全局覆盖式的加入文件,相当于删除该文件并重新建立该文件,再写入的效果
ls * > test.txt ,将ls * 的所有信息输出到文件test.txt中
- '>!':如果存在则覆盖
- '>&':执行时屏幕上所产生的任何信息写入指定的文件中
- '>>':追加到文件中
- '>>&':屏幕上的信息追加到文件中
标准输入输出
在 Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕(上面的 std 表示 standard)。在 BASH 中使用这些概念时一般将标准输出表示为 1,将标准错误输出表示为 2。下面我们举例来说明如何使用他们,特别是标准输出和标准错误输出。
4. 定义和使用变量
outputfilename=`date '+%Y%m%d%H%M%S'`.csv //定义变量
ls >> ${outputfilename} //使用变量
5. echo显示信息
#!/bin/bash
echo "write to file." //在标准输出显示数据
echo "iput your name:"
read y_name //从标准输入读取内容
echo "Hello,${y_name}" > f_users.bat //使用了变量,使用了重定向
6. shell脚本中执行命令
- 每个命令之间用;隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
- 每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
例如:cat /etc/redhat-release && yum -y update && yum list | grep installed > installed.txt 三个命令
- 每个命令之间用 || 隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
7. shell脚本中在后台执行命令nohup和 >/dev/null 2>&1
- nohup表示永久运行。&表示后台运行
在应用Unix/Linux时,我们一般想让某个程序在后台运行,该命令的一般形式为:nohup command &。在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,输出被重定向到myout.file文件中。
- >/dev/null 2>&1
/dev/null 代表空设备文件,> 代表重定向到哪里,>/dev/null 2>&1就是不输出任何信息到终端,说白了就是不显示任何信息。
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
nohup ./mqnamesrv >/home/cxb/mqnamesrv.out 2>&1 &
即标准输出到mqnamesrv.out中,接着,标准错误输出重定向等同于标准输出,输出到同一文件中。
8. 在shell中执行命令,并将执行的结果输出到文件
#!/bin/sh
cmd=`ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'`
datetime=$(date '+%Y-%m-%d %H:%M:%S')
aaa=${cmd}
FILE="/alidata/logs/"$(date '+%Y-%m-%d')"_log.txt"
echo $datetime >> $FILE //将命令datetime运行的结果输出到文件
echo $aaa >> $FILE //将命令aaa运行的结果输出到文件
echo "$aaa" >> $FILE //将字符串aaa输出到文件
echo aaa >>$FILE //将字符串aaa输出到文件
echo "------------------------------------" >> $FILE
ps是执行的命令 使用 ` 符号(Esc下面那个)扩起来 .
FILE.txt 是写入的文件. 没有规定目录会创建文件到当前目录
echo "$aaa" 是输出到文件的时候保持格式. echo $aaa 则内容为一行
9. Linux—shell中$、$(( ))、$( )、``与${ }的区别
$( ) 与 ` ` (反引号,不是单引号) 在 bash shell 中都是用来做命令替换用的。
[root@localhost ~]# echo today is $(date "+%Y-%m-%d")
today is 2017-11-07
[root@localhost ~]# echo today is `date "+%Y-%m-%d"`
today is 2017-11-07
$var与${var}是用于变量替换的,一般情况下是没有区别的,但是用${ }会比较精确的界定变量名称的范围。
[root@localhost ~]# A=Linux
[root@localhost ~]# echo $AB #表示变量AB
[root@localhost ~]# echo ${A}B #表示变量A后连接着B
LinuxB
10. 小结
- 后台符号 &一定要放在整个命令最后
- 重定向>,>>一定紧跟着重定向文件
- 如果是 文件输出 1 stdout,2 stderr 要重定向到别的文件,也是紧跟>,>>符号。
- 如果想让stderr也跟 stdout一样输出到文件,使用 /usr/local/bin/cmd >file 2>&1,同 /usr/local/bin/cmd 1>file 2>&1 是一样的意思。
11. 将批量命令执行的结果输出到日志中
#!/bin/bash
set -xv
exec 1>mylog 2>&1
free
df -h
pwd
第二行是打开模式开关。 -v:显示shell所读取的输入值。-x:执行指令后,会先显示该指令及所下的参数
第三行 exec命令用于调用并执行指令的命令。
exec命令通常用在shell脚本程序中,可以调用其他的命令;1> mylog 是将标准输出重定向到mylog文件中;2>&1 是将标准错误定向到标准输入,一起定向到mylog中,也就是说,标准输入和标准输出都会到mylog文件中
执行上面的脚本后,就会将后面三条命令free, df -h, pwd命令的执行结果全部生产到mylog文件中。