linux备忘录-bash

知识点

环境变量

  1. HOME
  2. PATH
  3. MAIL
  4. SHELL
  5. RANDOM // 0~32767的随机数

declare -i number=$RANDOM*10/32768 //0-9的随机数

  1. HISTSIZE
  2. HISTFILESIZE

通过echo $PATHecho $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"
\t 显示时间 如 "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...)
\n 显示主机的网络名称
\o 显示domain name
\r 显示操作系统版本,相当于(uname -r)
\t 显示本地端时间的时间
\s 操作系统的名称
\v 操作系统的版本

/etc/motd 中写有登录后的通知信息

Bash 的环境配置文件

login shell 和 nologin shell

login shell -> 取得bash时需要完整的登录流程的,称为login shell。
对login shell,只会读取两个配置文件

  1. /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语系有关)
  2. ~/.bash_profile~/.bash_login~/.profile 个人设定
    -- /.bash_profile会呼叫/.bashrc
    也可以在/etc/profile.d写shell脚本 custom.sh 进行bash的环境配置

nologin shell -> 取得bash时不需要登录流程,不需要账号密码的,例如X Window启动终端机。又例如在bash中下达bash命令
对于nologin shell 会读取下面的配置文件

  1. ~/.bashrc
    -- 会呼叫 /etc/bashrc
    ---- 依据不同UID规范umask值
    ---- 依据不同UID规范提示字符(PS1变量)
    ---- 呼叫 /etc/profile.d/*.sh设定
    -- 通过/etc/skel/.bashrc恢复~/.bashrc

其他bash配置文件

  1. /etc/man.config

规范使用man命令时,查找数据的路径
最重要的是MANPATH变量

  1. ~/.bash_history

记录bash的命令历史

  1. ~/.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 不存在时为 content

varname = ${varname:-content} 判断是否设定,以及是否为空
varname = 存在且不为空 为 varname
varname 不存在或为空 content

${str-expr}
${str:-expr}
${str+expr}
${str:+expr}
${str=expr} str不存在时,整个表达式和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的起始和结束
{} 命令区块组合

数据流重定向

  1. 标准输入(stdin) 代码为0 使用<<<
  2. 标准输出(stdout) 代码为1 使用>>>,也可以是1>1>>
  3. 错误输出(stderr) 代码为2 使用2>2>>
  4. 同时重定向stdout和stderr, 使用&>&>> 也可以 2>&1

find /home -name .bashrc > outfile 2> errfile 同时重定向标准输出和错误输出
cat > catfile <~/.bashrc
car > catfile << "eof" 指定键盘的结束字符为eof

命令执行连续与逻辑判断

  1. 通过;连续下达指令

sync;sync;shutdown -h -now

  1. 通过&&,只有前一条指令执行正确,下一条指令才会继续执行

&& 是通过$?进行判断的
ls /tmp/abc && touch /tmp/abc/newfile 只有/tmp/abc目录存在才会去创建newfile文件

  1. 通过||,只要前一条指令执行正确,下一条指令就不执行;换句话说,前一条指令执行错误,下一条指令才会执行

|| 也是通过$?进行判断的
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"

管线命令

管线 | 将前一个指令的输出作为后一个指令的输入

注意
管线命令只会处理 标准输出
管线命令必须要接受前一个命令的数据成为 标准输入 才能进行处理

通过与 cutgrep 等命令配合使用。

  1. /dev/null 垃圾桶黑洞装置

find /home -name .bashrc 2> /dev/null

命令

  1. type [-tpa] name (查询name是內建命令还是外部命令)

type -t 显示类型,如file为外部命令,alias为命令别名,builtin为內建命令。
type -a 将path中所有name指令列出来,包括alias

  1. echo (输出)

echo $LANG 输出变量LANG
echo ${PATH} 输出变量PATH

  1. export (将变量变成环境变量)

export PATH (PATH在子程序中都有效)

  1. unset (取消变量设定)

unset var

  1. bash (进入子程序)

bash 进入子程序
exit 离开子程序

  1. env (观察环境变量)
  2. export (列出环境变量、自定义变量转成环境变量)

export 列出环境变量
export varname 将变量varname转成环境变量

  1. set (观察所有变量,包括环境变量和自定义变量)
  2. locale (与系统语系有关)

locale -a 查询系统支持的所有语系编码
locale 查看所有语系变量
语系档案放置在 /usr/lib/locale
整体系统默认语系定义在 /etc/sysconfig/i18n

  1. read [-pt] variable (读取内容,保存到variable中)

read -p 后面接提示内容
read -t 后面接最长等待秒数
read varname 输入内容保存到varname中

  1. 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 列出变量的类型

  1. 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以下的档案

  1. alias (设置命令别名)

alias 显示所有命令别名
alias other=command 设置command命令的别名为other

  1. unalias (取消命令别名)

unalias (取消命令别名)
unalias aliasCommand

  1. history 查看命令历史

history [n] 查看最近n条命令
history -c 清楚所有命令历史
history [-raw] hisfiles
history -a 新增hisfiles中的命令历史
history -w 将shell命令历史写入hisfiles
!number 执行number号命令历史
!command 执行最近的command开头的命令历史
!!执行最近一条命令历史

  1. source (读取配置文件的指令)

source 配置文件档名
source ~/.bashrc 将.bashrc设定读入目前bash环境中
. ~/.bashrc 与source ~/.bashrc相同
同样也可以读取 /etc/profile 和 ~/.bash_profile

  1. 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

  1. set设定bash的终端机设定

set [-uvCHhmBx]
set -u 预设不启用。使用未设定变量时显示错误信息
echo $- 显示目前所有set设定值

  1. 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字符

  1. last (显示登入者的信息)
  2. 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

  1. 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

  1. uniq (重复的数据只列出一个)

uniq [-ic]
uniq -i 忽略大小写
uniq -c 进行计数
last | cut -d ' ' -f1 |sort|uniq
last | cut -d ' ' -f1 |sort|uniq -c

  1. wc (字数,单词数,行数统计)

wc [-lwm]
wc -l 显示行数
wc -w 显示单词数
wc -m 显示字符数

  1. tee (双向重导向)

tee [-a] file
tee 累加的方式

字符串转换命令

  1. 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 '\r'

  1. col (字符串替换)

col [-xb]
col -x 将tab转换成对等的空格
col -b 有/时,仅保留/最后的字符,常用来转换man page成纯文本

  1. join (整个两个文档,相同的字段提到最前面)

join [-ti12] file1 file2
join -t 指定分隔符,默认空格符分割数据,并比对第一个字段数据,相同则合成一行
join -i 忽略大小写
join -1 代表第一个档案要用这个字段解析
join -2 代表第二个档案用这个字段解析

  1. paste (将两个文档贴在一起,中间默认tab分割)

paste -d file1 file2
paste -d 指定分割符
paste - 如果file写成-,则表示standard input

  1. expand (将tab键转成空格键)

expand -t n 指定一个tab键转换成n个空格键
expand - 其中-为标准输入

  1. unexpand (将空白转成tab)
  2. split (大档案分割成小档案)

split [-bl] file PREFIX
split -b 后接分割成的档案大小
split -l 以行数进行分割
split PREFIX 作为分割档案名的前导文字

  1. 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私房菜 第三版

posted @ 2017-08-14 15:35  smallpi  阅读(272)  评论(0编辑  收藏  举报

页脚