首先shell是在linux下运行的一种环境,它是以shell脚原本运行的,学会了它基本能够解决任何问题,也能够用shell脚本开发。java
和java,python的相比,其弱类型的语言没有那么复杂的结构,编程讲究习惯,写代码时也要遵循这个习惯,就像这个是老祖宗 定的规则同样python
shell脚本代码习惯linux
我整理了一些你们当作参考:面试
1 数字不加引号
单引号表示字符串或者固定不变的字符
其余都用双引号shell
2 写脚本第一行加入#!/bin/bash sh脚本的习惯(不要问什么)编程
变量数组
变量是存储的数据的方式tomcat
只读变量bash
#!/bin/sh NAME="nihaoma" readonly NAME NAME="wobuhaoa"
这样变量会报错,由于设置了只读app
取消定义变量
unset 变量名称
若是变量没有被定义能够用echo ${变量名:-自定义内容} ,返回自定义内容。若是有定义返回变量值,此可判断变量没有定义,确保变量有值
=,表示若是变量没有定义,直接给变量赋自定义的值
变量的类型
变量类型分为全局变量,局部变量和shell变量(shell自带的变量)
shell特殊变量
$0 获取文件当前的文件名 包括路径
$n 获取当前执行shell脚本的第n个参数 n=1...9 若是n>9 用大括号 ${10}
sh n.sh das 213d
脚本里面写 echo $1 $2 $3
运行sh n.sh das 213d
结果为das 213d 其对应的就是脚本后面的参数,$3没有>参数就没了
$! 执行上一个指令的PID
$* 获取当前shell的全部参数 $1 $2 $3 ...
$# 执行命令行参数的总个数
dirname $0 取全路径
basename $0 取名称
$? 对于上一个命令判断是否成功成功返回0
2权限拒绝 1-125运行失败 126找到命令可是没法执行 127未找到该命令 >128命令被强制结束
$$ 取进程号
$@ 这个程序的全部参数 $1 $2 $3
$_ 在此以前执行的命令或脚本的最后一个参数
shift语句
其按照以下方式从新命名全部位置参数变量,即$2成为$1,$3成为$2***在程序中每使用一次shift语句,都使全部的位置参数依次向移动一个位置,并使位置参数$#减1,直到减到0为止
变量的获取
↑查看变量字符数 或者echo $a | wc -m
↑取第三个字符到结尾 也能够理解成删除前两个字符
↑取第三个字符总共两个
或者 echo ${a} |cut -c 3-4
↑从开头删除最短匹配的字符,##最长
↑从结尾删除最短匹配的,%%最长
${变量/旧字符串/新字符串} 若变量内容符合“旧字符串”,则首个旧字符会被新字符替换。
${变量/旧字符串//新字符串} 若变量内容符合“旧字符串”,则所有旧字符会被新字符替换。
批量文件名修改实战
将下面文件用shell去除_strong
chen_1995_1_2_strong.jpg
chen_1995_1_3_strong.jpg
chen_1995_1_4_strong.jpg
chen_1995_1_5_strong.jpg
1.首先造数据
vi a.log ,将文件名复制进去
2.写造数据的shell命令
for f in `cat a.log`;
do `touch $f`; done
3.写修改文件名的shell脚本
vi aaa.sh
for f in `ls *.jps`
do
mv $f `echo ${f%_strong*}.jpg`; done
替换也是同样,批量更名
rename .JPG .HTML *.jpg
原来的名称 改的名称 原来文件名
shell计算方式
普通计算
命令行传参
let计算
expr 计算
注意:中间要加空格不然不累加 乘号前面要加转义符,除号后面试了下能够不加
bc 计算(支持小数)
bc计算能够经过管道符也能够直接bc进入bc运算,最后试了下好像也不支持小数
DATE时间获取
#!/bin/bash YY=`date +%Y` #获取年 echo $YY mm=`date +%m` #获取月 echo $mm DD=`date +%d` #获取日 echo $DD HH=`date +%H` #获取小时 echo $HH MM=`date +%M` #获取分 echo $MM dd=`date +%S` #获取秒 echo $dd hello=$YY$mm$DD$HH$MM$dd echo $hello bigone=`date +%Y%m%d%H%M%S` #获取精确时间 echo $bigone a=10 b=10 if [ $hello -eq $bigone ] then echo true else echo false fi
if判断
条件表达式
[ aaaa ] -eq [ bbbb ] 中括号两边要带空格
-eq 测试两个整数是否相等
-ne 测试两个整数是否不等
-gt 测试一个数是否大于另外一个数
-lt 测试一个数是否小于另外一个数
-ge 大于或等于
-le 小于或等于
组合测试条件
-a: and
-o: or
!: 非
逻辑与:&&
第一个条件为假 第二个条件不用在判断,最总结果已经有
第一个条件为真,第二个条件必须得判断
逻辑或:||
只要有一个条件为真,直接判断为真
字符串比较
== 等于 两边要有空格
!= 不等
> 大于
< 小于
文件判断
-z string 测试指定字符是否为空,空着真,非空为假
-n string 测试指定字符串是否为不空,空为假 非空为真
-e FILE 测试文件是否存在
-f file 测试文件是否为普通文件
-d file 测试指定路径是否为目录
-r file 测试文件对当前用户是否可读
-w file 测试文件对当前用户是否可写
-x file 测试文件对当前用户是均可执行
-z 是否为空 为空则为真
-a 是否不空
a="sadasdasd" if [ -z $a ]; then echo kong else echo bukong fi
if语法
if 判断条件 0为真 其余都为假
单分支if语句
if 判断条件;then
statement1
statement2
.......
fi
双分支的if语句
复制代码
if 判断条件;then
statement1
statement2
.....
else
statement3
statement4
fi
以下:
read -p "please input your grade:" x declare -i x if [ "$x" == "" ];then echo "you must input the word in it" exit 5 fi if [ $x -eq 100 ];then echo "你已经超神了" elif [ $x -ge 90 -a $x -le 99 ];then echo "变态杀戮" elif [ $x -ge 80 -a $x -le 89 ];then echo "大波kill" elif [ $x -ge 70 -a $x -le 79 ];then echo "one kill" elif [ $x -ge 60 -a $x -le 69 ];then echo "first brood" elif [ $x -ge 0 -a $x -le 59 ];then echo "对面已经超神了" else echo "非异常处理" fi
case..esac语句
#!/bin/sh FRUIT="balabala" case "$FRUIT" in "apple") echo "Apple pie is quite tasty." ;; "banana") echo "I like banana nut bread." ;; "balabala") echo "New Zealand is famous for balabala." ;; esac
格式跟c差很少
shell循环类型 while,for,until,select循环
while 循环直到达到条件循环中止
#!/bin/sh a=0 while [ $a -lt 10 ] do echo $a a=`expr $a + 1` done
for for var in word1 word2 ... wordN
#!/bin/sh #执行in后面的数并打印 for var in 0 1 2 3 4 5 6 7 8 9 do echo $var done
#!/bin/sh #home目录下打印跟.bash后面全部的文件 for FILE in $HOME/.bash* do echo $FILE done #这将产生如下结果: /root/.bash_history /root/.bash_logout /root/.bash_profile /root/.bashrc
util
#!/bin/sh #util英文是直到的意思,解释就是直到a=10的时候循环才结束 a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
select
语法:
select var in word1 word2 ... wordN do Statement(s) to be executed for every word. done
#!/bin/ksh select DRINK in tea cofee water juice appe all none do case $DRINK in tea|cofee|water|all) echo "Go to canteen" ;; juice|appe) echo "Available at home" ;; none) break ;; *) echo "ERROR: Invalid selection" ;; esac done
break&continue
break 结束整个循环
#!/bin/sh a=0 while [ $a -lt 9 ] do echo $a if [ $a -eq 5 ] then break fi a=`expr $a + 1` done
continue 终止本次循环执行下一次循环
shell替换
#!/bin/sh DATE=`date` echo "Date is $DATE" USERS=`who | wc -l` echo "Logged in user are $USERS" UP=`date ; uptime` echo "Uptime is $UP"
结果:
shell 定时清理
若是要清理tomcat下的logs日志,首先定义脚本存放目录
建立脚本代码以下
#!/bin/bash find /usr/local/tomcat/logs/ -mtime 10 -name "*.log" -exec rm -rf {} \; find /usr/local/tomcat/logs/ -mtime 10 -name "*.txt" -exec rm -rf {} \;
以后crontab -e 脚本以下
30 0 * * * 脚本路径 脚本文件
shell数组
定义数组值
array_name[index]=value 数据名[下标]=值
若是您使用的是ksh shell在这里初始化数组的语法:
set -A array_name value1 value2 ... valuen
若是您使用的是bash shell中,这里是初始化数组的语法:
array_name=(value1 ... valuen)
访问数组值
${array_name[index]} 访问指定下标
${array_name[*]} 访问全部
${array_name[@]} 访问全部
版权声明:本文原创发表于 博客园,做者为 RainBol 本文欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然视为侵权。