1.认识shell
①shell的功能只是一个提供用户操作系统的一个接口,shell可以理解为转移器,在linux中,打开一个终端,并不代表打开了一个
shell,只是表示终端会连接到shell。
②cat /etc/shell 可以查看目前可以使用的linux,如bash,sh,csh,ksh等等。每个sh都会有些区别,目前学习以bsh为重点。
如果想切换sh,则可以直接输入csh或者ksh即可切换。
③bash shell的功能有很多,比如命令记忆功能,设置别名(alias lm=‘ls -al’)等。
④查询命令是否为bash shell的内置命令:type -t 命令名称
alias:表示该命令为命令别名所设置的名称。
builtin:表示该命令为bash内置的命令。
⑤命令一行输入不完,可以使用\回车进行转义,下一行会生成>,说明自己转义,系统当成同一行。
2.shell的变量
①变量的显示与设置
如:xx=10 变量的定义
echo $xx引用变量(变量的引用正规的写法,应该是echo ${xx},如果不加$,会直接输出字符串,而非变量)
unset 取消变量
②变量的设置规则
----变量名称的开不能是数字
----等号两边不能有空格
③环境变量(全局变量)
设置环境变量的方法:export aa 取消的方法:
export bb=1 declare +x aa
declare -x cc=2
dd=4;declare -x dd
echo $$ 可以显示shell的id号,新开一个sh后,id号会变动。
④位置变量
脚本例子说明:vim xx.sh
#!/bin/bash
echo “这个程序的第名称是:$0”($0表示文件名)
echo “这个程序的第1个参数是:$1”
echo “这个程序的第2个参数是:$2”
echo “这个程序的第3个参数是:$3”
echo “这个程序一共有$#($0表示参数的个数)个参数;分别是:$*($*表示所有参数的显示)”
则,输入:chomd +x xx.sh(增加一个可执行的权限)
./xx.sh aa bb cc,
就会输出:这个程序的名称是:xx.sh
这个程序的第1个参数是:aa
这个程序的第2个参数是:bb
这个程序的第3个参数是:cc
这个程序的一共有3个参数,分别是:aa bb cc
⑤单引号,双引号,反单引号(` `)的意义
----单引号:无法解析变量内容,只是把$变量当成普通字符输出。
----双引号:可以解析变量的内容,可以把$变量的内容输出。
----反单引号:在一串命令中,反单引号的内容可以被先执行。如:ls -l `locate crontab`(命令嵌套命令情况下)
为区别单引号,可ls -l $(locate crontab)这样表示
3.环境变量的功能
①查看变量:env(查看环境变量)set(查看所有变量,包括环境变量和自定义变量)
②一些主要的环境变量
----HOME :cd~
----HISTSIZE:由echo $HISTFILESIZE来决定
----LANG 语系:echo $LANG(如果有乱码,可试着把utf8改为gb2312)
----PS1:提示符
----PS2:转义字符的隔行符号
----$:PID.SHELL的线程代号,echo $$
----?:echo $?关于上个命令的回传代码(上个命令正确回传0,上个命令错误回传1)
4.变量的读取、数组与声明
①读取:read主要用于脚本设置
如:read xx (如果read后不加变量,会有一个read的默认变量REPLY)
输入:9999
echo $ xx 则显示:9999
脚本案例:
#!/bin/bash
echo "请输入您的名字:"
read name
echo “欢迎您$name”
②变量的声明:declare 变量名
-i 整型
-x 设为环境变量 +x 取消设置的环境变量
-r 设置为只读(同 readonly xx一样)
③数组:array(标准写法为¥{数组},以免出现问题)
如:xx=(aa bb cc dd)(数组的下表从0-3)
echo ${xx[*或@]} 可查看所有的元素
echo ${!xx[*或@]} 可查看所有的下标
echo ${#xx[@]} 可查看数组的个数
4.变量内容的删除、替代与替换
①变量内容的删除:
echo ${变量名#删除的关键字},如:echo ${path#/*bin}(#代表从前到后删除最短的到bin这个关键字的,*表示前面是什么无所谓)
echo ${变量名##删除的关键字},代表从前到后删除最长的到关键字的
echo ${变量名%删除的关键字},代表从后到前删除最短的到关键字的
echo ${变量名%%删除的关键字},代表从后到前删除最长的到关键字的
②变量内容的简单替换
echo{变量/旧字符串/新字符串} 若变量内容符合旧字符串,则第一个旧字符串会被新字符串替换
echo{变量//旧字符串/新字符串} 若变量内容符合旧字符串,则第全部旧字符串会被新字符串替换
③变量的测试和内容的替换
“-号”只能判断变量知否存在
unset xx xx=10 xx= (空)(空与unset是2个概念)
r=${xx-"aaaa"} r=${xx-"aaaa"} r=${xx-"aaaa"} (为空就会把空值
echo $r 则输出aaaa echo $r 则输出10 echo $r 则输出 (空) 传输出来)
“:-”判断变量是否存在,并判断是否为空
unset xx xx=10 xx= (空)(空与unset是2个概念)
r=${xx:-"bbbb"} r=${xx:-"bbbb"} r=${xx:-"bbbb"}
echo $r 则输出bbbb echo $r 则输出10 echo $r 则输出 bbbb (即使为空,也可以用-
但 echo $xx 输出还是为空 后面的内容替换设置)
“:=”为空会替换原值xx= (空)
r=${xx:-"cccc"}
echo $r 则输出cccc
echo $xx 则输出cccc(与:-区别)
“:+”为空会替换原值
----有定义(非空值):就会传输后面的内容
----无定义(空值):就不会会传输后面的内容
“:?”为空会替换原值
----有定义(非空值):就会显示定义的值
----无定义(空值):就会显示?后面的内容
5.命令别名与历史命令
alisa rm=‘rm -r’
unalisa rm
6.历史命令
history 最多1000条最近执行的命令
$HISTFILESIZE 绝对1000
history -c 清空历史命令
7.bash shell的操作环节
①命令再执行时,命令的执行顺序
如:type -a echo
首先是执行:别名
然后再执行:shell的内置命令
再再执行:系统命令
②bash登陆与欢迎信息(/etc/issue登录前;/etc/motd欢迎信息;/etc/issue.net:telnet登陆的信息)
③bash环境配置文件
----登陆设置全局环境
/etc/profile
/etc/inputrc
/ect/profile.d/*.sh
----登陆设置个人配置文件
~/.bash_profile
④快捷键的定义:stty -a
⑤终端机的设置 set
-----set -u (开启变量未设置提示功能)如果定以后,一旦变量无定义,则就会输出错误提示(+u关闭此功能)
-----set -x (开启显示命令内容++开头)
⑥通配符
----*任意字符(0到多个)
----?一个字符
----[0-9]代表0到9
----[0\-9]代表0,-,9三个字符
----[^]代表非,[^0-9 ][ !0-9]
8.数据的重定向:可将原本输出在屏幕上的数据重新输出到其他地方(或者输入)
①输出重定向
----(1>)正确数据覆盖(1可写可不写)如:cal >xx(把cal的值输入在xx文件里,覆盖原xx内的原数据)
(1>>)正确数据累加(1可写可不写) 如: date>>xx(把date的值输入在xx文件里,追加不覆盖原xx内的原数据)
----(2>)错误数据覆盖,如:call 2>xx(call是个错误命令)
(2>>)错误数据累加 (2>;2>>无法执行正确的重定向)
----(&>)正确或者错误数据覆盖重定向
(&>>)正确或错误数据累加重定向
1>&2:正确的像错误的一样导入 如:cal 2>xx 1 >&2 2>&1:错误的像错正确的一样导入 如:call >xx 2>&1(常用)
②输入重定向
自行输入:this is testing
crlt+d离开
这个时候xx的内容就是刚才输入的。
cat>>xx>>EOF(以它结束的关键字)
自行输入:this is testing
EOF(输入这个关键字后,就会结束,就不用crlt+d)
③命令执行的判断依据
----;:cmd1;cmd2,:分号依次执行cmd1和cmd2
----$?(命令回传码):真=0,假=!0
----cmd1&&cmd2:cmd1为假(肯定为假),则over,不会继续执行cmd2
cmd1||cmd2:cmd1为真(肯定为真),则over,不会继续执行cmd2
9.管道命令(用管道连接多个命令)
cmd1 | cmd2 cmd1的结果是cmd2的参数
如:ls -al /etc | less 表示ls显示的结果通过管道传递给less来进行过滤(ls命令输出的内容可以被less读取)
①选取命令:cut grep
----cut -d'分隔符' -f'第几部分'(以分隔符为分割的第几部分):可以分析文件,如:cut -d :-f1 /etc/passwd
又如:last | cut -d '' -f1 ,可以查看登陆的用户名(last查看登陆信息)
----grep过滤筛选:如: ifconfig eth0 | grep 'inet addr',可以在ifconfig文件中筛选出带有inet addr的行并显示。
ifconfig eth0 | tee xx |grep 'inet addr'可先保存,再筛选,保存到xx中,会覆盖,相当于>;tee -a,则相当于>>
如:grep root passwd 在passwd中查找root这个关键字
-i:忽略大小写
-n:加行号
-color:关键字加颜色
-An:向下显示n行,包括过滤行。
-Bn:向上显示n行,包括过滤行。
②排序命令:sort,wc,uniq
----sort:cut -d:-f3 passwd | sort -n(-n以纯数字把passwd第三行进行排序,利用管道)
sort -t(分隔符):-k(第几部分)3 -n passwd(直接利用sort排序)
-n:使用纯数字进行排序
-u:就是uniq,相同的数据只出现一行代表一下
----uniq:等同于sort -u ,但是uniq有些自己的参数,如
-c:进行计数,比如显示登录名过滤后,可以显示这个登录名登录的个数,可以使用这个参数
----wc:字数统计 wc 文件名(会列出行数,字数,字符数)
ls -1 / |wc -l 可以统计一个文件夹内有多少文件目录(ls -1表示一行行显示文件目录)
③字符转换命令
----tr:转换或删除
如:tr 'a-z' 'A-Z'<hosts(把host内的内容以大写字母输出,不会改变源文件大小)
等同于 cat hosts | tr 'a-z' 'A-Z'
如果想改变源文件的内容:tr 'a-z' 'A-Z' <hosts<hosts(错误,不可这样写,会损害文件)
需要:tr 'a-z' 'A-Z' <hosts<xx;mv xx hosts(分两步走)
有如:cat passwd | tr -d ';'可删除passwd中所有的;
----col与expand:把tab转换为空格
如:cat /etc/man.config | col -x | cat -A | more
col -x :把tab转换为空格,等同于expand
cat -A:把tab的输出以^I显示,空格就是空格
----paste与join:将2个文件中的数据黏贴在一起
paste:直接粘,不会改变源文件,一般以tab分割,不考虑太多情况
join:比较严谨的黏贴,需要对比第一个字段的数据,如果第一个字段数据不对,则不会黏贴
按照设定规律结合:
join -t(指明分隔符)':' -1(第一个文件) 4(第4部分) /etc/passwd -2(第一个文件) 3 (第3部分) /etc/group
④切割命令:split 将大文件切割成小文件
如: split -b(指明每块大小) 300k /etc/termcap xx(以xx开头) 分割
cat xx* >>termcapback 组合
⑤参数替换:xargs :在不能使用管道的时候,可以加xargs,因为很多命令不支持管道
⑥关于-用途: tar -cvf - /home | tar -xvf -(直接打包,不写打包文件名,用-替代,直接传递到管道,也不管解压的是什么文件名)