鸟哥私房菜第十章

一、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        
                      
20200411日 星期六 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        
                      
20200412日 星期日 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 413 19:40 ./file1
-rw-r--r-- 1 liyiheng liyiheng     0 413 19:39 ./file{1
-rw-r--r-- 1 liyiheng liyiheng     0 413 19:40 ./file2
-rw-r--r-- 1 liyiheng liyiheng     0 413 19:40 ./file3
-rw-r--r-- 1 liyiheng liyiheng     0 413 19:40 ./file4
-rw-r--r-- 1 liyiheng liyiheng     0 413 19:40 ./file5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值