您的位置:首页 > 运维架构 > Shell

Linux中shell编程笔记

2018-01-04 16:33 253 查看
变量赋值的“=”两边不能接空格符

双引号内可以保持特殊符号的原本特性,单引号内全部照原样输出

可用转义字符“\”将特殊符号变成一般符号

通过"`命令`"和$(命令)可以得到执行命令后的结果

使用export将变量变成环境变量

若该变量为了增加变量内容时,则可用“$变量名称”或${变量}累计内容

PATH="$PATH":/home/bin

使用env查看环境变量

set查看所有变量

locale 显示语系

1:$# 表示执行脚本传入参数的个数

2:$*  表示执行脚本传入参数列表

3:$$ 表示进程id

4:$@表示执行脚本传入所有参数

5:$0 表示执行脚本名称

6:$1 表示第一个参数

7:$2 表示第二个参数

8:$? 表示脚本执行状态0正常,其他表示有错误

通配符:

* 代表0到多个任意字符

?代表一个任意字符

[]同样代表一定有一个在中括号内的字符[a,v]

[-]代表编码顺序内的所有字符[0-9]

 

read [-pt]

-p:后面接提示符

-t:后面接等待秒数
-s:隐藏输入的数据

-n:限制输入的数量

declare [-aixr]

-a 声明类型为数组

-i 声明类型为整型

-x 声明为环境变量

-r 声明为只读变量

使用命令别名 alias lm='ls -l|more'

取消命令别名 unalias lm

历史指令 history  默认情况下,会将历史记录写入到~/.bash_history中

-c 清除所有历史指令记录

n  列出最近n条指令

-r 将histfiles的内容读到目前这个shell的history中

-w 将目前这个shell中的history记忆内容写入到histfiles中

!number

执行第几条命令的意思

!command

执行最近的命令串开头为command的那个命令

[]用中括号来表示判断语句(在中括号中的每个组件都用空格隔开,变量或者常量用双引号括起来)

测试标志:

-e 判断文件是否存在

-f 判断文件是否存在且为文件(file)

-d 判断文件是否存在且为目录(dir)

-r 检测文件名是否存在并且具有可读权限

-w 检测文件名是否存在并且具有可写权限

-x 检测文件名是否存在并且具有可执行权限

-nt 判断file1是否比file2新

-ot 判断file1是否比file2旧

-eq 两数值相等

-ne 两数值不等

-gt n1大于n2

-lt n1小于n2

-ge n1大于等于n2

-le n1小于等于n2

-z 字符串是否为0 若string为空字符串,则返回true

-n 字符串是否非空,若string为空字符串,则返回false

== 字符串是否相等

!= 字符串是否不等

-a 两个条件是否同时成立,and

-o 任意一个条件成立,or

! 反向状态,非

用"."或者"bash(sh)"执行脚本,该脚本script是在子进程的bash内执行的
用"source"执行脚本,该脚本是在父进程中执行


缺省值(:-)

如果变量后面跟着冒号和减号,则变量后面跟着是这个变量的缺省值。

$ COMPANY=

$ printf “%s/n” “${COMPANY:-Unknown Company}”

Unknown Company

变量的实际值可以保持不变。

冒号也可以省略掉不用:

$ COMPANY=

$ printf “%s/n” “${COMPANY-Nightlight Inc.}”

$


指定缺省值(:=)

如果变量后面跟着冒号和等号,则给空变量指定一个缺省值。

$ printf “%s/n” “${COMPANY:=Nightlight Inc.}”

Nightlight Inc.

$ printf “%s/n” “$COMPANY”

Nightlight Inc.

变量的实际值已经改变了。

去除冒号,则不会指定缺省值。


变量是否存在检查(:?)

如果变量后面跟着冒号和问号,则根据变量是否存在,显示不同的信息。信息不是必选的。

printf “Company is %s/n” /

“${COMPANY:?Error: Company has notbeen defined—aborting}”

如果没有冒号则不会进行检查。


覆盖缺省值(:+)

如果变量后面跟着冒号和加号,则加好后面的字符串替换默认字符串。

$ COMPANY=”Nightlight Inc.”

$ printf “%s/n” “${COMPANY:+Company has been overridden}”

Company has been overridden

如果没有冒号,变量也被字符串所替换,变量本身的值不改变。


替换部分字符串(:n)

如果变量后面跟着一个冒号和数字,则返回该数字开始的一个子字符串,如果后面还跟着一个冒号和数字。则第一个数字表示开始的字符,后面数字表示字符的长度。

$ printf “%s/n” “${COMPANY:5}”

light Inc.

$ printf “%s/n” “${COMPANY:5:5}”

light


根据模板删除字串(%,#,%%,##)

如果变量后面跟着井号,则返回匹配模板被删除后的字串。一个井号为最小可能性的匹配,两个井号为自大可能性的匹配。表达式返回模板右边的字符。

$ printf “%s/n” “${COMPANY#Ni*}”

ghtlight Inc.

$ printf “%s/n” “${COMPANY##Ni*}”

$ printf “%s/n” “${COMPANY##*t}”

Inc.

$ printf “%s/n” “${COMPANY#*t}”

light Inc.

使用百分号,表达式返回模板左边的字符

$ printf “%s/n” “${COMPANY%t*}”

Nightligh

$ printf “%s/n” “${COMPANY%%t*}”

Nigh

(在我的Linux系统中上述命令不起取用)


使用模板进行子字符串的替换(//)

如果变量后只有一个斜杠,则两个斜杠中间的字符串是要被替换的字符串,而第二个斜杠后面的字符串是要替换的字符串。如果变量后面跟着两个斜杠,则所有出现在两个斜杠中间的字符都要被替换为最后一个斜杠后面的字符。

$ printf “%s/n” “${COMPANY/Inc./Incorporated}”

Nightlight Incorporated

$ printf “You are the I in %s” “${COMPANY//i/I}”

You are the I in NIghtlIght Inc.

如果模板一#号开始,则匹配以模板开始的字符,如果模板以%号结尾,则匹配以模板结尾的字符。

$ COMPANY=”NightLight Night Lighting Inc.”

$ printf “%s/n” “$COMPANY”

NightLight Night Lighting Inc.

$ printf “%s” “${COMPANY//Night/NIGHT}”

NIGHTLight NIGHT Lighting Inc.

$ printf “%s” “${COMPANY//#Night/NIGHT}”

NIGHTLight Night Lighting Inc.

(我的Linux中这个不起作用)

如果没有指定新的值,则匹配的字符会被删除。

$ COMPANY=”Nightlight Inc.”

$ printf “%s/n” “${COMPANY/light}”

Night Inc.

也可以使用范围符号。例如:删除所有字符串中的标点符号,使用范围[:punct:]。

$ printf “%s” “${COMPANY//[[:punct:]]}”

Nightlight Inc

使用星号或@符号替换变量会替换外壳脚本中所有的参数,同样,在数组中使用星号或@符号也会替换数组中的所有元素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 笔记