1、中介模型:硬件、kernel、使用者:
3、/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 预备的 shell)
/bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容亍 bash)
/bin/tcsh (整合的 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所取代)
/bin/zsh (基亍 ksh 发展出来的,功能更强大的 shell)
4、命令编修能力history:能记忆使用过的指令,被放在家目录的.bash_history;
注意:~/.bash_history记录的是前一次登入以前所执行过的指令,而本次的则暂存在内存,需注销系统后才会被记录。(黑客入侵,若指令与系统有关,其直接输入MySQL的密码在指令列上面)
5、tab:命令与档案补全;
6、命令别名设定功能:alias
如:alias lm=‘ls -al’ 这样以后只输入lm就相当于在使用ls -al;
7、工作控制、前景与背景控制;
8、程序化脚本:shell scripts;
9、通配符:*
如 ls /usr/bin/ABC*
10、Bash shell的内建命令:type 可查看指令是来自内建还是外部
man bash 查看bash的说明文件,很重要
type [-tpa] name (t显示意义如file外部指令,alias别名,builtin内建指令;p外部则显示完整名;将含有name的指令都列出);
例: type ls
type -t ls
type -a ls
type cd
11、环境变量:用来读入系统中,系统需要这些变量提供数据的存取。如PATH、HOME、MAIL、SHELL等。
12、变量的取用与设定:echo
变量取用前需要用【$】的符号;
例:echo $variable
echo $PATH
echo ${PATH}
echo ${HOME}
echo $myname
myname=Shawn
echo $myname
13、变量设定规则:
a、变量=两边不能有空格,C语言则可;
b、开头不能是数字;
c、变量需空格,则用"",可保留原本特性,''为纯文本;
d、反单引号指令【`】(1左边键),在【`】之内的指令会被先执行;
e、扩增变量用“$+变量名”:【PATH="$PATH":/home/bin】;
f、变量变成环境变量(才可在其他子程序执行):【export PATH】;
g、取消变量:【unset myname】
例:
name=Shawn\'s \name (反斜杠\跳脱特殊字符,可忽略单引号和空格)
name="$name"yes
name=${name}yes
例:设定变量用在下个shell中
name=Shawn
export name
bash
echo $name
exit
概念:父程序(当前程序)——子程序(启用另一个程序)——父程序的自定义变量无法再子程序中
应用,需要加上export,从变量改为环境变量。
14、取得核心版本信息指令:uname -r
name=Shawn
echo $name
myname="$name its me" 此处的$name相当于是C语言中的%s
echo $myname
myname='$name it's me'
echo $myname
设定常用变量目录,避免出错,和减少每次输入时间
例:work="/cluster/server/work/xiamen_2016/11/6"
cd $work
15、选用的变量赋值方式:version=${uname -r}
不选用: version=`uname -r` 因为【`】容易看错。
16、shell默认的环境变量查询:env和export
TERM 终端使用的环境类型
SHELL 当前环境下,使用的Shell是哪一个程序
HISTSIZE 记录命令笔数,默认为1000
MAIL 用户取用的mailbox位置,使用mail,系统将读取邮件信箱档案mailbox
PATH 执行文件指令搜寻路径
LANG 语系
RANDOM 随机随机数,默认0-32767,就是/dev/random这个档案
PWD 工作目录
HOME 家目录
_=/bin/env 上次使用指令的最后一个参数
例:生成随机0-9的数值,declare -i number=$RANDOM*10/32768;echo $number
知识点:declare (为宣告数值类型)
17、set:观察所有变量(含环境变量与自定义变量)
a、PS1 提示字符的设定
符号意义:
o \d :可显示出『星期 月 日』癿日期格式,如:"Mon Feb 2"
o \H :完整的主机名。丼例杢说,鸟哥的练习机为『www.vbird.tsai』
o \h :仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略
o \t :显示时间,为 24 小时格式癿『HH:MM:SS』
o \T :显示时间,为 12 小时格式癿『HH:MM:SS』
o \A :显示时间,为 24 小时格式癿『HH:MM』
o \@ :显示时间,为 12 小时格式癿『am/pm』样式
o \u :目前使用者的账号名称,如『root』;
o \v :BASH 的版本信息,如鸟哥癿测试主板本为 3.2.25(1),仅取『3.2』显示
o \w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
o \W :刟用 basename 凼数叏得工作目录名称,所以仅会列出最后一个目录名。
o \# :下达得第几个指令。
o \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~
例:PS1='[\u@\h \w \A #\#]\$'
b、$:本shell的PID,即线程代号
例:显示线程代号 echo $$
c、?:指上一个执行指令所传回的值,执行成功传回0,否则为【错误代码】,即非0数值。
d、OSTYPE,HOSTTYPE,MACHTYPE:主机硬件与核心的等级
e、export:自定义变量转成环境变量
父程序与子程序概念:第一个bash父程序,触发子程序,原父程序睡着;
子程序需要exit或logout将其结束掉方可回到父程序;
理解模型:实线虚线图形
f、影响显示结果的语系变量(locale):
locale -a
locale
语系档案位置: /usr/lib/locale/
整体系统默认的语系定义位置:/etc/sysconfig/i18n 执行结果表明没有?
big5:大五码
utf8:万国码 若从windows将文档转到Linux上出现乱码,可更改大便干的软件编码。
18、变量的有效范围:
环境编程=全局变量global;(类似C语言的定义)
自定义变量=局部变量local
问题核心:内存配置的关系
19、变量键盘读取、数组与宣告:read、array、declare
a、read [-pt] varible 提示字符/等待秒数
例1:read atest
Hello World
echo $atest
Hello World
例2:read -p "Please keyin your name:" -t 30 named
20、declare [-aixr] variable a数组/i整型/x变成环境变量/r只读设定
bash对变量的基本定义:A、默认为字符串,所以需要指定变量类型;
B、bash环境的数值运算,预设最多仅能达到整数形态。
例1:sum环境变量:
declare -x sum
export |grep sum
例2:只读:declare -r sum
例3:将sum变成非环境变量的自定义变量
declare +x sum 将-变为+,可进行取消动作
declare -p sum 单独列出变量类型
数组变量类型:
数组的设定方式:
var[index]=content
例:var[1]="small min"
var[2]="bing min"
var[3]="nice min"
echo "${var[1]},${var[2]},${var[3]}"
21、与文件系统及程序的限制关系:ulimit
ulimit [-SHacdfltu] 配额 S严格/H警告/a列出所有限额/c错误写成档案/f最大档容/d最大断裂内存容量/l锁定内存量/t最大CPU时间/单用户最大程序数量
例1:ulimit -a
ulimit -f 10240 仅能建立10MB容量档案
dd if=/dev/zero of=123 bs=1M count=20 结果会失败,因为超过了设置限度。
注意:一般身份,只能继续减小档案容量,而不能增加容量,若要管控ulimit,可用pam。
22、变量内容的删除、取代与替换:
删除目录范围:从【/】到【:】之间
#: 最短那个;
##: 最长那个。
%: 最后面开始删除
%%: 只留第一个目录
例:先用path自定义变量设定与PATH相同
path=${PATH}
echo $path
echo ${path#/*local/bin:} 删除从左边开始到/bin的内容
echo ${path#/*:} #从前面开始删
echo ${path##/*:} 仅剩最后一个
echo ${path%:*bin}
echo ${path%%:*bin}
例:有变量MAIL,位置在/var/spool/mail/root,欲删掉仅剩/root
echo ${MAIL##/*/}
若仅删/root
echo ${MAIL%/*}
取代:
echo ${path/sbin/SBIN} 两/间为旧,后面为新
echo ${path//sbin/SBIN} 所有符合的内容都将被取代
变量的测试与内容替换:new_var=${old_var-content}
例1:判断变量username是否存在,若不存在给予内容root。
echo $username
username=${username-root}
echo $username
username="Shawn"
username=${username-root}
echo $username
例2:user未设定或为空字符串,将其设定为root。
username=""
username=${username-root} 【-】后面接关键字
echo $username
username=${username:-root} 加上【:】后若变量内容为空或未设定,后面内容将替换
echo $username
23、命令别名设定:alias,unalias
例:简化命令
alias lm='ls -al | more' 相当于lm代替了后面的指令
查看目前的指令别名:
alias
移出指令:
unlias
DOS时期指令表示:清屏、列出目录档案,
alias cls='clear'
alias dir='ls -l'
24、历史命令:history
history [n] n笔指令
history [-C] 清除所有histfiles,
history [-raw] histfiles r将读到的写入记忆/增入histfiles,若无则写入~/.base_history/记忆写入histfiles,强行写入
例1:history
history 5
history -w
echo $HISTSIZE
例2:
history
假设出现:10 manrm
11 alias
执行命令:!10 执行第10行指令
!! 执行上一个指令
!al 执行最近以al开头的指令
25、无法记录时间的问题:
可以透过~/.bash_logout进行history的纪录,并加上date的时间参数
26、指令搜寻顺序:
1. 以相对/绝对路径执行指令,例如『 /bin/ls 』或『 ./ls 』;
2. 由 alias 找到该指令来执行;
3. 由 bash 内建的(builtin) 指令来执行;
4. 透过 $PATH 这个发量癿顺序搜寻到的第一个指令来执行。
例:alias echo='echo -n'
type -a echo
27、进站与欢迎信息:
cat /etc/issue
更改:vim /etc/issue
CentOS release 5.3 (Final) (terminal: \l)
Date: \d \t Kernel \r on an \m
Shawn Welcome to you!
远程登录程序中用/etc/issue.net
告知登录者信息:
vim /etc/motd
Hello everyone, Our server will be maintained at 2009/02/28 0:00 ~ 24:00.
Please don't login server at that time. ^_^
28、bash的环境配置文件
需分清login shell 与non-login shell
login shell只读的两个配置文件:
a、/etc/profile 系统整体设定,勿改为好;
可被呼叫的数据:
/etc/inputrc
/etc/profile.d/*.sh
/etc/sysconfig/i18n
b、~/.bash_profile 或~/.bash_login 或~/.profile 个人设定(三选一,且依次读)
读入环境配置文件指令:source
source 配置文件档名
例:将配置文件读进shell环境中,更改后可不注销,直接读取
source ~/.bashrc
. ~/.bashrc 此两行指令相同
/etc/bashrc定义以下数据:
依据不同的 UID 规范出 umask 的值;
依据不同 UID 规范出提示字符 (就是 PS1 发量);
呼叫 /etc/profile.d/*.sh 的设定。
例:cat ~/.bashrc 显示预设内容。
若~/.bashrc被误删的问题:
复制/etc/skel/.bashrc到家目录,修订内容,并使用source呼叫~/.bashrc
~/.bashrc(non-login shell)
此时,bash配置文件仅会读~/.bashrc
例:cat ~/.bashrc 显示预设内容
/etc/bashrc 定义的数据:
a、依据不同的 UID 规范出 umask的值;
b、依据不同的 UID 规范出提示字符 (就是 PS1 发量);
c、呼叫 /etc/profile.d/*.sh 的设定。
29、其他配置:
/etc/man.config 规定了当下达man时,该去何处查看数据的路径设定,核心MANPATH变量设定
如以talball安装时,就需要将/usr/local/softpackage/man放到/etc/man.config
注意:SuSE则用/etc/manpath.config 可用[tab]进行文件名补齐
~/.bash_history 保存历史记录
~/.bash_logout: 注销bash后,系统继续做什么才离开
30、终端机的环境设定:stty与set
stty [-a] 将目前所有的stty参数列出来
重要的代表意义:
eof 结束输入
erase 向后删除字符
intr 送出中断到run
kill 删除目前指令列上所有文字
quit 送出quit到run
start 重启output
stop 停止输出
susp 送出一个terminal stop给run
例:stty erase ^h 表示用ctrl+[h]代替原来的删除字符erase
set [-uvCHhmBx] u显示错误信息/v显示原始内容/v指令内容/h与历史命令有关/H同上/m与工作管理有关/B与[]作用有关/C如使用>,档案存在则不被覆盖
例:显示目前所有的set设定值:
echo $-
set -u
echo $Shawn
set -x
echo $HOME
cat /etc/inputrc
cat /DIR_COLORS*
cat /etc/termcap
bash默认的组合键如下图:
31、通配符与特殊符号:
利用通配符配合ls找档案:
例:LANG=C 设定语系
ll -d /etc/cron* 加d显示目录
ll -d /etc/Shawn 找出Shawn的文件名
ll -d /etc/*[0-9] 找出含数字文件名
ll -d /etc/[^a-z]* 找出开头非小写字母文件名
cp -a /etc/[^a-z]* /tmp 将上题找到的档案复制到/tmp
特殊符号:
32、数据流重导向:将数据传导到其他地方去;
传送所用特殊字符:
a、标准输入: 代码——0 < << 原本键盘输入改用档案内容取代/结束输入字符
b、标准输出: 代码——1 > >> (>覆盖/>>累加)
c、标准错误输出: 代码——2 2> 2>>
档案建立方式:不存在,则系统自动建立;存在则先清空再写入;>输出将覆盖。
例:将stdout与stderr分存到不同的档案去
find /home -name .bashrc > list_right 2> list_error
33、/dev/null垃圾桶黑洞装置与特殊写法:
find /home -name .bashrc 2> /dev/null 丢弃错误数据,显示正确数据
find /home -name .bashrc list 2>&1
例1:用cat指令来建立一个档案的简单流程:
cat > catfile
abcd
test
ctrl+[d]
cat > catfile
例2:用 stdin 取代键盘的输入以建立新档案的简单流程:
cat >catfile < ~/.bashrc
ll catfile ~/.bashrc
例3:cat > catfile << "eof"
34、命令执行判断依据:;,&&,||
1、分号;:连续下指令 如 cmd;cmd
2、command1 && command2 || command3 后两个需方肯定可以执行成功的指令
35、管线命令(pipe):|
每个管线后面接的第一个数据必定是指令!且能接受标准输入数据!
攫取命令:cut,grep 它是一行一行分析
cut -d 分隔符 -f fields 【cut主要用途:同一行里面的数据分解】
cut -c 字符区间
例1:echo $PAHT
echo $PATH | cut -d ':' -f 3,5
例2:export
export | cut -c 12- 取第12字符后的所有字符
last 输出【账号/终端机/来源/日期时间】
例3:last | cut -d '' -f 1
grep [-acinv] [--color=auto] '搜寻字符串' filename 【分析一行信息】 a文本搜寻/c次数/i忽略大小写/n输出行/v反选/关键字加颜色
例1:last | grep 'root' 取出有出现root那行
例2:last | grep -v 'root' 与上相反
例3:last | grep 'root' | cut -d '' -f1 有root就取出,仅取第一栏
例4:grep --color='MANPATH' /etc/man.config 取出后面档案含MANPATH的那些行
36、排序命令:sort、wc、uniq
a、sort [-fbMnrtuk] [file or stdin] f忽略大小写/b最前面忽略空格符/M月份排序/n纯数字/r反向/u相同数据仅一行/t分隔符,预设[tab]/k以区间排序
需先让语系统一: LANG=C
例1:cat /etc/passwd | sort 以a开设排序
例2:cat /etc/passwd | sort -t ':' -k 3 以第三栏排序
例3:cat /etc/passwd | sort -t ':' -k 3 n 数字排序
例4:last | cut -d '' -f1 | sort 取出账号,加以排序
b、uniq [-ic] i忽略大小写/c进行计数
例1:last | cut -d '' -f1 | sort | uniq
last | cut -d '' -f1 | sort | uniq -c 每个人登录总次数 结果不对?
c、wc [-lwm] l仅列出行/w列字/m字符
例1:cat /etc/man.config |wc 显示行、字数、字符数
last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l 计算登入总人次(但后两行非账号内容) 第一个grep排除空行,第二个grep排除wtmp,再来计算行数即可。
37、双向重导向:tee [-a] file a累加 将数据放入file中
(相当于一个显示屏幕,一个存入档案)
例1:last | tee last.list | cut -d " " -f1
ls -l /home | tee ~/homefile | more
ls -l / | tee -a ~/homefile | more 没有-a则会被覆盖哦
38、字符转换命令:tr,col,join,paste,expand
1、tr [-ds] SET1 ... d删除字符串/s取代重复字符
例1:last | tr '[a-z]' '[A-Z]' 所有小写变大写(‘’可用可不用)
cat /etc/passwd | tr -d ':' 删除冒号
例2:cp etc/passwd /root/passwd && unix2dos /root/passwd unix2dos不存在?
file /etc/passwd /root/passwd
cat /root/passwd | tr -d '\r' > /root/passwd.linux \r指DOS断行符
ll /etc/passwd /root/passwd*
2、col [-xb] x将tab转成对等空格键/b反斜杠时保留最后字符
例1:cat -A /etc/man.config cat -A显示所有特殊案件
cat /etc/man.config | col -x | cat -A | more
例2:man col > /root/col.man 将col转成纯文本
vi /root/col.man 为何结果不一样呢?
man col | col -b > /root/col.man
3、join [-ti12] file1 file2 t相同档案联成一行/i忽略大小写/1第一档案用那字段分析/2第二档案同上
功能:主要用于处理相关文件,注意需先对档案进行排序sort处理!
例:head -n 3 /etc/passwd /etc/shadow
join -t ':' -1 4 /etc/passwd -2 3 /etc/group
4、paste [-d] file1 file2 d接分隔符/若file写成-,表示来自标准输入的资料!
例:paste /etc/passwd /etc/shadow 同一行贴在一起,中间以[tab]隔开
cat /etc/passwd | paste /etc/passwd /etc/shadow - | head -n 3 读出,贴上,取前三行
5、expand [-t] file t后接数字 功能:将 [tab] 键转成空格键
例:grep '^MANPATH' | /etc/man.config | head -n 3 取出行首,其标志为^。
grep '^MANPATH' | /etc/man.config | head -n 3 | cat -A (cat可将所有符号列出)
grep '^MANPATH' | /etc/man.config | head -n 3 | \
expand -t 6 - | cat -A 将[tab]设定成6个字符
6、分割命令 split [-bl] file PREFIX b分割成的档案大小/l行数分割/前导符
例:cd /tmp;split -b 300k /etc/termcap termcap
ll -k termcap*
cat termcap* >> termcapback 用数据流重导向,将分割的档案合并为一个
ls -al / | split - | 10 - lsroot 每10行记录成一个档案
wc -l | lsroot*
备注:Windows下难以操作档案分割
7、参数代换: xargs [-0epn] command 0有特殊字符/e结束/p执行前询问/n次数
功能:在产生某个指令的参数,读入stdin的数据,将其分隔成参数
cut -d':' -f1 /etc/passwd | head -n 3 | xargs finger 没有finger目录?
cut -d':' -f1 /etc/passwd | head -n 3 | xargs -p finger 询问?可回复y
cut -d':' -f1 /etc/passwd | head -n 3 | xargs -p -e'lp' finger
注意:要善用xargs,多参详manxargs,因为很多指令本身不支持管线。
39、关于减号-的用途:
tar -cvf - /home | tar -xvf - -表示取用前一个指令stdout
40、回顾:
1、核心在内存中受保护,需shell才可与之沟通,才能实现kernel控制硬件工作;
2、Linux很多控制以shell来撰写的。
3、系统合法的shell,均在/etc/shellz档案中。
参考:
参考数据不延伸阅读
注1:Webmin 癿官方网站:http://www.webmin.com/
注2:关亍 shell 癿相关历史可以参考网络农夫兄所整理癿优秀文章。网络农夫兄所建置癿网站暂时关闭, 因此底下癿链接为鸟哥刡网络上找刡癿片段文章连结。若有任何侵权事宜,请杢信告知,谢谢: http://linux.vbird.org/linux_basic/0320bash/csh/
注3:使用 man bash,再以 PS1 为关键词去查询,按下数次 n 往后查询后,可以得到 PS1 癿发量说明。
注4:i18n 是由一些 Linux distribution 贡献者共同収起癿大型计划,目癿在亍讥众多癿 Linux distributions 能够有良好癿万国码 (Unicode) 诧系癿支援。详绅的数据可以参考: i18n 的官方网站:http://www.openi18n.org/ 康桥大学 Dr Markus Kuhn 的文献:http://www.cl.cam.ac.uk/~mgk25/unicode.html Debian 社群所写癿文件:http://www.debian.org/doc/manuals/intro-i18n/
卧龙小三癿教学文件:http://linux.tnc.edu.tw/techdoc/shell/book1.html
GNU 计划癿 BASH 说明:http://www.gnu.org/manual/bash-2.05a/html_mono/bashref.html 鸟哥癿备份:http://linux.vbird.org/linux_basic/0320bash/0320bash_reference.php