经验整理-32-Shell---100-@


-------------------Shell-------------
?工作原理?

简单讲,其实shell就是逐条执行命令,在终端执行的命令都是一条一条敲上去,再执行的,shell脚本就是事先写很多命令,然后执行脚本,让shell一次性将这些命令执行完。

shell对于命令的分析过程如下:
1、首先,检查用户输入的命令是否是内部命令,如果不是在检查是否是一个应用程序;
2、shell在搜索路径或者环境变量中寻找这些应用程序;
3、如果键入命令不是一个内部命令并且没有在搜索路径中查找到可执行文件,那么将会显示一条错误信息;
4、如果能够成功找到可执行文件,那么该内部命令或者应用程序将会被分解为系统调用传给Linux内核,然后内核在完成相应的工作;

?的作用或优点?

,向ls,cat,mkdir这些都属于外部命令,而echo,cd,pwd这些都属于内置命令.
外部命令----当前的Shell会开启一个子进程,然后调用exec载入这个命令的可执行文件,比如bin/cat,因此效率上稍微低了点。
内置命令----随Shell运行载入内存,因此,当我们在命令行上输入这些命令就可以像调用函数一样直接使用,效率非常高。

?我搭建过,如何搭建?

1、定时清理30天前的日志文件

①清理某个路径下的日志脚本delOldLogs.sh:
[root@prx01 cleanlog]# vim /usr/local/cleanlog/delOldLogs.sh
#!/bin/sh
#删除输入路径下的修改时间在45天以前的日志文件
find $1 -mtime +45 -name "*log*" -exec rm -f {} \;
这段代码不难理解,就是清理参数1所在的路径下的修改时间在45天以前的日志文件

②指定清理哪些路径的日志的脚本del_all_OldLogs.sh:
[root@prx01 cleanlog]# vim /usr/local/cleanlog/del_all_OldLogs.sh
#!/bin/bash 
/usr/local/cleanlog/delOldLogs.sh "/home/usr/ewp/logs"
/usr/local/cleanlog/delOldLogs.sh "/home/usr/h5/logs"
/usr/local/cleanlog/delOldLogs.sh "/home/usr/Payment/logs"
③给脚本添加执行权限:
[root@prx01 cleanlog]# chmod a+x /usr/local/cleanlog/del*.sh
④添加定时任务:
[root@prx01 cron]# vim /var/spool/cron/root
添加以下内容:
10 0 * * 6 /usr/local/cleanlog/del_all_OldLogs.sh
注:
为了防止出现权限不够的情况,因此这里设置了一个root用户的定时任务
这句代码的意思是:在每周6的0:10执行/usr/local/cleanlog/del_all_OldLogs.sh 这个脚本
⑤查看定时任务:
[root@app05 logs]# crontab -l

2、自动打包、编译、发布等功能

#!/bin/sh
# 编译打包启动服务的脚本
 DIR=$(cd `dirname $0`; pwd)
 SERVICE_NAME=$(basename $DIR)
 # JAR包全路径,请修改为实际路径
PATH_TO_JAR=${SERVICE_NAME}.jar
 ./service-java.sh stop
 rm -rf ${SERVICE_NAME}.jar
 API_JAR=/home/api/${SERVICE_NAME}
 rm -rf ${API_JAR}/${SERVICE_NAME}-1.0-SNAPSHOT.jar
 PID_PATH_NAME=`dirname ${PATH_TO_JAR}`/${SERVICE_NAME}.pid
 SOURCE_CODE_PARENT_FOLDER=/home/source/smartvls/
 TARGET_JAR_FOLDER=/home/source/smartvls/${SERVICE_NAME}/target/${SERVICE_NAME}-1.0-SNAPSHOT.jar
 cd ${SOURCE_CODE_PARENT_FOLDER}
 git pull -r
 mvn clean install -pl ${SERVICE_NAME} -am
 mv ${TARGET_JAR_FOLDER} ${API_JAR}/${SERVICE_NAME}.jar
 cd  ${API_JAR}
 ./service-java.sh start
 #研发服务器完成后,直接打包发到测试服务器相同目录下
ssh 172.X.X.181  "cd $API_JAR && ./service-java.sh stop && rm -rf ./${SERVICE_NAME}.jar && scp -r [email protected]:${API_JAR}/${SERVICE_NAME}.jar ./${SERVICE_NAME}.jar ; ./service-java.sh start ; exit"

?搭建和使用过程中遇到哪些问题?

1、变量名和等号之间不能有空格:
your_name="runoob.com"
2、给所有变量加上花括号,这是个好的编程习惯:
echo "I am good at ${your_name}Script"//无问题,想使用变量your_name
echo “I am good at $ your_nameScript”//有问题,把your_nameScript当成变量,无值

?三种变量?

局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

?Shell 字符串?

单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符

?多行注释?

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

:<<!
注释内容...
注释内容...
注释内容...
!

?常用语法命令?

${} //使用变量的时候
unset variable_name#删除变量
echo ${#string} #获取字符串长度
echo ${string:1:4} # 从字符串第 2 个字符开始截取 4 个字符
array_name=(value0 value1 value2 value3)#数组元素用"空格"符号分割开
valuen=${array_name[n]}#读取数组元素值
echo ${array_name[@]}# @ 符号可以获取数组中的所有元素
length=${#array_name[@]}#获取数组长度
#
#
#

发布了39 篇原创文章 · 获赞 0 · 访问量 773

猜你喜欢

转载自blog.csdn.net/qq_15458763/article/details/104267631