一、shell
1.什么是shell
shell是转移器(翻译器),将我们敲的命令翻译成CPU看的懂的语言,CPU完成之后,再通过shell翻译成我们能看懂的语言。
2.shell的使用
①需要一块软件连接shell,在Linux里用终端连接(终端是人与shell的桥梁)。我这个电脑的shell有:
liyiheng@liyiheng-PC:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/usr/bin/dash
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
在Linux中,默认使用的shell是/bin/bash
liyiheng@liyiheng-PC:~$ which ls
/usr/bin/ls
当用which命令查看时,如果是在/bin/下,则查看的东西是通过其他安装包下载的,不是shell安装的。
liyiheng@liyiheng-PC:~$ type cd
cd 是 shell 内建
liyiheng@liyiheng-PC:~$ type ls
ls 是 `ls --color=auto' 的别名
这说明cd是shell自带的命令,而ls不是。
②在同一行要执行多个命令,用;隔开
liyiheng@liyiheng-PC:~$ cal ; date
四月 2020
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
2020年 04月 11日 星期六 11:15:38 CST
③如果命令太长,则可以输入\和回车两个命令:
liyiheng@liyiheng-PC:~$ xxxxxxxxxxxxxxxxx\
> yyyyyyyyyyyyyy
这时,系统会自动认为这两行是一行命令。
二、shell的变量功能
1.本地变量:变量名=值
①变量名可以由数字,字母,_组成,但不能以数字开头
②=两边不能有空格,(变量名 = 值) 就是错的,如果值内有空格,用“ ”把值括起来,“ 值”
liyiheng@liyiheng-PC:~$ xx=19
liyiheng@liyiheng-PC:~$ echo $xx
19
liyiheng@liyiheng-PC:~$ echo xx
xx
调用变量时,前面加一个$
取消变量:
liyiheng@liyiheng-PC:~$ unset xx
liyiheng@liyiheng-PC:~$ echo $xx
③本地变量只能影响当前shell,不能对子shell起影响。
liyiheng@liyiheng-PC:~$ xx=20
liyiheng@liyiheng-PC:~$ echo $$
13201
liyiheng@liyiheng-PC:~$ bash
liyiheng@liyiheng-PC:~$ echo $$
16768
liyiheng@liyiheng-PC:~$ echo $xx
2.环境变量:export命令
liyiheng@liyiheng-PC:~$ export yy=10
环境变量会影响到所有的子shell
liyiheng@liyiheng-PC:~$ export yy=10
liyiheng@liyiheng-PC:~$ echo $$
13201
liyiheng@liyiheng-PC:~$ echo $yy
10
liyiheng@liyiheng-PC:~$ bash
liyiheng@liyiheng-PC:~$ echo $$
17324
liyiheng@liyiheng-PC:~$ echo $yy
10
3.如何查看变量:set命令
查看环境变量:env命令,export,export -p命令
declare也可以定义环境变量
liyiheng@liyiheng-PC:~$ declare -x zz=10
liyiheng@liyiheng-PC:~$ export
declare -x NO_AT_BRIDGE="1"
declare -x OLDPWD
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
declare -x PWD="/home/liyiheng"
declare -x QT4_IM_MODULE="fcitx"
declare -x QT_DBL_CLICK_DIST="22"
declare -x QT_IM_MODULE="fcitx"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_AUTH_SOCK="/run/user/1000/keyring/ssh"
declare -x TERM="xterm-256color"
declare -x USER="liyiheng"
declare -x VTE_VERSION="5201"
declare -x XAUTHORITY="/home/liyiheng/.Xauthority"
declare -x XDG_CURRENT_DESKTOP="Deepin"
declare -x XDG_GREETER_DATA_DIR="/var/lib/lightdm/data/liyiheng"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SEAT_PATH="/org/freedesktop/DisplayManager/Seat0"
declare -x XDG_SESSION_DESKTOP="deepin"
declare -x XDG_SESSION_ID="2"
declare -x XDG_SESSION_PATH="/org/freedesktop/DisplayManager/Session0"
declare -x XDG_SESSION_TYPE="x11"
declare -x XDG_VTNR="1"
declare -x XMODIFIERS="@im=fcitx"
declare -x yy="10"
liyiheng@liyiheng-PC:~$ declare +x yy
declare -x NO_AT_BRIDGE="1"
declare -x OLDPWD
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
declare -x PWD="/home/liyiheng"
declare -x QT4_IM_MODULE="fcitx"
declare -x QT_DBL_CLICK_DIST="22"
declare -x QT_IM_MODULE="fcitx"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_AUTH_SOCK="/run/user/1000/keyring/ssh"
declare -x TERM="xterm-256color"
declare -x USER="liyiheng"
declare -x VTE_VERSION="5201"
declare -x XAUTHORITY="/home/liyiheng/.Xauthority"
declare -x XDG_CURRENT_DESKTOP="Deepin"
declare -x XDG_GREETER_DATA_DIR="/var/lib/lightdm/data/liyiheng"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SEAT_PATH="/org/freedesktop/DisplayManager/Seat0"
declare -x XDG_SESSION_DESKTOP="deepin"
declare -x XDG_SESSION_ID="2"
declare -x XDG_SESSION_PATH="/org/freedesktop/DisplayManager/Session0"
declare -x XDG_SESSION_TYPE="x11"
declare -x XDG_VTNR="1"
declare -x XMODIFIERS="@im=fcitx"
yy被去除
4.位置变量
liyiheng@liyiheng-PC:~$ set 3 1 2 3 4 5 6 a b c d e
liyiheng@liyiheng-PC:~$ echo $1
3
liyiheng@liyiheng-PC:~$ echo $10
30
liyiheng@liyiheng-PC:~$ echo ${10}
c
如果不加{},则系统认为先进行$1,为3,再将0赋到3后面,结果为30,所以当是两位数以上是,避免歧义,加上{},结果才正确
位置变量:
liyiheng@liyiheng-PC:~$ echo $0
/bin/bash
liyiheng@liyiheng-PC:~$ echo $1
3
liyiheng@liyiheng-PC:~$ echo $#
12
liyiheng@liyiheng-PC:~$ echo $*
3 1 2 3 4 5 6 a b c d e
5.locale 查看系统编码
liyiheng@liyiheng-PC:~$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
三、变量键盘读取、数组与声明:read array declare
1.read
root@liyiheng-PC:/home/liyiheng# read xx
99999
root@liyiheng-PC:/home/liyiheng# echo $xx
99999
如果read后没有东西,那么系统将默认把输入的东西赋给REPLY
#!/bin/bash
#echo "请输入你的名字"
read -p "请输入你的名字" name
echo "欢迎你$name"/*shell脚本*/
root@liyiheng-PC:/home/liyiheng# ./xx.sh
请输入你的名字lyh
欢迎你lyh
2.array
①定义数组
root@liyiheng-PC:/home/liyiheng# xx=(a b c d)
②查看数组
root@liyiheng-PC:/home/liyiheng# echo ${xx[0]}
a
@或*可以查看数组内所有的内容
root@liyiheng-PC:/home/liyiheng# echo ${xx[@]}
a b c d
root@liyiheng-PC:/home/liyiheng# echo ${xx[*]}
a b c d
查看所有的下标,在数组名前加!
root@liyiheng-PC:/home/liyiheng# echo ${!xx[*]}
0 1 2 3
查看有几个元素,在数组名前加#
root@liyiheng-PC:/home/liyiheng# echo ${#xx[*]}
4
3.declare
①定义环境变量
root@liyiheng-PC:/home/liyiheng# declare -r a=2
root@liyiheng-PC:/home/liyiheng# a=3
bash: a: 只读变量
readonly也可以设置只读变量
②双引号正常,单引号什么都没有
root@liyiheng-PC:/home/liyiheng# xx=10
root@liyiheng-PC:/home/liyiheng# echo $xx
10
root@liyiheng-PC:/home/liyiheng# echo "$xx"
1
root@liyiheng-PC:/home/liyiheng# echo '$xx'
$xx
命令嵌套命令:
root@liyiheng-PC:/home/liyiheng# echo "xxxxxxxxx `hostname` xxxxxxxxxxxx"
xxxxxxxxx liyiheng-PC xxxxxxxxxxxx
4
liyiheng@liyiheng-PC:~$ r=${xx-"aa"}
liyiheng@liyiheng-PC:~$ echo $r
aa
第一行意思为:判断是否存在xx,若存在,将xx的值赋给r,若不存在,将aa赋给r
liyiheng@liyiheng-PC:~$ r=${xx:-"bb"}
liyiheng@liyiheng-PC:~$ xx=
liyiheng@liyiheng-PC:~$ echo $r
bb
第一行的意思为:
①判断是否存在xx,若存在,将xx的值赋给r,若不存在,将bb赋给r
②xx存在但xx值为空,则把bb赋给r
liyiheng@liyiheng-PC:~$ r=${xx:="cc"}
liyiheng@liyiheng-PC:~$ echo $r
cc
liyiheng@liyiheng-PC:~$ echo ${xx}
cc
第一行意思为:
①判断是否存在xx,若存在,将xx的值赋给r,若不存在,将cc赋给r,同时将cc赋给xx
②xx存在但xx值为空,则把cc赋给r,同时将cc赋给xx
liyiheng@liyiheng-PC:~$ r=${xx:?"cc"}
bash: xx: cc
在:后加?,如果xx没有定义或者xx值为空,则显示警告
liyiheng@liyiheng-PC:~$ xx=10
liyiheng@liyiheng-PC:~$ r=${xx:+"cc"}
liyiheng@liyiheng-PC:~$ echo $r
cc
意思为:如果xx定义且不为空,则把cc赋给r;如果xx不存在或者值为空,赋值失败
5、alias命令:给其他命令其别名
alias aa=" ××××"
××××为别名
取消别名:unalias ××××
6.history命令
liyiheng@liyiheng-PC:~$history
1501 echo $path
1502 unset path
1503 r=${xx-"aa"}
1504 echo xx
1505 echo $xx
1506 echo $r
1507 r=${xx:-"bb"}
1508 xx=
1509 $r
1510 echo $r
1511 unset xx
1512 echo $r
1513 r=${xx:="cc"}
1514 echo $r
1515 echo ${xx}
1516 xx=
1517 r=${xx:="cc"}
1518 echo $r
1519 echo ${xx}
1520 xx=10
1521 echo ${xx}
1522 echo $r
1523 r=${xx:="cc"}
1524 echo $r
1525 unset xx
1526 r=${xx:?"cc"}
1527 r=${xx:+"cc"}
liyiheng@liyiheng-PC:~$ !1314
gcc my_ls.c
gcc: error: my_ls.c: 没有那个文件或目录
gcc: fatal error: no input files
compilation terminated.
!1314调用1314行的历史命令
清除历史命令:history -c
四、bash的登录与欢迎信息
1.登录前修改信息:vim /etc/issue
2.登录后修改信息:vim /etc/motd
五、set命令
1.显示未定义的变量(set -u开启警告功能,set +u关闭功能)
liyiheng@liyiheng-PC:~$ set -u
liyiheng@liyiheng-PC:~$ echo $w
bash: w: 未绑定的变量
2.set -x开启跟踪功能,set +x关闭
写脚本排错时常用
liyiheng@liyiheng-PC:~$ set -x
liyiheng@liyiheng-PC:~$ ls
+ ls --color=auto
六、通配符
1.[a-z]:匹配a到z,26个字母
[a-z]:匹配 a,-,z三个字符
2.字符要求:
第一个必须是字母,第二个必须是数字,第三个任意,第四个不能是数字
[a-z][0-9]?[!0-9]
3.通配符可以帮助寻找文件
liyiheng@liyiheng-PC:~$ touch 1234.mp3 a24ehu.mp3 7ah2u.mp3
liyiheng@liyiheng-PC:~$ ls [a-z][0-9]?[!0-9]*.mp3
a24ehu.mp3
找出符合通配符规则的文件
七、将输出输入到指定文件里(>来完成)
liyiheng@liyiheng-PC:~$ cal > yy.txt
liyiheng@liyiheng-PC:~$ cat yy.txt
四月 2020
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
如果yy.txt原来就存在,那么一个>会将把原来yy.txt里的内容覆盖,保存新的内容;而两个>>会追加到原来的内容后面,原来内容还存在。>只重定向正确的,2>只重定向错误的,&>都重定向
八、命令执行的判断依据:; && ||
1.执行多个命令使用’ ; ’
命令1;命令2
两个命令互不影响,相互独立
liyiheng@liyiheng-PC:~$ cal ; date
四月 2020
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
2020年 04月 12日 星期日 15:49:54 CST
执行命令有错误的,有正确的,系统有一个记录命令是否正确的空间,且每次只记录上一个命令的正确性,上一个命令以前的都将覆盖
liyiheng@liyiheng-PC:~$ cal
四月 2020
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
liyiheng@liyiheng-PC:~$ echo $?
0
liyiheng@liyiheng-PC:~$ xxxxx
bash: xxxxx: 未找到命令
liyiheng@liyiheng-PC:~$ echo $?
127
liyiheng@liyiheng-PC:~$ echo $?
0
如果输入的命令正确,则记录0;否则记录非0的值
2.命令1&&命令2
当命令1执行成功时,才会执行命令2,否则不执行命令2
如果命令1执行成功,命令2执行失败,只显示命令1的结果
3.命令1||命令2
当命令1执行成功时,命令2不会再执行,命令1执行错误,命令2才执行
九、管道命令(pipe)
1.命令1 | 命令2 | 命令3 |…命令n
命令1的值作为参数,传递给命令2,命令2执行,所得结果作为参数,传递给命令3,以此类推
2.命令1 | tee xx,可将命令1所执行的内容保存在xx里
tee -a:追加内容
十、选取命令
1.cut:
①-d:指明分割符 ②-f:查看指明第几部分
liyiheng@liyiheng-PC:/etc$ cut -d: -f1 /etc/passwd
root
daemon
bin
sys
sync
games
③last:显示登录信息
liyiheng@liyiheng-PC:~$ last
liyiheng tty1 :0 Sun Apr 12 21:30 still logged in
reboot system boot 4.15.0-30deepin- Mon Apr 13 05:30 still running
liyiheng tty1 :0 Sun Apr 12208:52 - 17:27 (08:34)
reboot system boot 4.15.0-30deepin- Sun Apr 12 16:51 - 17:27 (00:35)
④管道与cut结合
liyiheng@liyiheng-PC:~$ last | cut -d ' ' -f1
liyiheng
reboot
liyiheng
reboot
liyiheng
2.grep
①起过滤作用
②用法:grep 关键字 filename --color;grep -i忽略大小写
grep -in:显示行号;grep -inv:排除含有关键字的行
从filename这个文件中,找出所有带关键字的行,并以明显颜色显示出来
grep -A3 关键字 filename -n --color:将关键字的下面三行显示出来;B3 将关键字的上面三行显示出来
十一、排序命令
1.sort命令:排序
liyiheng@liyiheng-PC:~$ cut -d: -f3 passwd | sort
0
1
10
100
1000
101
102
103
104
105
106
107
108
109
①.数字不是按数字对待,而是以普通字符对待,因此排序完成
比较规则:从左往右 例如1000与101,先比较最左边,1=1,再比较第二个,0=0,再比较第三个,1>0,所以101>1000,101在1000下面
②如果想按照数字进行比较,则在sort后加 -n
liyiheng@liyiheng-PC:~$ cut -d: -f3 passwd | sort -n
0
1
2
3
4
5
6
7
8
9
10
13
33
34
38
39
41
③反向排序
liyiheng@liyiheng-PC:~$ cut -d: -f3 passwd | sort -n -r
65534
1000
999
116
115
114
113
112
111
110
④直接排序
liyiheng@liyiheng-PC:~$ sort -t: -k3 -n passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
-t指明分割符,-k指明分割部分,-n按照数字顺序排序
⑤sort -u排除重复的行,-c显示重复多少次
⑥wc命令:
liyiheng@liyiheng-PC:~$ wc hsh.c
34 30 392 hsh.c
34:行号 30:单词数 392:字符数
⑦统计文件夹有多少个文件或目录
liyiheng@liyiheng-PC:~$ ls -1 | wc -l
38
38个文件
十二、字符转换命令
1.tr命令
①
liyiheng@liyiheng-PC:~$ cat hosts
127.0.0.1 localhost
127.0.1.1 liyiheng-PC
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
liyiheng@liyiheng-PC:~$ tr 'a-z' 'A-Z' < hosts
127.0.0.1 LOCALHOST
127.0.1.1 LIYIHENG-PC
# THE FOLLOWING LINES ARE DESIRABLE FOR IPV6 CAPABLE HOSTS
::1 IP6-LOCALHOST IP6-LOOPBACK
FE00::0 IP6-LOCALNET
FF00::0 IP6-MCASTPREFIX
FF02::1 IP6-ALLNODES
FF02::2 IP6-ALLROUTERS
可将小写变成大写,但是没有改变原文件
改变原文件:
liyiheng@liyiheng-PC:~$ tr 'a-z' 'A-Z' < hosts > xxx
liyiheng@liyiheng-PC:~$ mv xxx hosts
分两步走
②删除符号
liyiheng@liyiheng-PC:~$ cat passwd | tr -d ';'
举例为删除’;’
2.col命令与expand命令
两者都可以将Tab键转换为空格(cat -A查看)
3.paste命令与join命令
①paste:粘贴作用,与cut相对应
liyiheng@liyiheng-PC:~$ cat aa bb
12345678
sdfghjkl
liyiheng@liyiheng-PC:~$ paste aa bb
12345678 sdfghjkl
原文件不改变
②join:粘贴作用,但是相同内容不粘贴,与paste不同
join -t " : " aa bb指明粘贴符
只有aa、bb里有相同文件时,才可以粘贴,否则不行
十三、切割命令:split
将大文件分割成小文件
liyiheng@liyiheng-PC:~$ split -b 10k passwd xx
将passwd分割,每个10K,以xx开头
十四、参数代换:xargs
liyiheng@liyiheng-PC:~$ find -name 'file*' | xargs ls -l
-rw-r--r-- 1 liyiheng liyiheng 0 4月 13 19:40 ./file1
-rw-r--r-- 1 liyiheng liyiheng 0 4月 13 19:39 ./file{1
-rw-r--r-- 1 liyiheng liyiheng 0 4月 13 19:40 ./file2
-rw-r--r-- 1 liyiheng liyiheng 0 4月 13 19:40 ./file3
-rw-r--r-- 1 liyiheng liyiheng 0 4月 13 19:40 ./file4
-rw-r--r-- 1 liyiheng liyiheng 0 4月 13 19:40 ./file5