shell是文字接口
第一个流行的shell 是由StevenBourne 发展出来的,为了纪念他所以就称为Bourne shell ,或直接简称为sh !
Bourne Again SHell (简称bash) ,这个 Shell 是Bourne Shell 的增强版本,也是基准于GNU 的架构下发展!
环境
指令
执行:相对路径(./ls),绝对路径(/bin/ls)
别名:alias ll='ls -l',unalias ll,alias 查看
内建指令:shell提供的指令,builtin cd 执行shell的cd,而不是外部cd; type -a cd
搜索过程:不是绝对路径,不是相对路径,不是别名,不是内建命令,通过环境变量$PATH来查找命令,没有返回not found
登录的提示信息
cat /etc/issue #终端机接口 (tty1 ~ tty6) 登入的时候
cat /etc/issue.net #elnet 这个远程登录程序登入的时候
cat /etc/motd #您想要让大家都知道的讯息, 那么可以将讯息加入/etc/motd 里面去!
配置文件
login shell
启动 login shell 读取的顺序
/etc/profile 这是系统整体的设定,最好不要修改这个文件
~/.bash_profile 颜色、语系、ls 指令别名等等,后三个可以个人设定
~/.bash_login
~/.profile
non-login shell
已经登录后启动的 shell,仅会读取~/.bashrc
~/.bashrc 会呼叫/etc/bashrc 及`/etc/profile.d/*.sh`
source
配置文件重新写入当前环境
source ~/.bashrc #这两个指令是一样的!
. ~/.bashrc #神奇
常见文件
/etc/man_db.conf 规定了下达man 的时候,该去哪里查看数据的路径设定!
~/.bash_history 历史命令就记录在这里
~/.bash_logout 注销bash 后,系统再帮我做完什么动作后才离开
符号
通配符
* :任意多个字符
? :『一定有一个』任意字符
[ ]:[abcd] 代表『可能是 a, b,c, d 任何一个』
[-]:[0-9] 代表 0 到 9 之间的所有数字
[^]:[^abc]有一个字符,但非 a, b, c
特殊字符
# 批注符号:在后的数据均不执行
\ 转义字符
| 管线 (pipe):两个命令的界定;
; 连续指令下达分隔符:连续性命令的界定
~ 用户的家目录
$ 变量
& 指令变成后台工作
! 『非』 not 的意思!
/ 目录符号
>, >> 数据输出导向,分别是『取代』与『累加』
<, `<<` 数据输入导向
' ' 单引号,纯文本)
" " 具有变量置换的功能
\ \ 中间为可以先执行的指令,亦可使用 $( )
( ) 子shell环境,其中执行的命令不会影响当前shell
{ } 组合成一个命令块
指令
#基本
cat /etc/shells #系统的包含的shell
cat /etc/passwd #登录默认的shell
cat ~/.bash_history #历史指令,『上下键』查找
type -a ls
#别名
alias lm='ls -al' #单引号
#通配符
ls -l /usr/bin/X* #多少X开头
#别名
alias #查看别名
alias lm='ls -al | more' #别名
unalias lm #删除别名
#历史命令
history #历史指令
history 3 #最近3条指令
history -w #会将历史纪录写入 ~/.bash_history 当中!
!66 #执行第 66 笔指令
!! #执行上一个指令,本例中亦即 !66
!al #执行最近以 al 为开头的指令(上头列出的第 67 个)
#standard output 与standard error output
1. 标准输入 (stdin) :代码为 0 ,使用 < 或 `<<` ;
2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
find /home -name .bashrc > list_right 2> list_error #将 stdout 与 stderr 分存到不同的文件去
find /home -name .bashrc 2> /dev/null #,将错误的数据丢弃,屏幕上显示正确的数据
cat > catfile #:利用 cat 指令来建立一个文件,键盘输入文件
cat > catfile < ~/.bashrc #复制bashrc
cat > catfile `<<` "eof" #输入这关键词,立刻就结束而不需要输入 [ctrl]+d
# ; , &&, ||
sync; sync; shutdown -h now #同行指令用分号(;) 来隔开
cmd1 && cmd2
#1. 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。
#1. 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。
cmd1 || cmd2
#1. 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。
#2. 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。
ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe #/tmp/abc 是否存在,但就是要建立 /tmp/abc/hehe 文件
#管线
前面一个指令产生的信息,交给后面的指令处理。
echo ${PATH} | cut -d ':' -f 5 #是以『 : 』作为分隔,第5个的信息
last | grep 'root' #有出现 root 的那一行就取出来;
last | grep -v 'root' #没有 root 的就取出
#排序
cat /etc/passwd | sort #以第一个字母进行排序
cat /etc/passwd | sort -t ':' -k 3 #以第三栏来排序
#去除重复
last | cut -d ' ' -f1 | sort | uniq #last 将账号列出,仅取出账号栏,进行排序后仅取出一位
last | cut -d ' ' -f1 | sort | uniq -c #统计每个人的登入总次数
#统计字数行列
cat /etc/man_db.conf | wc #『行、字数、字符数』
#分流
last | tee last.list | cut -d " " -f1 #last 的输出存一份到 last.list 文件中
ls -l / | tee -a ~/homefile | more #tee 后接的文件会被覆盖,若加上 -a 这个选项则能将讯息累加。
#字符转换命令
#tr
last | tr '[a-z]' '[A-Z]'#所有的小写变成大写字符:
cat /etc/passwd | tr -d ':' #将冒号 (:) 删除
#col
cat /etc/man_db.conf | col -x | cat -A | more #[tab] 按键会被取代成为空格键,
#join
head -n 3 /etc/passwd /etc/shadow #两个文件前后排在一起
join -t ':' /etc/passwd /etc/shadow | head -n 3 #第一字段相同者整合成一列,不同部分排在相同行
#paste
paste /etc/passwd /etc/shadow #将 /etc/passwd 与 /etc/shadow 同一行贴在一起
expand [tab] 按键转成空格键啦
cat -A #显示特殊字符
#文件切分
cd /tmp; split -b 300k /etc/services services #六百多K的文件,若想要分成 300K 一个文件,以xxxaa, xxxab, xxxac 等方式来建立小文件的
cat services* >> servicesback #将上面的三个小文件合成一个文件,档名为 servicesback
变量
echo $PATH #查看,$后为变量
echo ${PATH}
myname=VBird #自定义变量
PATH="$PATH":/home/bin 或 PATH=${PATH}:/home/bin #增加变量
export xxx #临时设置环境变量
unset myname #取消变量
规则:
『=』紧贴
不能数字开头
『""』一定是字符串
『''』内引用变量可输出
通常大写
()内先执行
#环境变量
env #所有环境变量
l
set #观察所有变量(含环境变量与自定义变量)
PS1='[\u@\h \w \A #\#]\$ ' # 修改显示的内容 [root@VM-8-4-centos ~ 20:14 #52]
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' #默认
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' #全路径
#键盘读入
read -p "Please keyin your name: " -t 30 named #提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容
#变量类型
declare -i sum=100+300+50 #让变量 sum 进行 100+300+50 的加总结果
declare -x sum #将 sum 变成环境变量
declare -r sum #让 sum 变成只读属性,不可更动!
#数组
var[1]="small min"
var[2]="big min"
var[3]="nice min"
echo "${var[1]}, ${var[2]}, ${var[3]}"
#限制资源
ulimit
#删除
path=${PATH}
echo ${path#/*local/bin:} #代表要被删除的部分,由于 # 代表由前面开始删除,所以这里便由开始的 / 写起。