Bash脚本编程(2)——编程入门

@(Bash)[编程入门]


1. Bash中的变量

1.1 变量类型

  • 字符型
  • 数值型
  • 整型
  • 浮点型

语言类型:

  • 强类型:
    定义变量时必须指定类型、参与运算必须符合类型要求;
    调用未声明变量会产生错误;
  • 弱类型:
    无须指定类型,默认均为字符型;
    参与运算会自动进行隐式类型转换;
    变量无须事先定义可直接调用;

1.2 变量的种类

(1)本地变量
生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;
(2)环境变量
生效范围为当前shell进程及其子进程;
(3)局部变量
生效范围为当前shell进程中某代码片断(通常指函数);
(4)位置变量
$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数;
(5)特殊变量
$?, $0, $*, $@, $#

1.3 本地变量

变量赋值:name='value'
(1) 可以是直接字串:name="username"
(2) 变量引用:name="$username"
(3) 命令引用:name=COMMAND, name=$(COMMAND)

变量引用:
${name}, $name

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

显示已定义的所有变量:
set

销毁变量:
unset name

1.4 环境变量

变量声明、赋值:
export name=VALUE
declare -x name=VALUE

只读变量:
readonly name
declare -r name

变量引用:
$name, ${name}

显示所有环境变量:
export
env
printenv

销毁:
unset name

变量命名法则:
(1) 不能使程序中的保留字:例如if, for
(2) 只能使用数字、字母及下划线,且不能以数字开头
(3) 见名知义

1.5 位置变量

在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ...:对应调用第1、第2等参数
$0: 命令本身

shift [n]
用来偏移未知变量的一个命令

1.6 特殊变量

  • $?
    判断上一个命令或脚本的执行成功与否
  • $*
    传递给脚本的所有参数;
  • $@
    传递给脚本的所有参数;
  • $#
    传递给脚本的参数的个数;

2. Bash的配置文件

2.1 按生效范围划分

全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc

2.2 按功能划分

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

  • 全局:
    /etc/profile
    /etc/profile.d/*.sh
  • 个人:
    ~/.bash_profile
  • 功用:
    (1) 用于定义环境变量
    (2) 运行命令或脚本

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

  • 全局:
    /etc/bashrc
  • 个人:
    ~/.bashrc
  • 功用:
    (1) 定义命令别名
    (2) 定义本地变量

2.3 生效次序

交互式登录(shell登录)

  • 直接通过终端输入账号密码登录;
  • 使用su - UserNamesu -l UserName切换的用户
  • 生效次序
    /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登录(shell登录)

  • su UserName
  • 图形界面下打开的终端
  • 执行脚本
  • 生效次序
    ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

3. Bash中的运算

3.1 基本算数运算

算术符号:

  • +
  • -
  • *
  • /
  • %
  • **

实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)

乘法符号有些场景中需要转义
Bash有内建的随机数生成器:$RANDOM

3.2 增强型赋值

算术符号:

  • +=
  • -=
  • *=
  • /=
  • %=

实现算术运算:
let varOPERvalue
例如:let count+=1

3.3 自增、自减

自增:
let var+=1
let var++

自减:
let var-=1
let var--

4. 条件测试

4.1 测试命令

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

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

4.2 数值测试

  • -gt
    是否大于
  • -ge
    是否大于等于
  • -eq
    是否等于
  • -ne
    是否不等于
  • -lt
    是否小于
  • -le
    是否小于等于

4.3 字符串测试

  • ==
    是否等于
  • >

    是否大于

  • <
    是否小于
  • !=
    是否不等于
  • =~
    左侧字符串是否能够被右侧的PATTERN所匹配
    此表达式一般用于[[ ]]中
  • -z "STRING"
    测试字符串是否为空,空则为真,不空则为假
  • -n "STRING"
    测试字符串是否不空,不空则为真,空则为假

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

4.4 文件测试

4.4.1 存在性测试

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

4.4.2 存在性及类别测试

  • -b FILE
    是否存在且为块设备文件
  • -c FILE
    是否存在且为字符设备文件
  • -d FILE
    是否存在且为目录文件
  • -f FILE
    是否存在且为普通文件
  • -h FILE-L FILE
    存在且为符号链接文件
  • -p FILE
    是否存在且为命名管道文件
  • -S FILE
    是否存在且为套接字文件

4.4.3 文件权限测试

  • -r FILE
    是否存在且可读
  • -w FILE
    是否存在且可写
  • -x FILE
    是否存在且可执行

4.4.4 文件特殊权限测试

  • -g FILE
    是否存在且拥有sgid权限
  • -u FILE
    是否存在且拥有suid权限
  • -k FILE
    是否存在且拥有sticky权限

4.4.5 文件大小测试

  • -s FILE
    是否存且非空

4.4.6 文件是否打开

  • -t fd
    fd表示文件描述符是否已经打开且与某终端相关
  • -N FILE
    文件自动上一次被读取之后是否被修改过
  • -O FILE
    当前有效用户是否为文件属主
  • -G FILE
    当前有效用户是否为文件属组

4.4.7 双目测试

  • FILE1 -ef FILE2
    FILE1与FILE2是否指向同一个设备上的相同inode
  • FILE1 -nt FILE2
    FILE1是否新于FILE2
  • FILE1 -ot FILE2
    FILE1是否旧于FILE2

4.5 组合测试条件

第一种方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND

举例:
1、[ -e FILE ] && [ -r FILE ]

第二种方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION

举例:
1、[ -z "$hostName" -o "$hostName"=="localhost.localdomain" ] && hostname www.magedu.com
2、[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

必须使用测试命令进行


5. 思维导图

编程入门
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容