shell有很多种,查看所有shell类型:cat /etc/shells
不同的用户使用不同的shell,这个取决于用户的配置,该配置在文件: /etc/passwd查看得知:root用户是使用bash这个shell,还有些隐藏用户使用的是/sbin/nologin这个特殊的shell,这个是不能登录的用户,如果把root的shell改为nologin,则root就不能登录了。
Linux的默认shell程序是bash,存放在/bin/bash。
bash的优点:
我们通常输入的命令可分为:
内部命令:系统启动的时候这些命令就会被调用内存,常住在内存中,所以执行效率很高
外部命令∶是系统软件的功能,不是bash提供的功能,在用户需要运行这些软件的时候,才现从硬盘上把程序文件调入内存中,执行
#单行注释,:<
type命令:可以检测那些命令是外部命令那些是内部命令,type的三种结果如下
ctrl+u删除光标前面的命令 ,ctrl+k删除光标后面的命令串
ctrl+a光标移动到命令串的最前面,ctrl+e光标移动到最后面
输入history查看历史命令,然后!编号,等于重新执行该命令,按!!是执行前一个命令
ctrl+L:清空屏幕,clear
ctrl+c:结束运行中的程序
ctrl+d:退出终端
变量在使用前必须加上$符号或${},使用echo可以读取变量
变量的设置规则:
使用env和export查看环境变量,用set查看所有变量包括自定义的变量,分别列出一些常见的环境变量:
子进程只会继承父进程的环境变量,不会继承父进程的自定义变量。
set -u 设置后,使用未声明的变量会提示出错
一、删除
var为变量名
如name=aaa.bbb.ccc.txt
$echo ${name#*.}:得到bbb.ccc.txt
$echo ${name##*.}:得到txt
echo ${name%.*}:得到aaa.bbb.ccc
echo ${name%%.*}:得到aaa
二、替换
var为变量名,
${var/v/r}:将v换成r,从左到右第一个
${var//v/r}:将所有的v换成r
读取用户从键盘上输入的变量。
read -p 请输入: -t 30 name
声明变量的类型:declare [-aixr] 变量名
上面的-都可以换成+,就是取消的意思
变量默认是字符串类型,如下需要把name变为int类型的,否则的话结果就是100+100+100
bash环境中数值运算默认只能整数形态,1/3=0;
declare和typeset具有相同功能
数组:
array=(1 2 3 4)同时赋多个值
[lxc@com ~]$ declare -a name
[lxc@com ~]$ name[1]=a
[lxc@com ~]$ name[2]=b
[lxc@com ~]$ read name[3]
c
[lxc@com ~]$ echo "${name[1]},${name[2]},${name[3]}"
a,b,c
如果直接echo $数组,返回的是下标0的值
上面的操作对字符串也有效:${#string}
echo `expr index "${name}" c` 计算字符串name中c的索引
限制用户的某些资源,包括开启的文件数量、可以使用的cpu时间片、可以使用的内存总量等
用法:ulimit [-SHacdfltu] [配额]
如果为0就是没有限制
前面提到的命名别名、变量、注销bash后都会失效,想要保留这些数据就需要写入配置文件才行。
login shell会读取/etc/profile和~/.bash_profile这两个配置文件。
/etc/profile会读取是系统的整体配置,包括会根据登录用户设置PATH、MAIL、HOSTNAME、umask等,/etc/profile中会调用/etc/profile.d/*.sh这些文件
~/.bash_profile的内容如下,增加了PATH的内容,增加了不同用户家目录下的两个文件,还调用了~/.bashrc文件,.的功能就等于source,都能立即读取配置文件
~/.bashrc内容如下
login shell的整体流程是:
non-login shell只会读取~/.bashrc(会间接调用/etc/bashrc),/etc/bashrc可以设置整体环境,如PS1、umask等。
其他得配置文件:
~/.bash_history:就是我bash命令的历史记录
~/.bash_logout:注销bash后,系统再帮我们做完什么操作后才离开
stty -a:将目前所有的stty按键与内容输出出来
如 stty erase ^h :按ctrl+h向后删除
通配符:
特殊符号:
数据流重定向是将某个命令执行后要出现在屏幕的数据,给他传输到其他地方。
stdout和stderr:
将本来要输出到屏幕的数据重定向到文件里,>是覆盖,>>是累加。
如ll / > ~/rootfile将/目录的数据都重定向到~/rootfile文件中,如果该文件不存在会新建一个,如果存在该文件,>会清空该文件,>>则不会。
2>或2>>是将错误的信息重定向,如find /home -name .bashrc > list_right 2> list_error,将正确的结果和错误的信息分别写入到list_right和list_error文件中、
/dev/null垃圾桶黑洞文件,可以吃掉任导向这个设备的信息,可以将错误信息导向这个文件。
如果想让正确和错误信息都写入同一个文件则使用如下两种特殊写法:
stdin:
将原本需要由键盘输入的数据,改用文件内容来替换。
如使用cat命令可以输入字符:
<<的意思是【结束的输入字符】,他并不是重定向文件,而是还是原来的键盘输入,如
最后的结果不包括eof。
;就是一次执行多个命令。
&&和||的判定依据就是上面说的?变量,如果上一次的命令执行成功$?为0,否则就是失败。
如ls -d tempdir && touch temdir/aaa.txt 表示tempdir这个目录存在才会建立aaa.txt文件
ls -d tempdir || mkdir tempdir 表示tempdir不存在就会创建tempdir目录
ls -d tempdir || mkdir tempdir && touch tempdir/aaa.txt 是不论如何都创建aaa.txt文件
如ls -al /etc | less:使用less插看ls命令得到的结果
管道命令【|】仅能处理经由前一个命令传来的正确数据,不能处理错误的信息。在每个管道后面接的第一个数据必定是命令,而且这个命令必须能够接收标准输入的数据才行,这样的命令称为管道命令。
所谓选取就是将得到的数据取出我们想要的数据,选取信息通常都是针对【一行一行】来分析的。
cut -d '分隔字符' -f 分隔出来的哪几段:以某一个字符为分隔,可以去出每一段的数据
cut -c 分隔区间:以字符为单位截取
如:
- [lxc@com ~]$ echo $PATH
- /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lxc/.local/bin:/home/lxc/bin
- [lxc@com ~]$ echo $PATH | cut -d ':' -f 2,5
- /bin:/usr/sbin
如:
export|cut -c 12-
不显示export得出的数据的前12个字符,因为12-后面省略的当做无穷
grep:
分析一行信息,如果有我们想要的就将该行拿出。
sort :以各种形式进行排序
uniq:排序完成后将重复的数据仅列出一个显示
wc:打印出数据的【行、字数、字符数】
可以将数据流分送到屏幕与文件。
-a:以累加的方式将数据加到文件当中
如 last | tee last.list
这样的话屏幕输出的内容也会保存到文件中
tr:删除一段信息中的文字,或者进行文字信息的替换 ,如tr [a-z] [A-Z] :小写转大写
col:
expand:也是将tab转为空格键,unexpand将空格键转为tab键
split [-bl] file PREFIX(划分的文件前缀名)
如spilt -b 300k /etc/services services,将该文件划分成多个300k的小文件,文件名为servicesaa,servicesab等
cat services* >> servicesback 将小文件又合成大文件
-号可以代替文件名
如tar -cvf - /home | tar -xvf - -C /tmp
产生某个命令的参数,适合不支持管道的命令。
xargs [-0epn] command
sed [-nefr] [操作]
操作说明 :[n1[,n2]] function
n1,n2代表选择进行操作的行数,如果省略则是全部行,其中[2,$]中$代表最后一行
sed后面的操作必须有单引号
function如下:
可以使用/ /开启匹配模式,如sed '/i am head/ahi' :i am head是文件某一行的开头,在这一行后面插入一个hi
+ | 重复一个或一个以上的前一个字符 |
? | 零个或一个的前一个字符 |
| | or |
( ) | 找出群组字符串,'g(la|oo)d' |
( )+ | 多个重复群组 |
printf
printf '打印格式' 实际内容
awk倾向于一行当中分成段来处理。
awk [options] '[BEGIN]条件类型1{操作1} 条件类型2{操作2}……[END]' filename
条件类型:
> 、< 、>=、 <= 、== 、!=
变量:
$0代表【一整行数据】,$1代表第一栏数据……
cat /etc/passwd |awk 'BEGIN{FS=":"} $3<10{print $1 "\t" $3}'
awk中可以使用循环如awk '{for(i=1;i<=NF;i++){res[$i]+=1}}END{for(k in res){print k" "res[k]} }' words.txt | sort -nr -k2