shell语法结构

for循环

通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环

格式1

for((i=0;i<10;i++))

do

...

done

格式2

foriin0124589

do

...

done

格式三

foriin{0..9}

do

...

done

条件测试

bash条件测试

命令执行成功与否即为条件测试

testEXPR

[EXPR]:注意中括号和表达式之间的空格

整型测试:

-gt:大于:例如[$num1-gt$num2]或者test$num1-gt$num2

-lt:小于

-ge:大于等于

-le:小于等于

-eq:等于

-nq:不等于

字符串测试:

>大于["$str1"\>"$str2"]注意测试符号左右的空格

<小于

=

!=

算术运算

letvarNamer=算术表达式

varName=$[算术表达式]

varName=$((算术表达式))

varName=`expr$num1+$num2`

使用这种格式要注意两个数字和+号中间要有空格。

while/until循环

适用于循环次数未知,或不便用for直接生成较大的列表时

格式:

while测试条件;do

循环体

done

如果测试条件为“真”,则进入循环,测试条件为假,则退出循环。

until循环的格式和while循环的格式一致,但是和while循环的意思相反,如果测试条件为假,则进入循环,退出条件为,测试条件为真

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

case判断

有多个测试条件时,case语句会使得语法结构更清晰

格式:case变量引用in

PATTERN1)

分支1

;;

PATTERN2)

分支2

;;

...

*)

分支n

;;

esac

PATTERN:类同于文件名通配机制,但支持使用|表示或者

a|b:a或者b

*:匹配任意长度的任意字符

?:匹配任意单个字符

[a-z]:指定范围内的任意单个字符

循环控制命令-break

break命令是在处理过程中跳出循环的一种简单方法,可以使用break命令退出任何类型的循环,包括while循环和until循环

1:跳出单循环

2:跳出内循环

使用多循环时break命令自动终止你所在的最里面的循环,注意,当内循环被break命令终止,外循环会继续执行。

3:跳出外循环

可能有时处于内循环但需要停止外循环,break命令后面就需要指定一个参数了

breakn

n表明要跳出的循环级别,默认情况下,n是1,代表跳出当前循环,如果将n设置为2,break命令将停止外循环的下一级循环。

循环控制命令-continue

continue命令是一种提前停止循环内命令,而不完全终止循环的方法,这就需要在循环内设置shell不执行命令的条件

自定义函数

function函数名(){

....

}

引用自定义函数文件时,使用sourcefunc.sh

有利于代码的重用性

函数传递参数

函数的返回值,只能是数字

帮助命令

help/man

linux中的命令可以分为两种

内建命令:commandisashellbuiltin

外部命令:显示具体的路径

如何区分命令属于哪一种

typecommand

内建命令使用helpcommand

外部命令使用mancommand

date

显示当前时间

格式化输出+%Y-%m-%d

格式%s表示自1970-01-0100:00:00以来的秒数

指定时间输出--date='2009-01-0111:11:11'

指定时间输出--date='3daysago'

read

read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。

格式

readVAR_NAME

read-p"Enteryourname:"VAR_NAME

read如果后面不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中

read-t5-p"enteryourname:"VAR_NAME

read-s-p"Enteryourpassword:"pass

declare

-r只读

-i整数:某些算术计算允许在被声明为整数的变量中完成,而不需要特别使用expr或let来完成。

-a数组

字符串操作

获取长度:${#VAR_NAME}

字符串截取

${variable:offset:length}或者${string:offset}

取尾部的指定个数的字符

${variable:-length}:注意冒号后面有空格

取子串:基于模式

${variable#*word}

在variable中存储字串上,自左而右,查找第一次出现word,删除字符开始至此word处的所有内容

${variable##*word}

在variable中存储字串上,自左而右,查找最后一次出现word,删除字符开始至此word处的所有内容

${variable%word*}

在variable中存储字串上,自右而左,查找第一次出现word,删除此word处至字串尾部的所有内容

${variable%%word*}

在variable中存储字串上,自右而左,查找最后一次出现word,删除此word处至字串尾部的所有内容

查找替换:

${variable/pattern/substr}替换第一次出现

${variable//pattern/substr}替换所有的出现

${variable/#pattern/substr}替换行首的pattern,如果行首没有此字符串,则不替换

${variable/%pattern/substr}替换行尾的pattern,如果行尾没有此字符串,则不替换

查找删除

${variable/pattern}删除第一次匹配的字串

${variable//pattern}删除所有匹配的字串

${variable/#pattern}删除行首匹配的字串

${variable/%pattern}删除行尾匹配的字串

注意:pattern可以是一个正则表达式

大小写转换

小-->大:${variable^^}

大-->小:${variable,,}

变量赋值操作

${parameter:-word}

如果变量parameter的值为空或者不存在,返回结果为word,此时变量parameter的值依然为空

${parameter:=word}

如果变量parameter的值为空或者不存在,返回结果为word,此时将word赋值给变量parameter

${parameter:?word}

如果变量parameter的值为空或者不存在,则把word当作错误信息返回。

${parameter:+word}

如果变量parameter的值存在,返回结果为word。如果变量不存在,则返回为空。

数组

定义:declare-a:表示定义普通数组

特点

支持稀疏格式

仅支持一维数组

数组赋值方式

一次对一个元素赋值a[0]=$RANDOM

一次对多个元素赋值a=(abcd)

按索引进行赋值a=([0]=a[3]=b[1]=c)

命令替换logs=($(ls/var/log/*.log))

使用read命令read-aARRAY_NAME

查看元素

${ARRAY[index]}:查看数组指定角标的元素

${ARRAY}:查看数组的第一个元素

${ARRAY

}或者${ARRAY[@]}:查看数组的所有元素获取数组的长度

${#ARRAY

}${#ARRAY[@]}

注意:${#ARRAY[0]}表示获取数组中的第一个元素的长度,等于${#ARRAY}

从数组中获取某一片段之内的元素

格式:${ARRAY[@]:offset:length}

offset:偏移的元素个数

length:取出的元素的个数

${ARRAY[@]:offset:length}:取出偏移量后的指定个数的元素

${ARRAY[@]:offset}:取出数组中偏移量后的所有元素

数组复制:(建议使用${ARRAY[@]})

$@:每个参数都是一个独立的串

$*:所有参数是一个串

数组删除元素:

unsetARRAY[index]

后台模式运行脚本

在脚本后面加一个&

test.sh&

这样的话虽然可以在后台运行,但是当前会话窗口关闭之后这个脚本也会停止运行

使用nohuptest.sh&

nohup命令将进程和终端分开,所以关闭当前会话窗口不会影响这个进程的执行。

nohup会在当前执行的目录生成一个nohup.out日志文件

标准输入、输出、错误、重定向

标准输入、输出、错误可以使用文件描述符0、1、2引用

cat>catfile<~/.bashrc

ls>file或者ls1>file(ls>>file)

lk2>file(lk是一个错误命令)

ls>file2>&1

ls>/dev/null(把输出信息重定向到无底洞)

使用重定向可以把信息转换到其他位置

crontab定时器

linux下的定时任务

编辑使用crontab-e

一共6列,分别是:分时日月周命令

查看使用crontab-l

删除任务crontab-r

查看crontab执行日志

tail-f/var/log/cron

tail-f/var/spool/mail/root(查看crontab最近的执行情况)

查看cron服务状态

servicecrondstatus

启动cron服务

servicecrondstart

ps和jps

ps:用来显示进程的相关信息

ps-ef|grepjava

jps:类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是显示当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command。

问题:某个java进程已经启动,用jps却显示不了该进程进程号,使用ps-ef|grepjava却可以看到

java程序启动后,默认(请注意是默认)会在/tmp/hsperfdata_userName目录下以该进程的id为文件名新建文件,并在该文件中存储jvm运行的相关信息,其中的userName为当前的用户名,/tmp/hsperfdata_userName目录会存放该用户所有已经启动的java进程信息。

而jps、jconsole、jvisualvm等工具的数据来源就是这个文件(/tmp/hsperfdata_userName/pid)。所以当该文件不存在或是无法读取时就会出现jps无法查看该进程号。

原因:1,磁盘读写、目录权限问题。2,临时文件丢失,被删除或是定期清理。3,java进程信息文件存储地址被设置,不在/tmp目录下

相关推荐