首先强调一下,不保证所有的内容全是都是正确的,一方面下面的内容很大一部分是带着我的理解的,另一方面,字是我一个一个打上去的,所以呢肯定很有错误。如果发现错误,请随手在下面留个言,谢谢大家啦!
可以在~/.bashrc中设置一些启动就需要执行的命令 ( 下面还要介绍几个地方,但是推荐放在这里,一方面这里仅修改自己的设置,另一方面见效快,设置了退出再登录就可以了,其他地方需要重启,有的使用在tty1-7中的)
检查一下/etc/shells文件可以看到有多少可用的shell
登录取得的shell记录在/etc/passwd文件中
bash 主要优点:
命令记忆功能
使用↑↓功能键可以查看最近输入的命令,系统成功注销后,
用过的命令将存入~/.bash_history
命令与文件补全功能
[tab]补全功能只有bash才有哦 第一个字后面是命令补全,
第二个字后面是文件名补齐
命令别名设置功能
例如alias lm='ls -al' 用lm替换'ls -al'
作业控制,前台,后台控制
shell scripts的功能强大
通配符
bash的内置命令:type
type [-tpa] name
选项:
不加任何参数 type会显示出name是外部命令还是内置命令
-t 会将name通过下面的方式显示出它的意义
file:表示为外部命令
alias:表示别名的命令
builtin:表示该命令为内置命令
-p 如果后面接的name为命令,会显示完整文件名或显示为内置命令
-a 列出所有在PATH变量中包含name命令的路径
执行命令
command [-opations] parameter1 parameter2
如果命令过长,可以使用续行符\来换行输入,但\后面不能跟空格
换行成功下一行会有>提示
bash的变量功能
变量的获取与设置(以获取PATH为例)
echo $PATH 或者 echo ${PAHT}
变量设置的规则
1.变量与变量内容之间用=连接
2.等号两边不能直接接空格
3.变量名只能是英文字母或数字,但不能数字打头
4.若有空格,可是使用'' 或 ""结合,双引号可以保持变量特性,
单引号将变量解释为普通字符
5.必要时需要用转义字符"\"将特殊字符变成一般符号
6.在一串命令中,还需要通过其他命令提供的信息,可以使用
"`command`" 例如 cd /lib/modules/`uname -r`/kernel
(在一串命令中`之内的命令会先执行,其执行的结果将作为
外部输入信息)
7.若变量为扩展变量内容,需要以双引号及$变量名称继续累加内容
8.若该变量需要在其他子程序中执行,需要用export使变量变为
环境变量
9.通常大写字母为系统默认变量,自行设置的变量可以用小写
10.取消变量的方法"unset 变量名"
注意:
环境变量可以应用于子程序,普通变量不可以
环境变量的功能
一些环境变量的说明:env(environment 环境 缩写)
各个变量的作用:
HOME 代表用户的家目录
SHELL 告诉我们当前使用的是哪个shell
HISSIZE 设置记录历史我们输入个数的变量
ENV 这个是用户所用的个性化环境设置文件的读取文件
MAIL 当使用mail命令收信时,系统会去读取的邮件信箱文件
PATH 执行文件的搜索路径,目录之间用:分隔,顺序很重要
LANG 语系文件
RANDOM 随机数变量,打印这个变量就是一个随机数0~32767
其他所有变量的说明:set
PS1(提示符的设置)
\d 代表日期,格式为:“星期 月 日”
\H 完整的主机名称
\h 仅取主机名称的第一个名字
\t 显示时间为24小时格式,如: HH:MM:SS
\T 显示时间为12小时格式
\A 显示时间24小时格式 HH:MM
\u 当前用户的账号名称
\v bash的版本信息
\w 完整的工作目录名称
\W 利用basename取得工作目录名称,所以会列出最后一个目录名
\# 执行第几个命令
\$ 提示符,如果是root提示符为#,否则为$
$ 本shell的PID
打印本shell 的PID echo $$
? 上一个命令的回传码
ehco $? 可以打印上一个命令的回传码
OSTYPE/HOSTTYPE/MACHTYPE 主机的硬件与核心的等级
自定义变量转换成环境变量 exprot
语系文件的变量(locale)
可以通过下面的变量来改变编码:
LANG 主语言的环境
LC_CTYPE 字符辨别的编码
LC_NUMERIC 数字系统的显示消息
LC_TME 实现系统的显示数据
LC_COLLATE 字符串的比较与排序等
LC_MONETARY 币值格式的显示
LC_MESSAGES 消息显示的内容,如菜单,错误信息等
LC_ALL 语言环境整体的设置
变量的有效范围
注意脚本程序中,如果多个脚本程序执行同时执行任务,则需要把变量设置
为环境变量,这样才能在另一个脚本中使用当前脚本的变量
变量键盘的读取,数组,与声明
read 读取来自键盘输入的变量
选项:
-p 后面可以接提示信息(一个字符串)
-t 后面可以接等待的秒数,不必因为用户没有输入而一直等待
declare/typeset 两个命令功能一样,声明变量的属性
选项:
-a 将后面的变量定义为数组
-i 将后面的变量定义为整数数字
-x 用法与export一样,将后面的变量定义为环境变量
-r 将一个变量设置为只读,不可更改内容,也不可取消定义
数组属性array说明
建议使用${数组}来读取 设置方法和C相似 array[i]=xxx
与文件系统及程序限制关系ulimit
ulimit [-SHacdflmnpstuv] [配额]
选项:
-H hard limit 严格设置,必定不能超过设置值
-S soft limit 警告设置,可以超过这个值,但是会收到警告
但是还是无法超过严格设置
-a 列出所有的限制额度
-c 可建立的最大核心文件容量
-d 程序数据可使用的最大容量
-f 此shell可以建立的最大文件容量(一般设置为2G),单位为KB
-l 可用于锁定(lock)的内存量
-p 可用于管道处理(pipe)的数量
-t 可使用的最大CPU时间(单位为秒)
-u 单用户可以使用的最大进程数量
附加的变量设置功能
${变量}的形式可以用来修改输出内容
例如 变量duxing的内容为:/home/duxing/testing/testing.x.sh
echo ${duxing##/*/}
输出结果为testing.x.sh
echo ${duxing#/*/}
输出结果为duxing/testing/testing.x.sh
##为贪婪的删除,#查找最短符合的字符串删除
从后面开始删除%
echo ${duxing%%/*/}
输出结果为/home/duxing/testing/testing.x.sh
echo ${duxing%%/*}
输出结果为(删完了)
echo ${duxing%/*}
输出结果为/home/duxing/testing
替换/
echo ${duxing/testing/TEST}
输出结果为/home/duxing/TEST/testing.x.sh
echo ${duxing//testing/TEST}
输出结果为/home/duxing/TEST/TEST.x.sh
一个的话仅替换第一个,两个会替换全部
变量的设置方式P216
命令别名与历史命令
变量别名的设置 alias unalias
历史命令:history
选项 :
n 数字,要列出最近n行的命令
-c 将当前shell中所有的history全部删除
-a 将当前新增的histroy命令加入histfiles文件中
若没有文件则默认写入~/.bash_history
-r 将histfiles的内容读到当前shell的历史记忆中
-w 将当前的历史记忆内容写入histfiles文件中
!n n为数字,可以执行第n条数据
!command 由最近的命令向前搜索“命令串含command”的命令,并执行
!! 执行上一条命令
Bash Shell 使用环境
登录消息显示数据:/etc/issue、/etc/motd
修改前者可以更改登录的时候的提示字符串
issue内各代码的含义
\d 本地端时间的日期
\l 显示是第几个终端接口
\m 显示硬件的等级
\n 显示主机的网络名称
\o 显示域名
\r 操作系统的版本 相当于uname-r
\t 显示本地端的时间
\s 操作系统的名称
\v 操作系统的版本
/etc/issue/net用来提供telnet远程登录使用的
如果想在用户登录后获取一些消息可以将消息加入到/etc/motd中
环境设置文件:bashrc,~/.bashrc,~/.profile,profile...,
/etc/inputrc,source
注意:在命令行输入的变量,命令别名等,仅针对此次登录有效
系统设置值
/etc/sysconfig/i18n(FC4) ubuntu为/etc/default/locale
语系由i18n维护,不建议在这里修改
/etc/profile(不论哪个linux版本皆如此)
设置几个重要的变量 例如 PAHT USER MAIL HOSTNAME
HISTSIZE umake等,设置要小心,因为所有用户都使用
这个文件的信息
/etc/bashrc ubuntu在/etc/bash.bashrc
这个文件确定umask的功能,同时确定了提示符的内容
/etc/profile.d/sh
针对bash以及C-shell规范了一些数据
/etc/man.config ubuntu /etc/man_db.conf、/etc/manpath.config
确定了使用man的时候,系统到哪里去查看帮助文档
最重要的是MANPATH路径的设置,确定了到哪个目录查找
个人设置值
~/.bash_profile,~/.bash_login,~/.profile
三个文件只要有一个即可,查找顺序如上
~/.bashrc
每次执行shell脚本时候都会重新读取这个文件,而
~/.bash_profile只有在登录的时候才读取
~/.bash_history
历史命令都记录在这里,记录多少与HISTSIZE变量有关默认1000
~/.bash_logout
记录当我注销bash的时候系统再帮我做完什么操作再离开
设置文件的读取顺序
先读取/etc/profile 然后根据该文件的内容,读取/etc/profile.d
etc/inputrc等附加设置文件的内容
然后根据不同的用户,到用户家目录去读取~/.bash_profile等文件
最后根据不同用户,到用户家目录读取~/.bashrc
一般来说修改完设置文件,下次登录就会重新读取设置文件
如果需要立刻应用该文件的设置,可以执行如下命令
source file
. file
利用source或者.都可以将设置文件的内容读入当前shell环境中
登录shell与非登录shell差别
读取的环境设置文件不同
登录shell时 会读取,~/.bash_profile ~/.bash_login ~/.profile
而非登录shell只会读取 ~/.bashrc
终端的环境设置:stty set
stty 查看当前的一些按键内容(可以设置按键的功能)
选项:
-a 列出当前的stty参数
解释:
^ 表示ctrl键
eof 文件结束(即结束输入)
erase 向后删除字符
intr 给当前正在运行的程序发送一个interrupt信号
kill 删除当前命令行上所有的字符ctrl+u
quit 给当前运行的程序发出一个quit信号ctrl+\
start 在某个程序停止运行之后重新启动它 ctrl+q
stop 停止当前屏幕的输出 ctrl+s
susp 给正在运行的程序发送一个terminal stop信号
可以通过stty erase ^h 来设置删除键为ctrl+h 改回来stty erase ^?
set 设置整个命令输出、输入环境 如:记录历史命令,显示错误命令
选项:
-u 默认不启用 启用后,当使用未设置的变量时会报错
-v 默认不启用 启用后,在消息输出前会先显示消息原始内容
-x 默认不启用 启用后,在命令执行前会显示命令内容
-h 默认启用,与历史命令有关
-H 默认启用,与历史命令有关
-m 默认启用,与工作管理有关
-B 默认启用,与[]的作用有关
-C 默认不启用,若使用 > 等 文件存在时不会覆盖
echo $-会显示所有set的设置
还有其他按键设置功能在文件/etc/inputrc中设置(不建议修改)
通配符与特殊符号
符号 内容
* 通配符,代表0个或多个字符
? 通配符,代表一个字符
# 注释,用在shell脚本
\ 转义字符 将特殊字符转换为一般字符
| 分隔两个管道命令
; 连续命令的分隔符
~ 用户的家目录
$ 变量之前需要加的变量替换值
& 将命令变成后台执行(放在命令后面)
! 逻辑运算意义上的非
/ 路径分隔的符号
> >> 输出导向 分别是替换和追加
' 不具有变量转换的功能
"" 具有变量转换的功能
`` 之间为先执行的命令可以用 $(command) 替代
() 中间为子shell的起始和结束
[] 中间为字符的组合
{} 中间为命令区块的组合
组合按键 执行结果
ctrl+c 终止当前命令
ctrl+d 输入结束
ctrl+m 就是enter键
ctrl+s 暂停屏幕的输出
ctrl+q 恢复屏幕的输出
ctrl+u 删除整行命令
ctrl+z 暂停当前命令
例:
cp test[1-3] /tmp 若test1 test2 test3 存在的话就复制到/tmp
cp test[!1-3] /tmp 除est1 test2 test3 外都复制到/tmp
cd /lib/modules/`uname -r`/kernel/drivers 到 这个目录中
cp *[A-Z]* /tmp 只要文件中含有大写字母就复制到
数据流重导向
标准输出 stdout 代码为0 使用<或<<
标准输入 stdin 代码为1 使用>或>>
标准错误 stderr 代码为2 使用2>或2>>
学会使用/dev/null这个垃圾桶
如果将标准输出和错误输出 输出到相同的文件中可以如下使用
find /home -name testing >list 2>&1(注意这几个字符中间不能有' ')
<<符号表示“结束的输入字符“ 例如,要用cat输入消息到test文件中,用eof
结束,可以使用如下的命令:
cat > test <<eof
下面的场合需要使用输出重导向
屏幕上的信息很重要,我们需要保存下来
后台执行的程序,我们不希望它干扰屏幕
一些命令的执行结果,我们需要保存下来
一些命令产生的错误,可能需要丢弃
错误消息与正确消息需要分开
命令执行的判断依据: ; && ||
; 一次可以执行多个命令 例如关机时希望执行两次sync
sync; sync; shutdown -h now
&& 与操作,可以如果前面的一半不满足,后面的一半不执行
可以用下面的命令来判断目录是否存在
ls /tmp && touch /tmp/abc
也可以利用$?判断
|| 或操作,如果前面一半满足,后面一半不执行
可以用它来执行如果目录不存在就创建它
ls /abc || mkdir /abc
注意:这两个操作符是没有优先级的问题的
管道命令(pipe) |
管道命令仅能通过前面一个命令传过来的正确信息,也就是标准输出的
信息进行处理,对于标准错误输出,没有能力直接处理
选取命令: cut gerp
cut -d '分隔符' -f fields
cut -c 字符范围
注意:是以行为单位处理的,处理多个空格连在一起的情况比较吃力
选项:
-d 后面接分隔符,与-f一起使用
-f 根据-d的分隔符将消息分成数段,用-f取第几段的意思
-c 以字符为单位去除固定的字符范围
例如,取出PATH中的第三个路径 和第五个路径
echo $PATH | cut -d ':' -f 3,5(注意中间会用分隔符分开)
取出第12个字符以后的内容
export | cut -c 12-
grep 分析一行数据,若其中有需要的信息就将 该行 取出
grep [-acinv] '搜索字符串' filename
选项:
-a 将二进制文件以文本文件的方式搜索数据
-c 统计找到 ‘搜索字符串’的次数
-i 忽略大小写的不同,所以大小写视为相同
-n 顺便输出行号
-v 反向选择的,即显示出没有‘搜索内容’那些行的内容
例如,
将last中出现duxing的那一行取出来 last | grep 'duxing'
将last中没有出现duxing的取出来 last | grep -v 'duxing'
排序命令 sort wc uniq
sort [-fbMnrtuk] [file or stdin]
选项:
-f 忽略大小写的差异
-b 忽略最前面的空格符部分
-M 以月份的名字来排序
-n 使用串数字进行排序
-r 反向排序
-u uniq 相同的数据仅出现一次
-t 分隔符 默认为 tab
-k 按那个字段 field 来进行排序
例如:/etc/passwd 内容是以":"分隔的,以第三列排序
cat /etc/passwd | sort -t ':' -k 3
uniq 如果排序完成了,想要将重复的数据仅显示一次
uniq [-ic]
-i 忽略大小写
-c 进行计数
例:如果想知道每个人的登陆次数
last | cut -d ' ' -f1 | sort | uniq -c
wc 显示一个文件中有多少词 行 字符等
-l 仅显示有多少行
-w 仅显示有多少词
-m 多少字符
双向重导向 tee (输出到文件的同时,屏幕上也有输出)
tee [-a] file
选项:
-a 以累加的方式将数据加入file中
字符转换命令 tr col join paste expand
tr 删除一段消息中的文字,或者进行文字消息替换
tr [-ds] SET1 ...
选项:
-d 删除消息中的SET1字符串
-s 替换连续的重复的字符
例如,将所有的小写字母全部换成大写字母
last | tr '[a-z]' '[A-Z]'
将 /etc/passwd输出的消息中所有 : 删除
cat /etc/passwd | tr -d ':'
将DOS文件的换行符^M符号删除
cat /home/test/dostxt | tr -d '\r' > dostxt-noM
col [-x]
选项:
-x 将tab键转换成对等的空格键
join 是在处理两个文件之间的数据 有相同数据的行就将它们加在一起
选项:
-t join默认是以空格符分隔数据的,而且比较第一个字段的数据
如果两个文件相同,则会将两个数据联成一行
-i 忽略大小写
-1 表示 第一个文件要用那个字段来分析
-2 表示第二个文件要用那个字段来分析
P238
paste 直接将两行贴在一起,中间用tab隔开
选项:
-d 后面可以接分隔符 默认tab分隔
- 如果file部分写成 - 表示来自标准输入的信息
例如,现将/etc/group 独处,然后与后面的内容贴在一起,仅列出前三行
cat /etc/group | paste /etc/passwd /etc/shadow | head -n 3
expand 将tab按键转换成空格键
选项:
-t 后面可以接数字,可以自定义一个tab用多少空格来了替换
unexpand 将空白转换成tab
拆分命令split [-lb] file PREFIX
选项:
-b 后面接要拆分的文件大小,可加单位,b,k,m
-l 按行数进行拆分
例如/etc/termcap300k 想要拆成120k大小的文件
split -b 120k /etc/termcap termcap
使用ls -al / 输出信息中,每10个记录成一个文件
ls -al / | split -l 10 - lsroot
参数代换 xargs [-0epn] command
将前面命令或者标准输入的内容作为参数传给command
选项:
-0 如果输入的stdin含有特殊字符,例如空格 \等 这个参数可以还原
成一般字符
-e 这是EOF的意思,后面可以接一个字符串,当分析到这个字符串时
就会停止继续工作
-p 在执行每个命令的参数时,都会询问用户的意思
-n 后面接次数,每次command命令执行时 要使用几个参数
没有参数,默认以echo输出
减号(-)的用途
前一个命令的stdout作为这次的stdin 这些命令需要用到文件的名称
来处理,stdin与stdout可以用-来替代
tar -cvf - /home | tar -xvf -
将/home 里面的文件打包,但打包的数据不是记录到文件中,
而是传送到stdout,经过管道后,将tar -cvf - /home 传送给
后面的tar -xvf 后面的这个-则是取用前一个命令的stdout 因此
就不需要file了