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},$name,尽量使用${name}
‘‘:弱引用,其中的变量引用会被替换为变量值
“”:强引用:其中的白能量引用不会被替换为变量值,而保持原字符串。
显示已定义的所有变量:
set
销毁变量:
unsetname
环境变量:
变量申明、赋值:
export name =value
declare -x name=value
变量引用:$name,${name}
显示所有环境变量:
export
env
printenv
销毁:
unset name
bash有许多内置的环境变量:
变量命名法则:
1. 不能使用程序中的保留字,例如if,for
2. 只能使用数字、字母、下划线,且不能以数字开头。
3. 见名知意
total_weight,尽量不要使用全大写
只读变量:
readonlyname
declare -r name
位置变量:
在脚本代码中条用命令行传递给脚本的参数:
$1,$2,…对应调用第1,2等参数
$0:命令本身
$*:传递给脚本的所有参数
$@:传递给脚本的所有参数
$#:传递给脚本的参数的个数
示例:判断给出的文件的行数:
#!/bin/bash
linecount=”$(wc -l | cut -d ‘ ’–f1)”
echo“$1 has $linecount lines”
bash的配置文件:
按生效的范围划分,存在两类:
全局配置:
/etc/profile
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
按功能划分:存在两类:
profile类:为交互式登录的shell提供配置
功能:
(1).用于定义环境变量
(2).运行命令或脚本
bashrc类:为非交互式登录的shell提供配置
shell登录:
交互式登录:
直接通过终端输入账号密码登录
使用su – username 或者su -l username 切换的用户
/etc/profile.d/*.sh -->~/bash_profile-->/etc/bashrc
最后的赋值会覆盖之前的赋值
非交互式登录:
su username或者图形界面下打开的终端(伪终端)
执行脚本
~/.bashrc-->/etc/bashrc-->/etc/profile.d/*.sh
编辑配置文件定义的新配置的生效方式:
(1).重新启动shell进程
(2).使用source或.命令进程(尽量不要使用source)
问题:1.定义对所有用户都生效的别名
2.让用户的PATH环境变量至多出一个路径,例如多/usr/bin
登入系统读取步骤:
当登入系统时候获得一个shell进程时,其读取环境设定档有三步 :
1.首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/profile.d和/etc/inputrc
2.然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会 读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系
3.然后在根据用户帐号读取~/.bashrc
/etc/*和~/.*区别:
/etc/profile,/etc/bashrc 是系统全局环境变量设定
~/.profile,~/.bashrc是用户家目录下的私有环境变量设定
~/.profile与~/.bashrc的区别:
都具有个性化定制功能
~/.profile可以设定本用户专有的路径,环境变量等,它只在登入的时候执行一次
~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次
实现算数运算:
+,-,*,/,%,**
(1)let var =算术表达式
(2)var=${算术表达式}
(3)var=$((算术表达式))
(4)var=$(expr arg1,erg2…)
乘法符号有些场景中需要转义
bash有內建的随机数生成器,$RANDOM
增强型赋值:
+=,-+,*=,%=,/=
let varOPERvalue
例如:let count+=1
let var++
let var--
bash的测试类型:
数值测试:
-gt:是否大于
-ge:是否大于等于
eq:是否等于
-ne:是否不等于
-lt:是否小于
-le:是否小于等于
字符串测试:
==:是否等于
>:大于
<:小于
!=:是否不等于
^=:左侧的字符串是否能够被右侧的pattern所匹配
Note:次表达式一般用于[[]]中
-z “string”:测试字符串是否为空,空则为真,不空为假
-n“string”:测试字符串是否不空,不空则为真,空则为假
Note:用于字符串比较时用到的操作都应该使用引号
bash自定义退出码:
exit[n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即停止,种植退出状态取决于eixt命令后面的数字。
注意:如果未给脚本指定退出状态码,整个脚本的退出码取决于脚本中执行的最后一条命令的状态码。
练习:写一个脚本,接受一个文件的路径作为参数
如果参数个数小于1,则提示用户至少给个参数,并立即退出
如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数。
bash条件测试:
测试方式:
test expression
[expression]
[[expression]]
测试表达式的类别:
数值比较
字符串测试
文件测试
-a file
-e file:文件存在性测试,存在为真,否则为假
存在性类别测试:
-b file:存在且为块设备文件
使用$?查看上一条命令的结果,成功值为0,不成功为非0!
-c file:是否存在切为字符设备文件
-d file:是否存在且为目录文件
-f file:是否存在且为普通文件
-h file 或-L file:是否存在且为符号链接文件
-p file:首存在且为命名管道文件
-S 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
expression–o expression
!expression
必须使用测试命令进行