今天遇到一个需求:一个文件中写了很多测试命令,需要读取文件中的命令,并执行,然后根据返回的执行结果,做一些文件拷贝的功能。由于以前从来没接触过shell脚本,只能一边百度语法,一边写代码,其中菜鸟教程的教程很好,值得推荐。就这样写下了第一段很简单的shell代码,留作纪念。
#!/bin/bash
dir="/usr/local"
#循环读取文件的每一行
cat ${dir}/test.txt | while read line
do
echo $line
#执行取得的命令,接受返回值
temp=`$line`
#截取返回值的0到5位
val=${temp:0:5}
echo $val
if [ $val != "00002" ]
then
file=$RANDOM
#拷贝文件到指定目录,以取得的随机数重命名
cp tomcats/tomcat1/bin/startup.sh $file.sh
fi
done
写的过程中,遇到几个问题,总结如下
1.shell读取文件也可以用for循环,但for循环其实是按照空格读取的,不能真正读取一行
2.if条件中,[]中的等号两边一定要加空格。
3.-ne等比较的运算符只适用于数字,不适用于字符串
上面的功能,还可以用expect脚本语言模拟人机交互实现。但是一般的Linux系统好像没有安装expect的环境,这里先安装环境,步骤如下。
1.下载:expect-5.43.0.tar和tcl8.4.11-src.tar,放到/usr/local/src目录下
2.安装tcl,步骤如下:
tar -zvxf tcl8.4.11-src.tar.gz
cd tcl8.4.11/unix
./configure
make && make install
3.安装expect,步骤如下:
tar -zvxf expect-5.43.0.tar.gz
cd expect-5.43.0
./configure --with-tclinclude=/usr/local/src/tcl8.4.11/generic --with-tclconfig=/usr/local/lib/
make && make install
安装完成后可以测试是否成功,命令whereis expect
expect代码如下,只粘了开始写的几行,留做参考:
#!/usr/bin/expect
send "ifconfig\r"
expect "eth0*"
send "cp /usr/local/tomcats/tomcat1/bin/startup.sh /usr/local/aa.sh"
send "\r"
expect eof
exit