知识点
环境变量
- HOME
- PATH
- SHELL
- RANDOM // 0~32767的随机数
declare -i number=$RANDOM*10/32768 //0-9的随机数
- HISTSIZE
- HISTFILESIZE
通过echo $PATH 或 echo $LANG 输出变量
通过VAR=VALUE 设定变量,等号两边不能有空白符
a=1
var='lang is $LANG'
[Enter] $ 空格 需要用反斜杠进行转义。
通过$() 或者 `` 可以进行命令取代
version=$(uname -r)
echo $version
通过"" 或者 ${}累加内容
PATH=${PATH}:/home/bin
PATH="PATH":/home/bin
子程序会继承父程序的环境变量,子程序不会继承父程序的自定义变量
Bash变量
PS1 -> shell提示字符
d 显示日期,如"Mon Feb 2"
H 显示完整主机名 "WWW.SMALLPI.CN"
h 仅取主机名第一个小数点前的内容 如 "WWW"
显示时间 如 "HH:MM:SS" 24小时格式
T 显示时间 如 "HH:MM:SS" 12小时格式
A 显示时间 如 "HH:MM: 24小时格式
@ 显示时间 12小时的am/pm格式
u 目前使用者的账号名称 如 root
v BASH版本信息
w 完整工作目录名称
W 仅列出最后一个目录名
# 下达的第几个指令
$ 提示字符 root为# 否则为$
$ -> 本shell的PID
echo $$ 输出本shell的PID
? -> 上个执行命令的回传值
上个指令成功执行 回传 0
上个指令执行出错 回传 非0
OSTYPE HOSTTYPE MACHTYPE 主机硬件和核心的等级
散乱知识
/etc/shells 查看linux可以使用的shell
/bin/sh (已经被bash取代)
/bin/bash (linux系统默认的shell)
/bin/ksh (兼容于bash)
/bin/tcsh (整合csh,提供更多功能)
/bin/csh (已经被tcsh取代)
/bin/zsh (ksh发展而来)
/etc/passwd 中记录着用户登录系统使用的shell
~/bash_history 记录上次登录bash的命令历史
alias lm='ls -al' 设定命令别名。而alias显示命令别名。
可以使用通配符 ls /etc/a* 列出以/etc下a开头的档案。
通过 export PATH 将变量变成环境变量,该变量在子程序中都有效
通过 unset varname 取消变量设定
"" 双引号可以保留变量的内容。而''单引号仅仅是纯文本。
var[1]="first element" 定义数组,**echo "${var[1]}"
bash进站信息记录在 /etc/issue
telnet远程登录bash的进站信息记录在 /etc/issue.net
/etc/issue中的反斜杠变量(与bash进入信息有关)
d 本地端时间的日期
l 显示第几个终端机接口
m 显示硬件的等级 (i386,i486,i586,i686...)
显示主机的网络名称
o 显示domain name
显示操作系统版本,相当于(uname -r)
显示本地端时间的时间
s 操作系统的名称
v 操作系统的版本
/etc/motd 中写有登录后的通知信息
Bash 的环境配置文件
login shell 和 nologin shell
login shell -> 取得bash时需要完整的登录流程的,称为login shell。
对login shell,只会读取两个配置文件
- /etc/profile 系统整体的bash配置文件
-- 该目录用于设定下面变量
---- PATH: 依据UID决定PATH变量要不要包含sbin等系统目录
---- MAIL: 根据账号设定邮箱目录 /var/spool/mail/账号
---- USER: 用户账号
---- HOSTNAME: 根据主机的hostname设定
---- HISTSIZE: 历史记录笔数
-- 呼叫外部数据
---- /etc/inputrc 和热键有关
---- /etc/profile.d/*.sh
---- /etc/sysconfig/i18n (由/etc/profile.d/lang.sh呼叫进来,与bash语系有关)- ~/.bash_profile 或 ~/.bash_login 或 ~/.profile 个人设定
-- /.bash_profile会呼叫/.bashrc
也可以在/etc/profile.d写shell脚本 custom.sh 进行bash的环境配置nologin shell -> 取得bash时不需要登录流程,不需要账号密码的,例如X Window启动终端机。又例如在bash中下达bash命令
对于nologin shell 会读取下面的配置文件
- ~/.bashrc
-- 会呼叫 /etc/bashrc
---- 依据不同UID规范umask值
---- 依据不同UID规范提示字符(PS1变量)
---- 呼叫 /etc/profile.d/*.sh设定
-- 通过/etc/skel/.bashrc恢复~/.bashrc
其他bash配置文件
- /etc/man.config
规范使用man命令时,查找数据的路径
最重要的是MANPATH变量
- ~/.bash_history
记录bash的命令历史
- ~/.bash_logout
定义注销bash时的一些收尾工作
${} 的删除输出
path=${PATH}
echo ${path#/kerberos/bin:} 在path中删除 **/kerberos/bin:** 内容,原本内容不变
echo ${path##/*} path中删除掉最长的那个数据,原本内容不变
# 为符合取代文字的最短的那一个
## 为符合取代文字的最长一个
echo ${path%:bin} 删除path最后面的变量,原本内容不变
echo ${path%%:bin} 删除从后面开始符合的最长字符串,原本内容不变
${} 的取代输出
${varname/word1/word2} 用word2取代word1,只取代一个
${varname//word1/word2} 用word2取代word1,取代所有
判断变量是否存在
varname = ${varname-content} 判断是否设定
varname 存在时为 varname
varname 不存在时为 contentvarname = ${varname:-content} 判断是否设定,以及是否为空
varname = 存在且不为空 为 varname
varname 不存在或为空 content
${str-expr}
${str:-expr}
${str+expr}
${str:+expr}
${str=expr} str不存在时,整个表达式和str均为expr
${str:=expr}
${str?expr}
${str:?expr}
终端机环境设定
通过stty命令设定
通配符和特殊符号
通配符
* -> 代表0个到无穷多个字符
? -> 代表一个字符
[] -> 代表一个括号内的字符
[-] -> 代表括号范围内的一个字符
[^] -> 代表括号以外的一个字符
例如
ls -d /etc/cron*
ls -d /etc/?????
ls -d /etc/[0-9] 含有数字的文件名
ls -d /etc/[^a-z]* 档名开头非小写字母的文件名
特殊符号
# 批注符号
跳脱符号
| 管线符号
; 连续指令下达符号
~ 用户家目录
$ 取用变量符号
& 工作控制符号,将指令变成背景下工作
! 逻辑非
/ 目录分割符
>和>> 数据流重定向,取代和累加
<和<< 数据流重定向,
'' 代表纯文本
"" 可以替换变量
`` 相当于$(),代表先执行的指令
() 子shell的起始和结束
{} 命令区块组合
数据流重定向
- 标准输入(stdin) 代码为0 使用<或<<
- 标准输出(stdout) 代码为1 使用>或>>,也可以是1>或1>>
- 错误输出(stderr) 代码为2 使用2>或2>>
- 同时重定向stdout和stderr, 使用&>或&>> 也可以 2>&1
find /home -name .bashrc > outfile 2> errfile 同时重定向标准输出和错误输出
cat > catfile <~/.bashrc
car > catfile << "eof" 指定键盘的结束字符为eof
命令执行连续与逻辑判断
- 通过;连续下达指令
sync;sync;shutdown -h -now
- 通过&&,只有前一条指令执行正确,下一条指令才会继续执行
&& 是通过$?进行判断的
ls /tmp/abc && touch /tmp/abc/newfile 只有/tmp/abc目录存在才会去创建newfile文件
- 通过||,只要前一条指令执行正确,下一条指令就不执行;换句话说,前一条指令执行错误,下一条指令才会执行
|| 也是通过$?进行判断的
ls /tmp/abc || mkdir /tmp/abc 目录abc不存在就进行创建
ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/newfile
ls /tmp/testfile && echo "exits" || echo "not exits"
管线命令
管线 | 将前一个指令的输出作为后一个指令的输入
注意
管线命令只会处理 标准输出
管线命令必须要接受前一个命令的数据成为 标准输入 才能进行处理
通过与 cut 或 grep 等命令配合使用。
- /dev/null 垃圾桶黑洞装置
find /home -name .bashrc 2> /dev/null
命令
- type [-tpa] name (查询name是內建命令还是外部命令)
type -t 显示类型,如file为外部命令,alias为命令别名,builtin为內建命令。
type -a 将path中所有name指令列出来,包括alias
- echo (输出)
echo $LANG 输出变量LANG
echo ${PATH} 输出变量PATH
- export (将变量变成环境变量)
export PATH (PATH在子程序中都有效)
- unset (取消变量设定)
unset var
- bash (进入子程序)
bash 进入子程序
exit 离开子程序
- env (观察环境变量)
- export (列出环境变量、自定义变量转成环境变量)
export 列出环境变量
export varname 将变量varname转成环境变量
- set (观察所有变量,包括环境变量和自定义变量)
- locale (与系统语系有关)
locale -a 查询系统支持的所有语系编码
locale 查看所有语系变量
语系档案放置在 /usr/lib/locale
整体系统默认语系定义在 /etc/sysconfig/i18n
- read [-pt] variable (读取内容,保存到variable中)
read -p 后面接提示内容
read -t 后面接最长等待秒数
read varname 输入内容保存到varname中
- declare或typeset (宣告变量的类型)
declare 和set一样,显示环境变量和bash变量
declare [-aixr] variable
declare -a 定义为数组(array)类型
declare -i 定义为整数(integer)类型
declare -x 将variable变成环境变量
declare -r 将variable变成只读,不能改,也不能unset
declare -i sum=100+300+50 // sum=450
默认变量类型为字符串
Bash中的数值运算,最多仅能为整数形式
declare +x variable 将variable变成自定义变量
declare -p 列出变量的类型
- ulimit (限制用户)
ulimit [-sHacdfltu] 配额
ulimit -H 严格设定
ulimit -S 警告设定
ulimit -a 列出所有的限制
ulimit -c 限制每个核心档案(core file)的最大容量
ulimit -f 该shell可建立的最大档案容量
ulimit -d
ulimit -l
ulimit -t 可使用的最大CPU时间
ulimit -u 单一用户可使用的最大程序数量
ulimit -f 10240 限制用户只能建立10MB以下的档案
- alias (设置命令别名)
alias 显示所有命令别名
alias other=command 设置command命令的别名为other
- unalias (取消命令别名)
unalias (取消命令别名)
unalias aliasCommand
- history 查看命令历史
history [n] 查看最近n条命令
history -c 清楚所有命令历史
history [-raw] hisfiles
history -a 新增hisfiles中的命令历史
history -w 将shell命令历史写入hisfiles
!number 执行number号命令历史
!command 执行最近的command开头的命令历史
!!执行最近一条命令历史
- source (读取配置文件的指令)
source 配置文件档名
source ~/.bashrc 将.bashrc设定读入目前bash环境中
. ~/.bashrc 与source ~/.bashrc相同
同样也可以读取 /etc/profile 和 ~/.bash_profile
- stty (终端机环境设定)
stty -a 列出所有stty参数
其中
eof 表示结束输入 ^D
erase 向后删除字符 ^?
intr 送出interrupt信号给目前正在run的程序 ^C
kill 删除目前指令列上的所有文字 ^U
quit 送出一个quit信号给目前正在run的程序 ^
start 某个程序停止后,重新启动它的output ^Q
stop 停止目前屏幕的输出 ^S
susp 送出一个terminal stop信号给目前正在run的程序 ^Z
stty erase ^H 修改erase热键为Ctrl+H
- set设定bash的终端机设定
set [-uvCHhmBx]
set -u 预设不启用。使用未设定变量时显示错误信息
echo $- 显示目前所有set设定值
- cut (对一行文本进行信息切割)
cut -d '分隔符' -f n 根据分隔符进行分割并取出第n段
echo $PATH | cut -d ':' -f 5
echo $PATH | cut -d ':' -f 3,5
cut -c n1-n2取出字符范围的信息
export | cut -c 12- 取出12字符之后的内容
export | cut -c 12-20 取出12-20字符
- last (显示登入者的信息)
- grep (用正则表达式搜寻字符串)
grep [-acinv] [--color=auto] '搜寻字符串' filename
grep -a 将binary文档以text文档的方式搜寻数据
grep -c 计算搜寻到的字符串次数
grep -i 忽略大小写
grep -n 顺便输出行号
grep -v 显示没有搜寻到字符串的行
grep --color=auto 搜寻到的字符串高亮显示
last | grep 'root'
last | grep -v 'root'
last | grep 'root' | cut -d ' ' -f1
- sort (排序指令)
sort [-fbMnrtuk] [file or stdin]
sort -f 忽略大小写
sort -b 忽略最前面的空格
sort -M 以月份的名字来排序
sort -n 以纯数字进行排序
sort -r 反向排序
sort -u 相同的数据仅出现一行
sort -t 指定分隔符,默认为[tab]
sort -k 以第几个字段进行排序
cat /etc/passwd | sort -t ':' -k 3
cat /etc/passwd | sort -t ':' -k 3 -n
last | cut -d ' ' -f1 | sort
- uniq (重复的数据只列出一个)
uniq [-ic]
uniq -i 忽略大小写
uniq -c 进行计数
last | cut -d ' ' -f1 |sort|uniq
last | cut -d ' ' -f1 |sort|uniq -c
- wc (字数,单词数,行数统计)
wc [-lwm]
wc -l 显示行数
wc -w 显示单词数
wc -m 显示字符数
- tee (双向重导向)
tee [-a] file
tee 累加的方式
字符串转换命令
- tr (字符串的删除或替换)
tr [-ds] STR
tr -d STR 删除STR字符串
tr -s
last | tr '[a-z]' '[A-Z]' 小写转换成大写
cat /etc/passwd | tr -d ':' 删除冒号
cp /etc/passwd /root/passwd && unix2dos /root/passwd
file /etc/passwd /root/passwd
cat /root/passwd | tr -d ' '
- col (字符串替换)
col [-xb]
col -x 将tab转换成对等的空格
col -b 有/时,仅保留/最后的字符,常用来转换man page成纯文本
- join (整个两个文档,相同的字段提到最前面)
join [-ti12] file1 file2
join -t 指定分隔符,默认空格符分割数据,并比对第一个字段数据,相同则合成一行
join -i 忽略大小写
join -1 代表第一个档案要用这个字段解析
join -2 代表第二个档案用这个字段解析
- paste (将两个文档贴在一起,中间默认tab分割)
paste -d file1 file2
paste -d 指定分割符
paste - 如果file写成-,则表示standard input
- expand (将tab键转成空格键)
expand -t n 指定一个tab键转换成n个空格键
expand - 其中-为标准输入
- unexpand (将空白转成tab)
- split (大档案分割成小档案)
split [-bl] file PREFIX
split -b 后接分割成的档案大小
split -l 以行数进行分割
split PREFIX 作为分割档案名的前导文字
- xargs (将stdin内容作为某个命令的参数)
xargs -p 每次执行都询问
xargs -n N 指定命令后面接N个参数
xargs -e"STR" 当xargs分析到STR时结束工作
echo "/" | xargs ls
find /sbin -perm +7000 | ls -l
管道命令中出现文件名且该文件名需要作为stdin和stdout时,可以用-。
tar -cvf - /home | tar -xvf -
参考
鸟哥的Linux私房菜 第三版