一、Shell的变量功能
1.1 变量的取用与设置:echo, 变量设置规则,unset
- 取用变量:echo
# echo $变量
# echo ${变量}
上述两种都可以。
设置和修改变量:
# echo ${myname} //变量内容默认为空
# myname=syf
变量设置规则:
(1)’='左右不能有空格
(2)变量名称只可以是英文字母与数字,且开头字符不能是数字
(3)若该变量需要在其他子程序中执行,则需要以export来使变量变成环境变量:“export PATH”
还有很多其他规则,不详细介绍了
- unset: 取消变量,“unset myname”
1.2 环境变量的功能
-
env:观察环境变量与常见环境变量说明
HOME:使用者的主文件夹
SHELL:目前环境使用的是SHELL的哪支程序(linux默认/bin/bash)
PATH:可执行文件搜索路径
LANG:语系数据 -
set:观察所有变量(包括环境变量和自定义变量)
-
PS1:提示字符的设置
例如本机提示符为 syf@ubuntu:
\d:日期
\u:使用者账号
\h:主机名(取第一个小数点前的名称)
\w:完整工作目录(但主文件夹会以~取代)
\W:利用basename函数取得工作目录名称
$: 提示字符。如果是root,则是‘#’ -
$:关于本shell的PID
$本身也是个变量。
-
?:上一个执行指令的返回值
成功则返回0,失败则返回错误码,上述127即为失败指令的错误码 -
export:自订变量转为环境变量
子程序仅会继承父程序的环境变量,而不会继承自订变量。想让该变量内容继续在子程序中使用,则执行
# export 变量名
常用在script编写中
1.3 变量键盘读取、阵列与宣告:read,array,declare
- read:读取来自键盘输入的变量
常用于script
# read [-pt] variable
-p:后面接字符串作为提示符
-t:等待时间(秒)
- declare/typeset:声明变量类型
# declare [-aixr] variable
-a:将variable变量定义为array类型
-i:将variable变量定义为int类型
-r:将variable变量定义为read-only类型(类似const)
-x:将变量变成环境变量(与export功能相同)
变量类型默认为字符串类型;bash数值运算精度默认为整数。
- array变量类型
1.4 与文件系统及程序的限制关系:ulimit
1.5 变量内容的删除、取代与替换(Optional)
通过简单的动作将变量内容进行微调,而无需直接设置修改原本的内容
- 删除
假设我不喜欢local/bin,所以要删除前1个目录:
#代表从前面开始删除,仅删除最短的那个
如果我想只显示最后一个目录:
##代表从前面开始删除最长的那个。即删除‘/’到’:'之间最长的字符串(*统配符)
%和%%表示从后面开始删除,其他用法与#和##一样
- 取代
${变量/旧字符串/新字符串}
${变量//旧字符串/新字符串}
(1)将第一个符合的字符串替换为新字符串
(2)将所有符合的字符串替换为新字符串
- 变量的测试与内容替换
判断变量是否存在,若存在,则使用已有的设置;若不存在,则给予一个设置。
二、命令别名和历史命令(history)
命令别名设置:alias,unalias
简化指令,例如
# alias lm='ls -al | more'
就多了一个可执行命令lm。alias命名规则与变量定义规则几乎相同。
还可以取代既有指令:
# alias rm='rm -i'
防止误删。
直接使用alias可以查看已有的命令别名,使用"unalias 命令别名"可以取消别名。
历史命令
# history [n]
n:查看最近n条历史命令
三、Bash Shell的操作环境
四、数据流重导向
4.1 什么是数据流重导向
- 标准输入(stdin):1,使用<或<<
- 标准输出(stdout):2,使用>或>>
- 标准错误输出(stderr):3,使用2>或2>>
Command是默认输入到屏幕,可重定向到文件/设备
若linuxfile不存在,则自动创建。>是覆盖,>>是追加。
<:用文件内容代替键盘输入
4.2 命令执行的判断依据
- ;(分号):不考虑指令相关性的连续指令下达
- && || :"$?"指令返回值,正确执行会返回0。
cmd1&&cmd2: cmd1执行完毕且正确执行(返回值为0)才会执行cmd2。
cmd1||cmd2:cmd1执行完毕且正确执行,则cmd2不执行;否则执行cmd2。
五、管线命令(pipe)
例:
# ls -al /etc | less
ls指令输出后的内容就能够被less读取,并且利用less的功能可以前后翻动。
即将前一个命令的standard output作为自己的standard input。
注:
(1)管线命令仅会处理standard output,对于standard error output则会忽略
(2)管线命令必须能够接受来自前一个指令的数据称为standard input继续处理才行(例如 ls,cp等就不是管线命令)
5.1 提取命令:cut, grep
- cut : 切割,主要用于一行里的数据进行分解。对于多空格的情况可能会使用awk
# cut -d '分割字符' -f fields
# cut -c 字符区间
- grep
5.2 排序命令:sort, wc, uniq
# sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写差异
-b:忽略最前面的空格
-r:反向排序
-u:uniq功能
-t:指定分割符,默认是tab