Lupinus

Re:从零开始的go学习生活(`・ω・´)

0%

[人机交互接口]

Bash 初识

Bash Shell是Linux的命令解释器,主要复杂用户程序与内核系统进行交互操作的一种接口,将用户输入的命令翻译给内核,由内核驱动硬件,最终将处理后的结果输出值Bash Shell屏幕中终端

image-20220320213559585

Bash的作用

1)文件管理

2)权限管理

3)用户管理

4)磁盘管理

5)网络管理

6)软件管理

7)应用管理

如何使用bash

  • 执行命令
    • 效率低,适合平时简单的工作
  • 执行脚本
    • 效率高,适合比较复杂繁琐的工作

创建100个用户,单纯输入命令需要100次,而使用shell脚本则可以轻松解决

1
2
3
4
5
6
7
8
[root@web	~]# cat useradd.sh
#!/usr/bin/bash
#批量创建脚本
for i in {1..100}
do
useradd alice-$i
echo "alice-$i" is create ok..
done

命令提示符

1
2
3
4
5
6
7
8
9
10
11
12
[root@roger ~]# 
[]:没有任何作用,只是为了分割
root:当前登录系统的用户
@:没有任何作用,为了分割用户和主机名
localhost:当前短格式的主机名
~:当前所在的工作目录
~特殊意义:任何系统的用户,都有自己的家目录,当前登录用户的家目录

超级管理员用户的家目录是:/root
普通用户的家目录是:/home/用户名
#:超级管理员的提示符
$:普通用户的提示符

image-20220320213853972

PS1的常用参数以及含义

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :完整的主机名称
\h :仅取主机名中的第一个名字
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称
\v :BASH的版本信息
\w :完整的工作目录名称
\W :利用basename取得工作目录名称,只显示最后一个目录名
\# :下达的第几个命令
\$ :提示字符,如果是root用户,提示符为 # ,普通用户则为 $
  
#颜色
字体/背景
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色

#修改配置文件.bashrc
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\[\e[35;40m\]\h\[\e[0m\] \ [\e[36;40m\]\w\[\e[0m\]]\\$ "

#修改主机名的命令
hostnamectl set-hostname 主机名

vim /etc/profiel.d/PS1.sh
_set_prompt () {
_last_exit_code=$? # Must come first!
C_EC='\[\e[1;37m\]'$(printf '%3s' ${_last_exit_code})'\[\e[0m\]'

#todo: set encoding to UTF-8 !
FancyX='\342\234\227' # ✗ ✘
Checkmark='\342\234\223' # ✓ ✔
C_Fail='\[\e[1;31m\]'${FancyX}'\[\e[0m\]'
C_Ok='\[\e[32m\]'${Checkmark}'\[\e[0m\]'
C_Time='\[\e[2;37m\]''\t''\[\e[0m\]'

C_NormalUser='\[\e[2;33m\]''\u''\[\e[0m\]'
C_RootUser='\[\e[1;35m\]''\u''\[\e[0m\]'

if [ $(uname -s) == "Darwin" ]; then
_ip_addr=$(ipconfig getifaddr $(netstat -nr | awk '{ if ($1 ~/default/) { print $6} }'))
elif [ $(uname -s) == "Linux" ]; then
# may print $(NF-2)
#_ip_addr=$(ip route | awk '/ src / {print $NF}' | head -1 )
_ip_addr=$(ip route | grep -oP '(?<=src )[0-9.]+' | tail -1 )
fi

C_Host='\[\e[1;33m\]'$(hostname -A | awk '{print $1}')'\[\e[0m\]','\[\e[4;32m\]'${_ip_addr:-\h}'\[\e[0m\]'
C_Pwd='\[\e[36m\]''\w''\[\e[0m\]'
C_Marker='\[\e[1;37m\]''\$''\[\e[0m\]'

git diff --exit-code --quiet HEAD >/dev/null 2>&1
_git_diff_exit_code=$?
if [ ${_git_diff_exit_code} -eq 1 ]; then
C_Marker='\[\e[101m\]'*'\[\e[0m\]'" ${C_Marker}"
elif [ ${_git_diff_exit_code} -eq 0 ]; then
C_Marker='\[\e[102m\]'='\[\e[0m\]'" ${C_Marker}"
fi


# Add a bright white exit status for the last command
PS1="$C_EC "

# If it was successful, print a green check mark.
# Otherwise, print a red X.
if [[ ${_last_exit_code} -eq 0 ]]; then
PS1+="$C_Ok "
else
PS1+="$C_Fail "
fi

# print HH:ii:ss
PS1+="$C_Time "

# If root, just print the host in red. Otherwise,
# print the current user and host in green.
if [[ $EUID -eq 0 ]]; then
PS1+="${C_RootUser}@${C_Host}:"
else
PS1+="${C_NormalUser}@${C_Host}:"
fi

# Print the working directory and prompt marker
PS1+="$C_Pwd $C_Marker "
}
PROMPT_COMMAND='_set_prompt'

Bash特性

基础语法

在语法中,中括号是可有可无的意思

命令 选项 参数
command [options] [arguments]

查看目录ls

选项 说明
-l 长格式显示详细信息
-a 显示所有文件,包括隐藏文件
-d 当遇到目录时列出目录本身而非目录内的文件
-h 显示文件大小,KB
-i 查看该文件的inode号
-F 在条目中追加指示符’/‘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#语法
ls [options] [文件名]

#示例
[root@web ~]# ls //命令
[root@web ~]# ls -l //命令+选项
[root@web ~]# ls -l /home/ //命令+选项+参数
#命令:整条shell命令的主体
#选项:用于调节命令的具体功能
- 以'-'引导段个事选项(单个字符),例如”-a“
- 以'--'引导长格式选项(多个字符),例如”--all“
- 多个短格式选项可以卸载一起,只用一个”-“引导,例如”-la“
#参数:命令操作的对象,如文件、目录名等

ps:命令必须开头,选项和参数位置可以发生变化
命令、选项、参数需要有空格隔开

命令补全

当使用windows查找一个目录层级特别多的文件时,打开的效率会非常的慢,但如果使用linux查找一个目录层级特别多的文件时,可以通过tab键快速补全

1
2
3
4
5
6
7
8
9
10
11
12
13
#查看本机IP,忘记了具体命令
[root@web ~]# ifc
ifcfg ifconfig
#按下tab键会自动补全
[root@web ~]# ifconfig

#按一下tab没有反应,那么需要按两下tab键,列出所有if开头的命令
[root@db04 ~]# if
if ifcfg ifconfig ifdown ifenslave ifnames ifrename iftop ifup

#Linux目录比较深,经常会使用tab键进行补全,如果路径出错是没有办法补全的
[root@web ~]# ls /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth0

如果无法补全选项,那么需要安装一个扩展包

1
[root@db04 ~]# yum install -y bash-completion

帮助文档

1
2
3
4
5
#获取ls命令的帮助
[root@web ~]# ls --help
用法:ls [选项]... [文件]...

[root@db04 ~]# man ls

Linux命令手册

命令快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Ctrl + a    #光标跳转至正在输入的命令行的首部
Ctrl + e #光标跳转至正在输入的命令行的尾部
Ctrl + w #按照空格来删除bash内容
Ctrl + c #终止前台运行的程序
Ctrl + d #在shell中,ctrl-d表示退出当前shell。(logout、exit)
Ctrl + z #将任务暂停,挂至后台
Ctrl + l #清屏,和clear命令等效。
Ctrl + k #删除从光标到行末的所有字符
Ctrl + u #删除从光标到行首的所有字符
Ctrl + r #搜索历史命令, 利用关键字
Ctrl + 左右 #按照单词快速跳转光标(Xshell提供的)
ESC + . #获取最后的指令

ps:在命令行前加面加 "#" 则该命令不会被执行

历史命令

历史命令的作用:追溯之前的发生情况,在企业中,十分重要,涉及到运维的责任,记录历史命令对于运维人员来说,也有一个专业名词:审计

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
31
32
history 
-c:clear 清除历史命令
-d:delete 删除指定编号的历史命令
-w:write 保存历史命令到一个文件中(将历史命令保存到家目录下的.bash_history 隐藏文件中)

#查看最后10条历史记录
[root@web ~]# history 10

#清空历史记录
[root@db04 ~]# history -c

#指定一条历史记录删除
[root@web ~]# history -d 110

#保存历史命令
[root@web ~]# history -w
/root/.bash_history

!+命令的一部分:执行上一条,含有该命令一部分的命令内容 (常用)
!!:执行上一条命令
!+数字:执行历史命令中编号所在命令内容

#执行上一条命令
[root@web ~]# !!

#执行上一条ls相关命令
[root@web ~]# !ls
ls /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth0

#执行历史命令中的第74条命令
[root@db04 ~]# !74

命令的别名

命令别名将用户经常使用的复杂命令简单化,创建属于自己的命令别名

1
2
3
4
5
6
7
8
9
10
11
#设置别名 
alias 别名="完整的命令"
[root@web ~]# alias wk='ifconfig'
[root@web ~]# wk

#取消别名
unalias 别名
[root@web ~]# unalias ifconfig

#永久生效 /root/.bashrc
[root@web ~]# echo "alias ifconfig='ifconfig eth0'" >> /root/.bashrc

‘ ‘与” “

1
2
3
4
5
6
7
8
' ':所见即所得
" ":涉及变量

[root@client ~]# name='roger'
[root@client ~]# echo '$name'
$name
[root@client ~]# echo "$name"
roger