首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

bash的基础特性(3)之bash的配置文件

bash的基础特性(3)

1、提供了编程环境

程序:指令+数据

程序编程风格:

过程式:以指令为中心,数据服务于指令

对象式:以数据为中心,指令服务于数据

shell程序:提供了编程能力,解释执行

程序的执行方式:

计算机:运行二进制指令;

编程语言:

低级:汇编

高级:

编译:高级语言-->编译器-->目标代码

C、C++, java

解释:高级语言-->解释器-->机器代码

shell, perl, python

过程式编程:

顺序执行

循环执行

选择执行

shell编程:过程式、解释执行

编程语言的基本结构:

数据存储:变量、数组

表达式

语句

shell脚本:文本文件

shebang:

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

magic number: 魔数

运行脚本:

1、给予执行权限,通过具体的文件路径指定文件执行;

2、直接运行解释器,将脚本作为解释器程序的参数运行;

变量:

命名的内存空间;

数据存储方式:ASCII

字符:110:24

数值:110 --> 8

整型

浮点型

变量:变量类型

作用:

1、数据存储格式;

2、参与的运算;

3、表示的数据范围;

类型:

字符

数值:

整型

浮点型

编程程序语言:

强类型:

弱类型:bash

把所有要存储的数据统统当作字符进行

不支持浮点数;

逻辑运算:

true, false

1, 0

与:

1 && 1 = 1

1 && 0 = 0

0 && 1 = 0

0 && 0 = 0

或:

1 || 1 = 1

1 || 0 = 1

0 || 1 = 1

0 || 0 = 0

非:

! 1 = 0

! 0 = 1

短路运算:

与:

第一个为0,结果必定为0;

第一个为1,第二个必须要参与运算;

或:

第一个为1,结果必定为1;

第一个为0,第二个必须要参与运算;

bash的基础特性(4)

变量类型:

数据存储格式、存储空间大小、参与运算种类;

字符型

数值型:

整型

浮点型

强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误;

弱类型:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用;

bash

bash中的变量的种类:

根据变量的生效范围等标准:

本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;

环境变量:生效范围为当前shell进程及其子进程;

局部变量:生效范围为当前shell进程中某代码片断(通常指函数);

位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数;

特殊变量:$?, $0, $*, $@, $#

本地变量:

变量赋值:name='value'

可以使用引用:

value:

(1) 可以是直接字串; name="username"

(2) 变量引用:name="$username"

(3) 命令引用:name=`COMMAND`, name=$(COMMAND)

变量引用:$, $name

"":弱引用,其中的变量引用会被替换为变量值;

'':强引用,其中的变量引用不会被替换为变量值,而保持原字符串;

显示已定义的所有变量

set

销毁变量:

unset name

环境变量:

变量声明、赋值:

export name=VALUE

declare -x name=VALUE

变量引用:$name, $

显示所有环境变量:

export

env

printenv

销毁:

unset name

bash有许多内建的环境变量:PATH, SHELL, UID, HISTSIZE, HOME, PWD, OLD, HISTFILE, PS1

变量命名法则:

1、不能使程序中的保留字:例如if, for;

2、只能使用数字、字母及下划线,且不能以数字开头;

3、见名知义,

只读变量:

readonly name

declare -r name

位置变量:

在脚本代码中调用通过命令行传递给脚本的参数;

$1, $2, ...:对应调用第1、第2等参数;

shift [n]

$0: 命令本身;

$*: 传递给脚本的所有参数;

$@: 传递给脚本的所有参数;

$#: 传递给脚本的参数的个数;

示例:判断给出的文件的行数

#!/bin/bash

linecount="$(wc -l $1| cut -d' ' -f1)"

echo "$1 has $linecount lines."

bash的配置文件:

按生效范围划分,存在两类:

全局配置:

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

个人配置:

~/.bash_profile

~/.bashrc

按功能划分,存在两类:

profile类:为交互式登录的shell提供配置

全局:/etc/profile, /etc/profile.d/*.sh

个人:~/.bash_profile

功用:

(1) 用于定义环境变量;

(2) 运行命令或脚本;

bashrc类:为非交互式登录的shell提供配置

全局:/etc/bashrc

个人:~/.bashrc

功用:

(1) 定义命令别名;

(2) 定义本地变量;

shell登录:

交互式登录:

直接通过终端输入账号密码登录;

使用“su - UserName”或“su -l UserName”切换的用户

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登录:

su UserName

图形界面下打开的终端

执行脚本

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

编辑配置文件定义的新配置的生效方式:

(1) 重新启动shell进程;

(2) 使用source或.命令进程;

问题:

1、定义对所有用户都生效的别名?

2、让用户的PATH环境变量的值多出一个路径,例如多如/usr/local/apache2/bin

管理员?

所有?

bash中的算术运算

+, -, *, /, %, **

实现算术运算:

(1) let var=算术表达式

(2) var=$[算术表达式]

(3) var=$((算术表达式))

(4) var=$(expr arg1 arg2 arg3 ...)

乘法符号有些场景中需要转义;

bash有内建的随机数生成器:$RANDOM

增强型赋值:

+=, -=, *=, /=, %=

let varOPERvalue

例如:let count+=1

自增,自减:

let var+=1

let var++

let var-=1

let var--

练习1:写一个脚本

计算/etc/passwd文件中的第10个用户和第20用户的ID之和;

#!/bin/bash

userid1=$(head -n 10 /etc/passwd | tail -n 1 | cut -d: -f3)

userid2=$(head -n 20 /etc/passwd | tail -n 1 | cut -d: -f3)

useridsum=$[$userid1+$userid2]

echo "uid sum: $useridsum"

练习2:写一个脚本

传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和;

#!/bin/bash

spaceline1=$(grep "^[[:space:]]*$" $1 | wc -l)

spaceline2=$(grep "^[[:space:]]*$" $2 | wc -l)

echo "The sum of space line: $[$spaceline1+$spaceline2]"

练习3:统计/etc, /var, /usr目录共有多少个一级子目录和文件;

条件测试:

判断某需求是否满足,需要由测试机制来实现;

Note: 专用的测试表达式需要由测试命令辅助完成测试过程;

测试命令:

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]]

Note: EXPRESSION前后必须有空白字符;

bash的测试类型:

数值测试:

-gt: 是否大于;

-ge: 是否大于等于;

-eq: 是否等于;

-ne: 是否不等于;

-lt: 是否小于;

-le: 是否小于等于;

字符串测试:

==:是否等于;

>: 是否大于;

!=: 是否不等于;

=~: 左侧字符串是否能够被右侧的PATTERN所匹配;

Note: 此表达式一般用于[[ ]]中;

-z "STRING":测试字符串是否为空,空则为真,不空则为假;

-n "STRING":测试字符串是否不空,不空则为真,空则为假;

Note:用于字符串比较时的用到的操作数都应该使用引号;

文件测试

bash自定义退出状态码

exit [n]:自定义退出状态码;

注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字;

注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码;

练习:写一个脚本

接受一个文件路径作为参数;

如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;

如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数;

回顾:egrep, 扩展的正则表达式, 变量, 配置文件, 算术运算, 条件测试, 退出状态码

ERE:

字符匹配:., [], [^]

次数匹配:*, ?, +,

位置锚定:^, $, \, \b

分组:(), \1, \2, ..

或者: a|b

变量:

本地变量

环境变量

局部变量

位置变量

特殊变量

不能使用保留字;

命令:unset, export, declare -x, set, env, printenv, readonly

配置文件:

profile, bashrc

算术运算:

let, $[], $(()), expr

+=, -=, *=, /=

++, --

条件测试:

test, [], [[]]

三种:

数值:-lt, -le, -gt, -ge, -ne, -eq

字符串:==, !=, >,

文件

自定义退出码:

exit [n]

[ $# -lt 1 ] && echo "At least one argument." && exit 1

bash条件测试:

测试方式:

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]]

测试表达式的类别:

数值比较

字符串测试

文件测试:

存在性测试

-a FILE

-e FILE: 文件存在性测试,存在为真,否则为假;

存在性及类别测试

-b FILE:是否存在且为块设备文件;

-c FILE:是否存在且为字符设备文件;

-d FILE:是否存在且为目录文件;

-f FILE:是否存在且为普通文件;

-h FILE 或 -L FILE:存在且为符号链接文件;

-p FILE:是否存在且为命名管道文件;

-S FILE:是否存在且为套接字文件;

文件权限测试:

-r FILE:是否存在且可读

-w FILE: 是否存在且可写

-x FILE: 是否存在且可执行

文件特殊权限测试:

-g FILE:是否存在且拥有sgid权限;

-u FILE:是否存在且拥有suid权限;

-k FILE:是否存在且拥有sticky权限;

文件大小测试:

-s FILE: 是否存且非空;

文件是否打开:

-t fd: fd表示文件描述符是否已经打开且与某终端相关

-N FILE:文件自动上一次被读取之后是否被修改过;

-O FILE:当前有效用户是否为文件属主;

-G FILE:当前有效用户是否为文件属组;

双目测试:

FILE1 -ef FILE2: FILE1与FILE2是否指向同一个设备上的相同inode

FILE1 -nt FILE2: FILE1是否新于FILE2;

FILE1 -ot FILE2: FILE1是否旧于FILE2;

组合测试条件:

逻辑运算:

第一种方式:

COMMAND1 && COMMAND2

COMMAND1 || COMMAND2

! COMMAND

[ -e FILE ] && [ -r FILE ]

第二种方式:

EXPRESSION1 -a EXPRESSION2 -a: 逻辑与

EXPRESSION1 -o EXPRESSION2 -o: 逻辑或

! EXPRESSION

必须使用测试命令进行;

# [ -z "$hostName" -o "$hostName"=="localhost.localdomain" ] && hostname www.magedu.com

# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

关注“农夫运维” 一起成长!

“我们进步,因为我们分享!”

“分享是一种精神,感恩是一种品德。”

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180506G02LRP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券