shell脚本local
‘壹’ shell中使脚本可随意执行
其实不用放到~/usr/bin这个路径
只要把你的脚本所在的路径放到系统的$PATH里面,就可以执行了
例如脚本在/local里面
你可以export PATH=$PATH:/local
这样你的脚本就可以在任何目录下执行了
‘贰’ Red Hat 5上运行shell脚本时出现以下错误syntax error near unexpected token ‘local'
function func1 少了()
#!/bin/bash
hello="var1"
echo $hello
function func1(){
local hello="var2"
echo $hello
}
echo $hello
试一下.
‘叁’ 如何使shell脚本成为守护进程
1,if条件语句里面表达式要与左右[ ] 用空格隔开,否则运行时会报错
2,用表达式给变量负值时要将表达式放在括号()里面,并在前面加符号"$",应该还有其他方法 目前只会这种,在参考那篇博客用单引号运行无法通过。
3,ps aux | grep $PROGRAM | grep -v grep | wc -l 此表达式检测运行进程数量
4,ps aux | grep $PROGRAM | grep T | grep -v grep | wc -l 此表达式检测进程运行状态,0:运行 1:停止 但进程依然存在 可以通过命令 kill -SIGSTOP pid 进行测试
第一个条件判断目标进程运行数目 数目小于1即为0 则运行目标进程
第二条件判断目标进程是否处于停止状态 处于停止状态则kill掉 重新运行该进程
应用程序编译完及脚本编写好后,在/etc/rc.local 文件中添加执行语句 /usr/mytest/mytest.sh & 重启后就能自动加载守护进程了。
‘肆’ linux下如何写个SHELL脚本,每天执行这么几句命令:
1、登录CentOS7系统,打开终端,输入命令env shell打印出shell进程的环境变量。
‘伍’ shell脚本怎么设置执行程序的时间 比如每个月的5号执行
只需编辑/etc/init.d/rc.local文件,在最后加上你的脚本即可。
比如:我已经编写了一个脚本shell.sh,存放在/home/mars704/Desktop/ 下面
在终端输入 gedit /etc/init.d/rc.local编辑文件,在结尾出加入:
/home/mars704/Desktop/sh.sh 即可开机自动加载脚本
首先,linux随机启动的服务程序都在/etc/init.d这个文件夹里,里面的文件全部都是脚本文件(脚本程序简单的说就是把要运行的程序写 到一个 文件里让系统能够按顺序执行,类似windows下的autorun.dat文件),另外在/etc这个文件夹里还有诸如名为rc1.d, rc2.d一直到rc6.d的文件夹,这些都是linux不同的runlevel,我们一般进入的X windows多用户的运行级别是第5级,也就是rc5.d,在这个文件夹下的脚本文件就是运行第5级时要随机启动的服务程序。需要注意的是,在每个rc (1-6).d文件夹下的文件其实都是/etc/init.d文件夹下的文件的一个软连接(类似windows中的快捷方式),也就是说,在 /etc/init.d文件夹下是全部的服务程序,而每个rc(1-6).d只链接它自己启动需要的相应的服务程序!
要启动scim(某一 程序),我们首先要知道scim程序在哪里,用locate命令可以找到,scim在/usr/bin/scim这里,其中usr表 示是 属于用户的,bin在linux里表示可以执行的程序。这样,我就可以编写一个脚本程序,把它放到/etc/init.d里,然后在rc5.d里做一个相 应的软链接就可以了。
这个脚本其实很简单,就两行:
#!/bin/bash
/usr/bin/scim
第一行是声明用什么终端运行这个脚本,第二行就是要运行的命令。
还 需要注意的一点是,在rc5.d里,每个链接的名字都是以S或者K开头的,S开头的表示是系统启动是要随机启动的,K开头的是不随机启动的。这 样,你就可以知道,如果我要哪个服务随机启动,就把它名字第一个字母K改成S就可以了,当然,把S改成K后,这个服务就不能随机启动了。因此,我这个链接 还要起名为SXXX,这样系统才能让它随机启动。在RH下,rc.local是默认启动的最后一个脚本文件,所以,如果你想要随机启动,还有一种方法就是在rc.local的尾部加入/usr/bin/scim,这样就可以了
‘陆’ 开机自动运行 shell脚本 怎么写
可以编辑/etc/rc.local文件添加上述操作命令。
脚本修改完毕后,添加可执行权限chmod +x. /etc/rc.local
再进行重启测试。
‘柒’ shell脚本:从远程服务器下载文件到本地
a.
至少有三种在外通用:
(1)setup
$home/.rhosts
for
rcp,
remsh
等等
(2)setup
$home/.netrc
for
ftp
(3)ssh,scp
要判断文件是否下载成功,最简单的就是用check
sum
(linux/unix的通用command是
cksum)。好比你用个script去scp
file回来后,应该也执行一个ssh去远端做个cksum,把cksum的output存起来,回到local做同样的cksum,两个一比较就知道了。按理说,这些利用tcp/ip的protocol写的自动会做error
checking而且要是有error自动会re-transmit,不过你还是要考虑local的file
system是不是爆了等等,所以最简单的做法就是两边都做cksum一比就知道了。
‘捌’ shell编程中,如何将编写的脚本把其脚本名当做shell命令来使用
首先确保你的shell脚本正确,且有执行权限。
然后sudo cp 目录/你的脚本文件名 /bin/你的脚本文件名
然后就可以了。
直接用
你的脚本文件名当作shell命令了。
看我的例子
sudocp/home/blue/mvmv.sh/bin/mvmv.sh
mvmv
然后我的桌面上的stop文件就变成了STOP了。(因为我的shell脚本如下)
#!/bin/bash
cd/home/blue/Desktop/
mvstopSTOP
说明这种方法成功。
‘玖’ 怎样写一个本地shell脚本来远程主机上的shell脚本
安装CentOS下安装命令很简单,如下sudoyuminstallexpect至于Mac用户,可以通过homebrew安装(需要先安装homebrew,请自行Google)brewinstallexpect测试脚本我们写一个简单的脚本实现scp拷贝文件,在脚本里配置密码,保存为scp.exp如下#!/usr/bin/expectsettimeout20if{[llength$argv]<2}{puts"Usage:"puts"$argv0local_fileremote_path"exit1}setlocal_file[lindex$argv0]setremote_path[lindex$argv1]setpasswdyour_passwdsetpasswderror0spawnscp$local_file$remote_pathexpect{"*assword:*"{if{$passwderror==1}{puts"passwdiserror"exit2}"$passwd\r"exp_continue}"*es/no)?*"{send"yes\r"exp_continue}timeout{puts"connectistimeout"exit3}}注意,第一行很重要,通常我们的脚本里第一行是#!/bin/bash,而这里是你机器上expect程序的路径,说明这段脚本是由expect来解释执行的,而不是由bash解释执行,所以代码的语法和shell脚本也是不一样的,其中setpasswdyour_passwd设置成你自己的密码,然后执行如下命令./scp.exp./local_fileuser@host:/xx/yy/执行前确保scp.exp有执行权限,第一个参数为你本地文件,第二个为远程主机的目录,运行脚本如果报错“connectistimeout”,可以把超时设长一点,第二行settimeout20可以设置超时时间,单位是秒。脚本执行效果如下还能做什么细心的同学一定发现了,其实expect提供的是和终端的一种交互机制,输入密码只是其中一种应用形式,只要是在终端阻塞需要输入时,都可以通过expect脚本完成自动输入,比如前面脚本里配置了两种交互场景,一种是终端提示"password:"时输入密码,还有一种是提示"yes/no)?"时输入“yes”,如果和远程主机是第一次建立连接,执行scp.exp脚本效果是这样的所以我们可以根据终端的提示来配置输入命令,这样就能达到了自动化的效果。至于处理其它交互场景,只需要照着上面的脚本依葫芦画瓢就行了
‘拾’ 编写个shell 脚本将/usr/local/test 目录下大于100K 的文件转移到/tmp 目录下
#!/bin/bash
for file in `ls /root`
do
if [ -f $file ]; then
if [ `ls -l $file|awk '{print $5}'` -gt 10000 ]; then
mv $file /tmp/
fi
fi
done
如果有什么不懂的话可以去看看《Linux就该这么学》这本书,非常适合新手学习Linux。