CLI
概念:CLI( Command-Line User Interface) 命令行界面,区别于GUI(Graphical User Interface) 图形化用户界面,运行在Shell脚本上,windows最常见的bash (git bash) ,mac中是zsh 。
写Shell的两种方式
bashrc
vim ~/.bashrc进入bashrc
# 编写bashrc的内容
fucntion hi(){
echo hello,world!
}
source ~/.bashrc- CLI中输入
hi,正常显示
注: ~./bashrc 中编辑的文件:
不需要加入$PATH
也不需要在其中调用函数
不需要使用#!/bin/bash作为前缀
定义脚本.sh
方式一
-
通过vim新建并打开文件hi
#!/bin/bash #编写内容 #方法1:直接写文件 echo hello,world! #方法2:写函数+调用 function sayHi(){ echo hello,world! } sayhi -
把当前路径加入PATH路径
echo $PATH //获取path路径现存地址 pwd //当前路径 # 方法1: export PATH="$PWD:$PATH" //当前路径加入PATH 输入脚本名称即可显示 # 方法2 ./hi //即可显示 /* ./hi hello,world! */ # 可能的错误:文件没有可执行权限 chmod +x hi //给该文件添加可执行权限注:以上command均只能在文件被加入$PATH的时候才有用
重新打开bash,之前被加入的PATH的路径不存在,需要重新加入
方式二
适用于#!/usr/bin/env bash
- ~/.bashrc中添加
export MSYS=winsymlinks:nativestrict^C - 将当前目录文件 ( topc 链接到PWD/topc $HOME/bin`
ll $HOME/bin即可看到这里的topc文件是有链接标识到原有目录 (相对引用,浅拷贝->绝对引用,深拷贝
tips: 删除链接,rm目录下$HOME/bin对应文件即可
shell来源
-
shell builtin /shell 自带
-
系统提供
-
自定义function
-
自己提供的可执行脚本或程序
$
$ 可以用来传递参数、变量
传递参数
//sayhi文件
#!/bin/bash
NAME=$1 ; //第一个参数为NAME变量
echo hi,i am $NAME.
//input:sayhi lili
//output:hi,i am lili.
解决参数带空格的问题
sayhi yikina wang
//输出:hi,i am yikina
//问题:参数空格后面的文字没有纳入参数
//解决:将代码修改为
NAME=$*;
NAME=$@;
@基本相同 带引号的"@"会将其看作单个参数,类似于数组
eg. 如果有需要for in便利的需求尽量使用$@
[What’s the Difference Between @ in Bash? | Baeldung on Linux](www.baeldung.com/linux/dolla… behave the same way when not quoted%3A,arguments%2C “%24*” treats them as a single entity.)
清空变量
引用变量是需要使用 $ 符号来进行引用。可以使用 unset 来清空变量的值。
参数变量
{name} 均可以正确的引用变量。{name}1。
1,n 作为shell 参数变量的时候。如果n>10, 则需要使用**10
date
原始 vs 带修改日期格式
date
//output:Mon Jul 8 18:18:45 2024
date "+%Y-%m-%d %H:%M:%S"
//output:2024-07-08 18:19:10
cut \ grep
-
cut -d' ‘-f1:根据分隔符(delimiter)' '取第几个f(field) ——列
-
grep : 选中有匹配字符的行 grep -v取反(过滤)
example:
name.list中对应姓名和昵称,获取到姓名时显示昵称,姓名不存在,name.list不存在等情况也需要考虑
//name.list
red 小红
yellow 小黄
blue 小蓝
grep red name.list
//output: red 小红
cut -d' '-f1 name.list
/*output:
red
yellow
blue
*/
cut -d' '-f2 name.list
/*output:
小红
小黄
小蓝
*/
//获取给定名字的昵称
grep blue name.list | cut -d' ' -f2
/* |:管道传输前一表达式的结果 */
//output: 小蓝
sed
格式:
sed 's///'
sed -E 's///' //可以使用正则表达式的替换
sed 's/需要被替换的部分/替换成什么/'
eg:
删除sudo\nohup开头 sed -E 's/^(sudo|nohup) +//' \
awk
格式:
awk 'BEGIN{}{} END{}'
/*
BEGIN{开头需要执行什么}
{每一行命令需要执行什么}
END{结尾需要执行什么} */
相关知识点
重定向
redirection > >> 012
输出日志分析
- 保存方式
# > 将结果覆盖式暂存
date > date.log //一条结果
# >> 将结果追加暂存
date >> date.log //两条结果
- 输出错误重定向
# 2> 可以输出错误信息,且输出错误信息后程序会继续往下执行 (ggg是个未定义的命令
ggg 2> error.log //error.log中出现command do not found
ggg 1> error.log //直接报错,不会输出到error.log中
sayhi lili 2> error.log //terminal显示执行结果,error.log显示报错信息
sayhi lili > sayhi.log 2>&1 //2和1同时输出到sayhi.log
sayhi lili > sayhi.log 2>error.log //正确输出到sayhi.log。错误输出到error.log
- 输入< 重定向
//从name.list中取出结果进行cut操作
cut -d ' ' f2 < name.list
-
标准输出
进程运行时一般都会打开STDIN(标准输入),STDOUT(标准输出)和STDERR (标准错误)三个文件描述符。他们的代码分别是 0 ,1 , 2.
我们所说的重定向也是指的这三种类型文件描述符的重定向。
例如:
-
标准输入(stdin): 代码为0, 使用 < 或 << 重定向
-
标准输出(stdout): 代码为1, 使用 > 或 >> 重定向
-
标准错误(stderr): 代码为 2, 使用 2> 或 2>> 重定向
管道
-
eg. grep xifwang abc.list 2>/dev/null 0->1 or2
2>/dev/null: 这部分将标准错误输出重定向到/dev/null,也就是丢弃任何错误信息。0->1 or2: 这部分是对输入输出的重定向操作:0->1表示将标准输入 (文件描述符 0) 重定向到标准输出 (文件描述符 1)。or2表示如果标准输出 (1) 失败,则将输出重定向到标准错误输出 (文件描述符 2)。
总的来说,这个命令会在 abc.list 文件中搜索包含 xifwang 的行,并将结果输出到标准输出,同时忽略任何错误信息。
pipe | 结果传输到下一个操作
ps-aW显示程序运行的所有进程 (记忆:ps =>processes
ps -aW | grep System32过滤显示所有含有s32的进程
eg:
-
记录history执行过的次数
history | sed -E 's/^ +//' | cut -d' ' -f3 | sort | uniq -c | sorthistory: 这个命令会输出用户之前在命令行中执行过的所有命令。sed -E 's/^ +//': 这个 sed 命令用于去除每个命令前面的空格。-E表示使用扩展正则表达式,'s/^ +//'表示将以一个或多个空格开头的字符串替换为空。cut -d' ' -f3: 这个 cut 命令用于从每行中提取第三个字段。默认情况下,cut 使用空格作为字段分隔符。sort: 这个命令将提取出的命令行按字典序排序。uniq -c: 这个命令会统计每个唯一命令的出现次数。-c选项会在输出中显示每个命令的计数。sort: 这个最后一个 sort 命令会根据每个命令的出现次数(即第一个字段)对结果进行排序。
tips:删除历史命令行数据
history -c -
列出proc目录下的内容
ls /proc && echo suss! || echo failed.
ls /proc: 这个命令会列出/proc目录下的所有内容。/proc是一个特殊的虚拟文件系统,包含了关于正在运行的进程的信息。&&: 这是一个逻辑运算符,表示"and"。如果前一个命令(即ls /proc)执行成功(返回值为0),则执行后面的命令。echo suss!: 如果ls /proc执行成功,则会输出 "suss!"。||: 这是另一个逻辑运算符,表示"or"。如果前一个命令(即echo suss!)执行失败(返回值不为0),则执行后面的命令。echo failed.: 如果echo suss!执行失败,则会输出 "failed."。
- 查找record.log中包含AAA,但不包含BBB的记录的总数:
cat -v record.log | grep AAA | grep -v BBB | wc -l
别名
类似于快捷输入法,输入简短的alias即可展现篇幅较长的全部命令,非常省事!
# alias
//显示已有的alias
alias ll='ls -l'
alias ls='ls -F --color=auto --show-control-chars'
alias lsl='ls -lrt' //显示目录中的文件按照修改时间排序列表
alias node='winpty node.exe'
alias winget='winpty winget.exe'
注:
除去系统自带的alias,如果想要自己添加更多的alias
要添加到~/.bashrc文件中(记得要source一下),每次打开bash都会执行,不然的话每一次添加之后是没有保存的噢!!
同样,也可以设置快捷别名,快速打开路径,参考:8. 用户管理工具 — Linux Tools Quick Tutorial (linuxtools-rst.readthedocs.io)
bash快捷键
比较好记且常用的:
ctrl + A ctrl + E 回到命令行首尾
ctrl + U or K 删除命令行
cd - 回到上一个目录,=cd ../