Shell脚本
来源:互联网 发布:c语言typedef 编辑:程序博客网 时间:2024/06/15 16:30
Shell脚本
- Shell脚本
- 简介
- 变量
- 1变量命名
- 2环境变量
- 3局部变量
- 4位置变量
- 5特殊变量
- 单引号双引号反引号esc下面的键
- for
- 条件测试
- whileuntil循环
- if判断
- case判断
- 自定义函数一般不在函数里面调用
- date命令
- 规范
- 注释代码
- 使用 command 进行命令替换
- 出错退出前描述问题
- 参考
简介
Java编程使用Java语言编程实现用户的业务逻辑。Shell编程把用户需要在命令行下面(Linux命令行)执行的命令放到一个文件夹当中,然后批量执行,用户使用起来就会很方便。将大量的命令放到一个文件当中,这个文件称之为脚本(将一批命令集合起来成脚本),这个过程称为shell编程。
变量
变量不需要声明(在java类中定义的变量需要声明:int、string型、布尔型),初始化不需要指定类型 (bash里面都是“弱”类型,默认情况下一个变量保存一个串)
(1)变量命名
1:不能使用程序中的关键字(保留字)
2:只能使用字母、下划线和数字,且不能以数字开头
3:建议命令要通俗易懂
显示变量值使用echo命令(往控制台输出命令) ,加上
echo $JAVA_HOMEecho ${JAVA_HOME}
可以简单理解
echo
(2)环境变量
自定义的环境变量(在当前命令行中配置)对当前shell进程及其子shell进程有效,对其它的shell进程无效
定义:export VAR_NAME=VALUE
对所有shell进程都有效需要配置到配置文件中
vi /etc/profile
source /etc/profile
定义export crxy=/usr/local(环境变量路径)
(3)局部变量
函数调用结束,变量就会消失对shell脚本中某代码片段有效定义:local VAR_NAME=VALUEsource /etc/profile修改完环境变量以后,要重新加载这个文件,就可以获取到刚刚定义的变量
(4)位置变量
$1,$2,.....${10}....test.sh 3 89$0:脚本自身$1:脚本的第一个参数(获得数字3)$2:脚本的第二个参数(获得数字89)test.sh(脚本文件) start(位置变量,用于传递参数,在脚本里面可以获取得到的,启动脚本文件)
(5)特殊变量
$?:接收上一条命令的返回状态码$#:获取后面参数个数(作用:执行脚本时,后面不传递参数少或不够,会反馈提醒)$*:或者$@:所有的参数$$:获取当前shell的进程号(PID)(可以实现脚本自杀)
单引号、双引号、反引号(esc下面的键)
''单引号不解析变量(将变量直接输出)""双引号会解析变量``反引号是执行并引用一个命令的执行结果,类似于$(...)(例如把crxy=haha,将haha当做是一个命令,如果是路径,也将会当成是文件目录)
for
For格式1for ((i=0;i<10;i++))do(表示开始) ...(业务逻辑)done(表示结束)
格式2for i in 0 1 2 4 5 8 9do...done拷贝有执行权限的文件后的文件已有执行权限,不用在加执行权限
条件测试
bash条件测试 命令执行成功与否即为条件测试 test EXPR(表达式expression) [ EXPR ]:注意中括号和表达式之间的空格 整型测试: -gt:(greater than)大于:例如[ $num1 -gt $num2 ]或者test $num1 -gt $num2 -lt:(less than)小于 -ge:(greater than or equal to)大于等于 -le:(less than or equal to)小于等于 -eq:(equal to)等于 -ne:(not equal to)不等于 字符串测试: > 大于[ "$str1" \> "$str2" ] 注意测试符号左右的空格(字典顺序,>需加\转义符号,$是取变量的值) < 小于 = !=
while/until循环
适用于循环次数未知,或不便用for直接生成较大的列表时
格式:
while 测试条件;do
循环体
done
如果测试条件为“真”,则进入循环,测试条件为假,则退出循环。
until循环的格式和while循环的格式一致,但是和while循环的意思相反,如果测试条件为假,则进入循环,退出条件为,测试条件为真
#!/bin/bashwhile [ 10 -gt 2 ]doecho 'true'done
if判断
单分支 if 测试条件;then 选择分支 fi双分支 if 测试条件 then 选择分支1 else 选择分支2 fi多分支if 条件1; then 分支1 elif 条件2; then 分支2 elif 条件3; then 分支3 ... else 分支n fi(结束)单分支
#!/bin/bashif [ $1 -gt 5 ]thenecho $1fi#------if [ $1 -gt 5 ]thenecho $1elseecho "no"fi
#!/bin/bash#多分支if [ $1 -eq 1 ] thenecho "one"elif [ $1 -eq 2 ]then echo "two"elif [ $1 -eq 3 ]thenecho "three"elseecho "none"fi
case判断
有多个测试条件时,case语句会使得语法结构更清晰格式: case 变量引用 in PATTERN1) 分支1 ;;(符合这个case就会退出循环如同Java里面还有个break) PATTERN2) 分支2 ;; ... *) 分支n ;; esac(case倒着写表退出)PATTERN :类同于文件名通配机制,但支持使用|表示或者a|b:a或者b*:匹配任意长度的任意字符?:匹配任意单个字符[a-z]:指定范围内的任意单个字符
#!/bin/bashcase $1 in1)echo "one";;2)echo "two";;3)echo "three";;*)echo "none";;esac
sh case.sh 2sh case.sh 4
自定义函数(一般不在函数里面调用)
function 函数名(){ ....}引用自定义函数文件时,使用source func.sh有利于代码的重用性;函数传递参数;函数的返回值,只能是数字.
fun.sh
#!/bin/bash#-------function test(){ echo "this is a function"}
function.sh
#!/bin/bash##调用函数脚本所在路径source /usr/local/shell/fun.sh##传递的参数,用于调用函数test
date命令
显示当前时间格式化输出 +%Y-%m-%d格式%s表示自1970-01-01 00:00:00以来的秒数指定时间输出 date --date='2009-01-01 11:11:11'指定时间输出 date --date='3 days ago'
date "+%Y-%m-%d %H:%M:%S"
获取时间戳(秒级别的)计算当前时间与2017-11-29之间时间间隔多少分钟、秒、毫秒,将时间转换成时间戳的差值再除以相应的值而获取相差的时间
date --date="2017-11-29"date +%sdate --date="2017-11-29" +%s
规范
注释代码
## Check if new_pass is empty or not if [ ! -z $NEW_PASS ] then ## If not empty set the password and pass expiry echo $NEW_PASS | passwd --stdin $NEW_USER chage -M $NEW_CHAGE $NEW_USER chage -d 0 $NEW_USER fi
使用 $(command) 进行命令替换
DATE=`date +%F`#推荐DATE=$(date +%F)
出错退出前描述问题
trap "echo '<====' exist this shell '===>'" EXIT
参考
- Linux+命令行和shell脚本编程宝典
- 编写更好 Bash 脚本的 8 个建议规范
- shell脚本
- shell脚本
- shell脚本
- shell脚本
- shell脚本
- shell脚本
- shell脚本
- shell 脚本
- SHELL 脚本
- shell脚本
- shell脚本
- shell 脚本
- shell脚本
- shell脚本
- shell脚本
- shell脚本
- shell脚本
- shell脚本
- SQL----关系型数据库之表与索引
- spring boot 获取项目全部URL
- 【Scikit-Learn 中文文档】新异类和异常值检测
- 二叉树的算法
- Javascript内存泄漏
- Shell脚本
- Linux上的free命令详解
- CSS 伪元素
- Spring 的核心 IOC 和AOP详解
- 属性动画的移动
- 【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题)
- 感知机学习模型
- 如何使主线程在子线程之后执行
- java中js失效解决方法之一.........................................................