shell脚本学习与总结

 1,设置运行环境
在脚本的顶部写入:#!/bin/bash
2,SHELL中变量与赋值
str=hello   linux中变量不需定义,要用时直接赋值使用。如:str,注意等号两边不能有空格
str=`ls -l /tmp/sh`  如果要把某个命令的执行结果赋给某个变量时,=号右边要用``括起来
echo "$str"   查看变量的值,此处结果为:hello
3,从键盘输入字符或数值赋给指定的变量
read name   如:从键盘输入lishi,则name的值为:lishi
4,"",'',``双引号,单引号,倒引号之间区别
echo "my name is $name" 显示字符串,但含有转义字符引用其变量的值。例中结果:my name is tom
echo 'my name is $name' 把单引号中的内容原样显示出来,结果:my name is $name
echo `ls -l`   把倒引号中字符当作命令来执行,并把执行结果显示出来。
5,加,减,乖,除,求模运算。注意要用倒引号括起来
expr `5 + 4`
expr `5 - 4`
expr `5 \* 4`
expr `5 / 4`
expr `5 % 4`
如果是在脚本里面进行运算时,倒引号要包括=号右边全部内容。
如:
sum=0
sum=`expr $sum + 1`
6,对文本操作的命令
less 能上下翻
more 能一屏一屏的翻
head 看文本的头10行  参数-n 5 表示只显示头5行
tail 看文本的尾10行,加 -f参数,能实时看日志文件的变化。如看tomcat日志文件变化。tail -f /usr/tomcat/logs/canitsl.out
参数-n 5 表示只显示头5行
7,$?表示上一个命令是否正确执行,0表示正常,1表示错误
ls /tmp/hello,如果/tmp/下没有hello这个文件或目录。则$?为1,反之为0
8,./test lishi wangwu
$0程序名,$1第一个参数的名称,例中$0为test
$*参数组成的字符串,例中$*为lishiwangwu
$#传递给程序参数的总数目,例中$#为2
9,linux中变量分为全局环境变量和用户配置变量
全局环境变量针对系统中所有用户而设置的工作环境目录,在/etc/profile中
用户配置变量针对某一用户的。在用户登录的目录下,.bash_profile中
10,重定向
重定向就是改变原来输入输出的方向,默认都是屏幕输出设备,键盘是输入设备。
“>”是输出重定向符。“<”是输入重定向符。
“>”只存放正确的信息,“2>”存放错误的信息,每次存入前都会把之前文件内容清空再放入
如:ls /usr > /tmp/aaa   把/usr目录下的所有文件和文件夹名称信息放到期/tmp/aaa文件中。
如:ls /test 2> /tmp/aaa  如果没有/test文件夹,这时就会发生错误,那么2>就会把错误信息存入aaa文件中。
“>”能创建新文件,如:>hello.java
“>”能清空一个文件 如hello.java文件中有内容,我再>hello.java这时,hello.java内容清空
“>>”双大于号在一起就变成了追加功能,在之前的文件内容后面追加内容。
如:cat /tmp/sh >> /tmp/aaa   把/tmp/sh目录中的所有文件和目录信息追加到aaa文件中。aaa文件之前的内容不会被清除。
cat > hello.java时,能在屏幕上输入很多的内容,按ctrl+D时就会退出。再cat hello.java时
刚才输入的内容,全在hello.java文件中
11,输入重定向
如:cat > a.txt <<EEE,从屏幕上输入内容到a.txt中,直到输入EEE时才结束!!!!
像这种结合方式,经常被用在自动执行记录某些日志,或者写入信息时用到。
SYSPROFILE=/etc/profile
cat >> $SYSPROFILE <<EOF
export  JAVA_HOME=/usr/java/jsdk
export  JAVA_OPTS="-Xms64m -Xmx768m"
export  PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin::$PATH
export  CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EOF
12,管道
管道:把前一个命令的输出作为下一个命令的输入。顾名思义就是连接前后两个管道的作用。
把上一个管道的尾与下一个管道的头相连接。
ls -l /tmp/test | wc -l     统计/tmp/test目录中共有多少个文件和目录。
把/tmp/test目录中文件和目录按列显示。并把显示出来的结果作为wc -l命令的信息源。
13,条件判断语句
字符串比较:=,!=,-n:判断字符串长度是否大于0,大于0则为真,-z:判断字符串长度是否等于0,等于0则为真
数字比较:-eq相等, -ge大于等于,-le小于等于,-ne不等于,-gt大于,-lt小于
逻辑判断:!非,&&与,||或
文件判断:-d目录判断,-f文件判断,-r可读,-w可写,-x可执行
test 条件1 比较符 条件2  如:test 1 -eq 1
[ 条件1 比较符 条件2 ]   如:[1 -eq 1 ],[ -n "" ]
[ `who | wc -l` -le 10 ]&& echo "YES"  判断当前系统的登录用户数是否小于等于10,是,则输出YES
16,循环语句:
while 条件为真时,执行
do
..
done
例:
j=1
while((j<=10)) 或者while [ j -le 10 ]
do
echo "j=$j"
j=`expr $j + 1
done
 
if语句:
if             
then        
else       此处也可elif与fi再嵌套  
fi        
例:
x=4;y=7
if [ $x -eq $y ]
then 
echo "相等"
else
echo "不相等"
fi
 
case 变量 in
数值1) 语句 ;;
数值2) 语句 ;;
*) 语句 ;;  #如果数值不在范围之中,就执行这一行
例:
USER=whoami
case $USER in
lishi)
echo "you are LISHI";
echo "Welcome ";;
root)
echo "you are ROOT"
echo "hi root ";;
admin)
echo "you are admin";
echo "admin,hello ";;
*)
echo "当前用户不是lishi,root,admin";;
esac
 
for 循环
例:
用FOR循环显示/tmp/sh目录中的每个文件信息。变量i的取值是/tmp/sh目录中的每个文件
如for i in "a" "b" "c",此时变量i每次循环的取值为a,b,c
path=/tmp/sh/
for i in `ls $path`
do
ls -l  $i
done
例:
#用for与if相结合的手法,显示出从1到键盘输入数之间的偶数
#注意if语句的双括号
read x
for((i=1;i<=$x;i++))
do
if [ $i % 2 == 0 ]
then
echo "$i"
fi
done
14,函数
# 定义一个累加的函数sum, 再从键盘上输入两个数,再调用sum函数
# 注意,函数一定要放在调用该函数的前面
sum()
{
a=$x
b=$y
total=`expr $a + $b`
echo "total = $total"
}
echo "please enter two number:"
read x
read y
sum $x,$y
 
shell  start:
shell有bsh,bash,cash等
1,在linux中管理员用户登录进去时,提示符为:#,一般用户登录进去时的提示符为:$
登录进去后,退出或要切换用户时,用:exit命令,正常退出。
2,查看当前系统中的shell版本,在/etc/shell目录中查看。
3,在系统中查看不同用户默认的shell版本,/etc/passwd  查看当前用户的shell,echo shell
4,直接用命令改变某个用户的shell环境:chsh 系统用户名,根据提示输入新shell路经,如:/bin/bash
5,查看当前用户的环境变量和ID号,set | grep user,set | grep uid  或,查看/etc/passwd文件
6,查看某个命令在哪个位置  which 命令  如:which ifconfig   当某些一般用户中有些命令提示无法找到
或执行时,一般是环境变量中没有把该命令的路经加进来。用export命令设置环境变量 
7,查看以前使用过的命令 history   history -c清除之前使用过的命令
8,;在shell中用来区分一个命令的结束。一行中可以多个命令
9,调试shell脚本用. 脚本文件名  或 bash 脚本文件名
10,文件权限分三类:
a,文件属主:创建该文件的用户
b,同组用户:拥有该文件的用户组中的任何用户
c,其它用户:即不属于拥有该文件的用户组的某一用户
如:-rwxr-xr-x 1 root root  217 08-10 19:51 test1.sh
第一个字符表示文件的类型,是文件夹,还是普通文件 例中-表示普通文件
后面的9个字符分三段,第一段是文件属主的权限
第二段是同组用户的权限,第三段是其它用户的权限
赋权限:g是代表同组用户,o是代表其它用户
chmod go+wx ./test.sh  给同组用户和其它用户赋写和执行的权限  
chmod u+wr ./test.sh  给自己赋读和写权限
chmod o+wrx ./test.sh   给其它用户赋读,写和执行的权限
去权限与赋权限同理,只是把“+”换成“-”就可以了
chmod go-rw ./b.c  把同组用户和其它用户读和写的权限去除

11,一般权限也可以用数字表示:4:读,2:写,1:执行,
如果用数字给某一个文件赋权限,要写3段数字,如:764,则表示
用户自己是读写执行,同组用户是读写,其它用户是读的权限。
12,给文件和文件夹赋权限时,两者互不干扰,除非在给文件夹赋权限时带-R参数
那么,该文件夹下的所有内容就赋予了和文件夹一样的权限了,小心使用-R
13,查看文件夹权限时,用:ll -d /tmp/sh    -d是查看文件夹的,不然只会
列出该文件夹的内容了。

14,改变文件的所属用户,chown oracle /tmp/sh/api.sh
   改变文件的所属组,chown :oracle /tmp/sh/api.sh
同时,改变文件的所属用户和组,chown oracle:dba /tmp/sh/api.sh  那么api.sh的所属用户和组信息为:
-rwxrwxr-x 1 oracle dba 264 07-28 15:57 /tmp/sh/api.sh
15,id  命令,查看当前是哪个用户,以及哪个组的相当信息
16,groups 查看系统当前有多少个组,groups 用户名 如:groups oracle,查看用户所属组
17,getent group 组名  如:getent group dba  查看dba组中有哪些用户
18,创建一个用户并把它加入到指定组中 useradd wangcai -G root

19,当一个脚本需要以拥有者或组的用户执行时,需要用到suid,guid
文件设置了suid或guid时,如果该文件没有执行权限,那么设置suid或guid时就没有意思,会用大写"S"
表示。4代表suid,2代表guid
如:start-orcl.sh 例子,首先用chown改变文件所属用户,再用chmod改变文件suid和guid的权限
-rwxr-xr-x 1 root root  632 08-15 17:31 start-orcl.sh
chown oracle start-orcl.sh
-rwxr-xr-x 1 oracle root  632 08-15 17:31 start-orcl.sh
chmod 6751 start-orcl.sh
-rwsr-s--x 1 oracle root  632 08-15 17:31 start-orcl.sh

20,用指定的用户身份执行一个脚本 su - oracle -c "/tmp/sh/start-orcl.sh"
以oracle的身份执行start-orcl.sh这个脚本
21,创建快捷方式 ln -s /tmp/sh 1  创建快捷方式1指向/tmp/sh,访问1相当于访问/tmp/sh一样。
22,定时任务:
用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它。
基本用法:
crontab -l
列出当前的crontab任务
crontab -d
删除当前的crontab任务
crontab -e (solaris5.8上面是 crontab -r)
编辑一个crontab任务,ctrl_D结束
crontab filename 
crontab的格式为:分 时 日 月 星期 命令(中间用空格隔开)。
    crontab文件的条目是从左边读起的,第一列是分,以此类推,最后一列是需要执行的命令。
    每一列称为crontab的一个域,在这些域中,可以用-来连接一个时间范围,例如星期一到星期五,可以用1-5来表示。
    单个时间点可以用,号分隔,比如星期一和星期四,那么可以表示为1,4。如果某个表示时间的域没有特别限制,可以用*号表示。每一个时间条目包含5个域,用空格隔开。
    比如我希望每天晚上21:30运行bin目录下的cleanup.sh文件,那么该命令就应该为:
    30 21 * * * /app/bin/cleanup.sh (注意:由于不需要限定日期、月份、星期,所以日期、月份和星期域用*号表示)
    比如我希望每月得1、10、20的00:00运行backup.sh文件,那么命令应该为:
    00 00 1,10,20 * *  /app/bin/backup.sh (注意:由于不需要限定月份和星期,所以月份和星期域用*号表示)
    #每两个小时
    0 */2 * * * date
    crontab -e 然后在打开的文件中编辑内容,如:0 */2 * * * date,保存退出。
    也可以把如: 0 */2 * * * date的内容,放到一个filename文件中,再用crontab filename 
    把内容加到crontab中,这时用crontab -l也可以看到filename文件中的内容。
让配置文件生效:如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后。
也要重新启动cron服务器,/etc/init.d/crond restart 。编辑/etc/crontab文件,在末尾加上一行: 30 5 * * * root init 6 这样就将系统配置为了每天早上5点30自动重新启动。
需要将crond设置为系统启动后自动启动的服务,可以在/etc/rc.d/rc.local 中,在末尾加上
service crond start
如果还需要在系统启动十加载其他服务,可以继续加上其他服务的启动命令。
比如: service mysqld start 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值