Linux下shell编程基础知识
1、history 记录历史命令;
预设记录1000条命令,存储在用户家目录 .bash_history 文件中;
!! 执行上一条命令
!n n为数字,history里面显示的指令数字
!cat 执行最近一次以cat开头的命令
!$ 上一条命令的最后一个参数
man builtin 可以查询系统内置的所有命令;
2、指令和文件名补全
Tab键 连续按2次列出所有的指令或文件名;
3、别名alias
自定义别名,把很长的经常使用的命令别名一个简单的命令
[root@linuxidc ~]# alias yong="cat /etc/sysconfig/network-scripts/ifcfg-eth0"
[root@linuxidc ~]# yong
DEVICE=eth0
HWADDR=00:0C:29:43:3D:32
TYPE=Ethernet
UUID=0b1f4512-cefa-4a9e-ae85-adb2ac2a9903
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.20.20
NETMASK=255.255.255.0
GATEWAY=192.168.20.2
unalias 解除别名
别名永久生效的话,把命令写入到当前用户家目录 .bashrc里面;只对当前用户生效。
4、通配符
* 代表零个或多个任意字符
? 代表1个任意字符
5、输入输出重定向
输出重定向 >
把前面的输出不显示在当前屏幕上,输出到指定文件里面;
追加重定向 >> 把内容追加到文件里面;
输入重定向 < 把后面的文件作为前面命令的输入;
2> 错误重定向(写脚本的时候会用到)
2>> 错误追加重定向
[root@localhost ~]# ls -l /dev/stdin
lrwxrwxrwx. 1 root root 15 4月 6 11:04 /dev/stdin -> /proc/self/fd/0
[root@localhost ~]# ls -l /dev/stdout
lrwxrwxrwx. 1 root root 15 4月 6 11:04 /dev/stdout -> /proc/self/fd/1
[root@localhost ~]# ls -l /dev/stderr
lrwxrwxrwx. 1 root root 15 4月 6 11:04 /dev/stderr -> /proc/self/fd/2
标准输入设备stdin用0表示;键盘;
标准输出设备 stdout用1表示,显示器显示;
标准输出错误 stderr用2表示,显示器显示;
示例:直接ls 会在当前屏幕显示出来,正确和错误的信息;
[root@localhost ~]# ls /etc/passwd /etc/passwd1
ls: 无法访问/etc/passwd1: 没有那个文件或目录
/etc/passwd
[root@localhost ~]# ls /etc/passwd /etc/passwd1 >1.log 2>&1
[root@localhost ~]# cat 1.log
ls: 无法访问/etc/passwd1: 没有那个文件或目录
/etc/passwd
正确输出1默认可以不用写,直接重定向到1.log里面,2代表错误输出,重定向到&1代表前面的1.log;有时候也可以>>追加到日志;
[root@localhost ~]# ls /etc/passwd /etc/passwd1
&>all.log
[root@localhost ~]# cat all.log
ls: 无法访问/etc/passwd1: 没有那个文件或目录
/etc/passwd
&表示所有,包括正确输出1和错误输出2,输出重定向到all.log里面;
6、管道符 |
把前面命令的输出结果作为后面命令的输入
[root@linuxidc ~]# cat /etc/passwd | wc -l
25
7、作业控制
当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c)
jobs 可以查看被暂停或在后台运行的任务
[root@linuxidc ~]# vmstat 1 > /tmp/1.log
^Z
[1]- Stopped vi file
[2]+ Stopped vmstat 1 > /tmp/1.log
[root@linuxidc ~]# jobs
[1]- Stopped vi file
[2]+ Stopped vmstat 1 > /tmp/1.log
[root@linuxidc ~]# bg 2
[2]+ vmstat 1 > /tmp/1.log &
[root@linuxidc ~]# jobs
[1]+ Stopped vi file
[2]- Running vmstat 1 > /tmp/1.log &
想要让进程在后台运行的话加 &,中间有空格,进程就在后台运行了。
vmstat 1 用来观察系统状态的一个命令。
fg 2 让后台运行的进程回到当前运行,ctrl+c 可以终止进程。
+号显示的为优先级最高。
另一种情况,关闭当前shell,重新打开另一个shell,使用jobs并不会显示在后台运行的进程。想要停止进程的话,需要知道pid,然后使用kill命令杀死进程。如遇到杀不死的进程,使用 kill -9 pid
[root@linuxidc ~]# ps aux | grep vmstat
root 1909 0.0 0.1 2016 548 pts/0 S 15:03 0:00 vmstat 1
root 1941 0.0 0.1 4356 732 pts/0 S+ 15:08 0:00 grep vmstat
[root@linuxidc ~]# kill 1909
8、变量,就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。
env 可以查看系统预设的所有环境变量;
set 可以列出系统预设的全部变量,包括用户自己设定的变量;
自定义变量 变量名=变量内容
自定义变量只在当前shell下生效;bash命令打开一个新的shell,变量就不会生效,退出新shell后,回到当前shell,变量继续生效;
[root@linuxidc ~]# ABC=CentOS
[root@linuxidc ~]# echo $ABC
centos
[root@linuxidc ~]# bash
[root@linuxidc ~]# echo $ABC
[root@linuxidc ~]# exit
exit
[root@linuxidc ~]# echo $ABC
centos
变量永久生效的方法:
1)系统下所有用户登录都可以使用该变量
在/etc/profile 配置文件中最后一行,添加"export myname=linuxidc",然后执行source /etc/profile 生效;source命令的作用是,将目前设定的配置刷新,即不用注销再登录也能生效。
[root@linuxidc ~]# echo "export myname=linuxidc" >> /etc/profile
[root@linuxidc ~]# source /etc/profile
[root@linuxidc ~]# su - user1
[user1@linuxidc ~]$ echo $myname
linuxidc
2)只在当前用户下使用变量
在用户的家目录下 .bashrc 配置文件,添加"export myname=linuxidc",然后执行source .bashrc 生效;
[user1@linuxidc ~]$ pwd/home/user1
[user1@linuxidc ~]$ echo "export myname=linuxidc" >> .bashrc
[user1@linuxidc ~]$ source .bashrc
[user1@linuxidc ~]$ echo $myname
linuxidc
自定义变量的规则
1、设定变量的格式“变量名=变量内容”等号两边不能有空格
2、变量名只能由英文、数字及下划线组成,而且不能以数字开头;
3、当变量内容带有特殊字符(空格 $),需要加单引号;
[root@linuxidc ~]# ABC='linux centos'
[root@linuxidc ~]# echo $ABC
linux centos
如变量内容中本身有单引号,需要加双引号;
[root@linuxidc ~]# ABC="Linux'"
[root@linuxidc ~]# echo $ABC
Linux'
4、如果变量内容需要引用其他运行结果,需要使用反引号
[root@linuxidc ~]# ABC=`pwd`
[root@linuxidc ~]# echo $ABC
/root
5、变量内容可以累加其他变量的内容,需要加双引号。
[root@linuxidc ~]# AA="Angle"
[root@linuxidc ~]# echo $AA
Angle
[root@linuxidc ~]# AB="$AA"BB
[root@linuxidc ~]# echo $AB
AngleBB
单引号和双引号的区别,用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用。
9、pstree 以树状图显示当前系统的进程
当前shell下运行bash命令后,会进入一个新的shell,新shell为之前shell的子shell;
[root@linuxidc ~]# pstree | grep bash
|-login---bash
|-sshd---sshd---bash-+-grep
[root@linuxidc ~]# bash
[root@linuxidc ~]# pstree | grep bash
|-login---bash
|-sshd---sshd---bash---bash-+-grep
在父shell中设定一个变量后,进入子shell后变量不会生效;需要在子shell中生效要用exprot指令;export 声明全局变量,让该shell的子shell也知道;如果export后面不加任何变量名,则它会声明所有的变量。
[root@linuxidc ~]# echo $AA
Angle
[root@linuxidc ~]# bash
[root@linuxidc ~]# echo $AA
[root@linuxidc ~]# exit
exit
[root@linuxidc ~]# export AA
[root@linuxidc ~]# bash
[root@linuxidc ~]# echo $AA
Angle
10、取消变量 unset 变量名
[root@linuxidc ~]# AB="Angle BB"
[root@linuxidc ~]# echo $AB
Angle BB
[root@linuxidc ~]# unset AB
[root@linuxidc ~]# echo $AB
系统环境变量与个人环境变量的配置文件
/etc/profile 系统预设的几个重要的变量,例如PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
/etc/bashrc 预设umask以及PS1等变量。PS1就是我们登录linux 命令行最前面显示的字符;
\u 用户users
\h 主机名hostname
\W 当前目录pwd
\$ 系统用户为#,普通用户显示$
[root@linuxidc ~]# echo $PS1[\u@\h \W]\$
[root@localhost ~]# PS1='[\h@\u \W]\$'
[localhost@root ~]#
更改PS1的显示;
每个用户的主目录下还有几个这样的隐藏文件:
.bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
.bashrc :该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。
.bash_history :记录命令历史用的。
.bash_logout :当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。
Linux shell中的特殊字符
* 代表零个或多个任意字符
? 代表一个任意字符
# 代表注释说明的意思,#号后面的内容忽略掉;
\ 脱意字符,将后面的特殊字符(* $)还原为普通字符;
| 管道符,讲前面命令执行的结果作为后面命令的输入;
$ 引用变量
; 分隔2个命令,2个命令都执行,不管前面命令是否错误 ls a.txt ; cat a.txt
& 把命令放到后台运行
&& 命令的连接符,第一个执行成功才会执行第二个;
|| 分隔命令,只有前面命令运行不成功,才会执行后面的命令;
cut 截取某一个字段、字符
-d 指定分隔符,分割字符用单引号 ' ' 括起来
-f 指定第哪个区间
-c 指定第几个字符;指定多个字符 -c 1,5 ;可以指定一个区间 -c 1-4 ;
列出以:号分隔列出第7列的内容,只显示前3行;
[root@localhost ~]# cut -d: -f 7 passwd | head -3
/bin/bash
/sbin/nologin
/sbin/nologin
[root@linuxidc ~]# head -3 passwd |cut -c 1-4
root
bin:
daem
sort 排序输出 默认按首字母升序的顺序排列;
-t 指定分隔符
-k 指定以哪个区间进行排序
-r 逆序排列
-u 删除重复的
-n 按照数字大小排序
-f 忽略大小写
按:号分隔,按第3列uid排序;
[root@localhost ~]# sort -t: -n -k 3 passwd |head -3
root:x:0:0:root:/root:/bin/bash
ROOT:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
wc 统计行数、单词数、字节数
wc -l 统计行数
wc -w 统计单词数
wc -c 统计字符数(wc -m 一样的功能)
[root@linuxidc ~]# wc -l /etc/passwd
24 /etc/passwd
[root@linuxidc ~]# wc -w /etc/passwd
32 /etc/passwd
[root@linuxidc ~]# wc -c /etc/passwd
1041 /etc/passwd
[root@linuxidc ~]# wc /etc/passwd
24 32 1041 /etc/passwd
uniq 去除重复的行
针对数字的话,需要先进行sort排序,再去除重复的行。
-c 统计重复的行数,并写在最前面;
[root@linuxidc tmp]# uniq 1.txt
111
222
111
333
[root@linuxidc tmp]# sort 1.txt | uniq -c
2 111
1 222
1 333
[root@linuxidc tmp]# sort test.txt |uniq -c
2 12345
1 67899
2 abc
1 helloworld
tee 重定向文件,并且同时还在屏幕上显示;
类似与重定向 “>”, 但是比重定向多了一个功能,在把文件写入后面所跟的文件中的同时,还显示在屏幕上。
12 [root@linuxidc ~]# echo 'abcdefg' | tee test.txt
abcdefg
tr 替换字符
常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号;
-d 删除某个字符
把小写字母变成大写字母
123 [root@linuxidc ~]# head -2 passwd | tr '[a-z]' '[A-Z]'
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
替换一个字符
[root@linuxidc ~]# head -2 passwd | tr 'r' 'R'
Root:x:0:0:Root:/Root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
split 切割文档
-b 依据大小来分割文档,单位为byte
-l 依据行数来分割文档。
示例一,按b大小分割
[root@linuxidc ~]# ls -lb passwd
-rw-r--r--. 1 root root 1076 Apr 9 15:14 passwd
[root@linuxidc ~]# split -b 500 passwd
[root@linuxidc ~]# ls -l
-rw-r--r--. 1 root root 500 Apr 9 15:17 xaa
-rw-r--r--. 1 root root 500 Apr 9 15:17 xab
-rw-r--r--. 1 root root 76 Apr 9 15:17 xac
示例二,按l行数分割
[root@linuxidc ~]# cat passwd |wc -l
24
[root@linuxidc ~]# split -l 8 passwd
[root@linuxidc ~]# wc -l xa*
8 xaa
8 xab
8 xac
24 total