为什么要学bash,命令行,脚本,shell?
如果你是一个小白,学习命令行,可以让你入睡。- 如果你是一个电脑玩家,学习命令行,可以让你
装逼事半功倍。
好了,命令行难不难?俗话说,万事开头难,克服的就是心理、语言障碍后,再看完这篇入门教程后,你会觉得满简单的。此视频可破除恐惧👇
其实会点命令行才能破除恐惧,之前做的视频👇:
看完视频后,你应该大概明白命令行的操作感受了,继续向下,文字版内容更丰富。
啥是命令行
大家经常使用的叫做图形界面。而命令行就是形如下面的字符界面:
命令行界面(Command-Line Interface) 图示为PuTTY
- Windows上常用的命令行程序为CMD,PowerShell,ConEmu
- *nix类系统上为Bash
- Mac上则为zsh(之前也为Bash)
不管是图形界面还是字符界面,其目的都是为了方便你使用操作系统。图形界面的方便在于直观,可视化。命令行的方便在于精确和掌控感。 将分别介绍bash,cmd及powershell。
命令行基本语法
无论是bash,cmd抑或是powershell,命令的基本结构都是:
command option # 也就是: 命令+选项参数
command是:
- Shell内置命令
- 比如linux 的
cd
- 比如linux 的
- 系统提供的程序/脚本
- linux中,这些程序通常存在于
/bin
,/usr/bin
目录中
- linux中,这些程序通常存在于
- 外部程序
- 当前目录中的脚本(用户手写/下载)和二进制程序
- PATH变量中所存储的目录,这些目录中的程序或脚本
option是
是选项、参数,它是用于修改、确定command行为的。option可以很简单,简单到可以省略不写;也可以非常复杂,复杂到阅读起来很吃力。
ls
firewall-cmd --permanent --zone=public --list-ports
总之,在shell中,你可以运行各种程序,还可以通过各种参数控制程序行为。
bash/zsh
替换
替换是非常重要的命令行概念,在执行命令前,先将部分命令替换成值或结果
,然后执行命令。
比如说,你需要多次使用iPhone
的名称,但是你觉得打字不太方便,你就可以把这窜字符存到变量中:sj=iPhone
。等你下次需要使用,比如在窗口打印“iPhone”字符的时候,可以直接敲打命令:echo $sj
。
用变量的值替换变量名,这是最常见的一种替换。
变量替换
- 变量的定义为:name=value,=号旁不能有空格
- 变量的使用,需要在名称前添加美元符号:$vname (或者${vname},这个形式也非常好用)
- 变量的修改:变量名=新值,
sj=Xiaomi
使用变量时,命令在执行前,会把变量先变成变量存储的值。
address=https://manyouit.com
curl $address
执行过程:
- 先把$address 变成https://manyouit.com
- 执行
curl https://manyouit.com
变量与引号
由于bash 中,某些字符有特殊的意思。如何使用这些特殊字符? ——使用引号。
address=https://manyouit.com
curl '$address' # 程序错误,因为没有$address这样的网址;亦即“变量替换”失效
curl "$address" # 成功;双引号不会使得“变量替换”失效
使用单引号(英文),可以使大部分特殊符号失效;使用双引号(英文),不会使特殊符号失效。
执行结果替换
先执行内部命令,然后结果作为新命令的一部分。
两种形式:
`inner command`
$(inner command)
address=https://manyouit.com/
echo `echo $address`
$(echo $address)
数学运算与表达式替换:$(()),$[]
echo $[1+2] #3
echo $((1+2)) #3 ,$(()),$[]等效
支持+ - * / %:分别为 “加、减、乘、除、取模”等运算。但是注意,bash只能作整数运算。
进程替换与管道
进程替换:
将(多个) 命令/进程的输出存储成文件,然后作为当前命令新的组成部分;
或者将当前命令的输出成文件,作为新命令的输入。
文件替换
$(<filename)
`<filename`
读取文件内容组成新命令 。
替换:变量 vs 命令 vs 文件 vs 进程 vs 管道
# 变量替换:先取变量值,用值重新组成命令后执行。
echo ${PATH#*:} # 变量值替换(不修改变量本身),此处使用模式 *: 移除变量中部分
# 命令替换:先执行内部命令,用执行输出内容重新组成命令后执行。
ls -ld `locate which` # ls -ld $(locate which) 这种方法兼容性较差。
# 进程替换:先执行部分命令,用执行输出内容成文件后,**文件名**重新组成命令后执行。
comm <(ls -l) <(ls -al)
cat a.txt >(cat >b.txt)
# 文件替换:先读取文件内容,用读取的内容重新组成命令后执行。
# 管道: 前一个命令执行的`stdout 成为后面命令的stdin`
cmd1 | cmd2 | cmd3
命令组合与分隔符
- command1 ; command2
- command1 && command2
- command1 || command2
使用”;”时,不管command1是否执行成功都会执行command2;
使用”&&”时,只有command1执行成功后,command2才会执行,否则command2不执行;
使用”||”时,command1执行成功后command2 不执行,否则去执行command2.
常用命令
常用bash命令
lsof -i:10086 #[查看端口占用](https://linux.cn/article-4099-1.html):
ln Source Link #制作连接
netstat -anp|grep 80 #端口占用
perl -p -i -e "s/\r//g" filename #删除CR(Windows换行符有CRLF)
常用CMD/PS命令
certutil -hashfile #计算md5
Get-ScheduledTask | where {$_.settings.waketorun} #查看唤醒电脑的计划任务
Netstat -ano|findstr "8080" #查看占用某个端口的进程
Get-Command -Module PSScheduledJob | Group-Object Noun #[分组](https://www.pstips.net/about-scheduledjob.html#comment-18118),获得命令,然后分组(on Noun)
[console]::beep(500,300) #蜂鸣:
$PSVersionTable #PS版本:
findstr #查找字符串:
nslookup -qt=A manyou.it ns-uk.topdns.com #DNS解析:
powercfg -devicequery wake_armed #查看唤醒电脑的硬件
nslookup baidu.com 240C::6644 #使用特定服务器解析域名
三方程序记录
# frp
./frps -c ./frps.ini #有标准输出
nohup ./frps -c ./frps.ini &
pip install --upgrade name # 更新pip包
java -version # 查看版本
PowerShell
值
字面值:
- 数字:
123
- 字符串:
"good"
,'she says, "amazing"'
- 对象
输出值:
对于数字和字符串,在命令行处直接输入值,然后Enter即可输出
对于变量,在命令行处直接输入值,然后Enter即可输出
用逗号来输出多个值,每一个值都会还行显示:$a,3
变量,美元字符开头$Var1
声明变量:
$Var1="good #等于号之前允许一个空格"
或者
$aNumber = 5 -as [double]
$aList = 1,2,3,4,5
$aString = $aList -join '--' # 也可以用-split来分离
$aHashtable = @{name1='val1'; name2='val2'}
echo $aString
echo "Interpolation: $aString" #双引号内可以解析变量
echo "$aString has length of $($aString.Length)" #变量可以包括在$()中,$()用来解析变量
echo '$aString' #单引号内不可以解析变量
echo @"
This is a Here-String
$aString
"@
# 双引号 Here-String 及解析变量
# 可以用单引号来声明Here-String ,此时无法解析变量
变量和赋值=顺序,$a=cmd argu… 先执行再赋值
组合命令;分隔符
语法:
;
顺序执行
CMD:命令提示符
CMD
程序中文名称为命令提示符
。它的脚本文件格式为.bat
,也称批处理。
变量与%(百分号)
%变量%
,会把变量的结果作为命令的一部分,(类似bash 变量替换)- 在命令行界面和批处理文件(.bat 后缀文件)里,变量形式为
%Name%
- 在for 语句中的临时变量
- 命令行用
%Name
- 批处理文件用
%%Name
- 命令行用
- 特殊表示,在批处理文件中%0-%9 用来处理程序的参数输入
命令组合与分隔符
语法:
- & 顺序执行
- && 出错则不往后执行
- || 出错后才往后执行
第一条命令 & 第二条命令 [& 第三条命令...]
第一条命令 && 不出错则第二条命令 [&& 不出错则第三条命令...]
第一条命令 || 出错则第二条命令 [|| 出错则第三条命令...]
逗号 相当于空格:dir,c:\
分号 (部分命令有效)用来分隔参数,一个命令需要使用过个参数运行多次,则使用:
dir C:\;D:\
常用命令
制作目录软连接:mklink /D Link Source
windows地址栏使用\
而不是/
制作文件软连接:mklink Link Source
windows地址栏使用\
而不是/
设置代理
set HTTP_PROXY=192.168.0.7:1080
set HTTPS_PROXY=192.168.0.7:1080
命令行、脚本、Shell、Terminal
shell通常既是命令行界面,又是脚本解释程序
- 对于*nix 脚本中的命令,脚本,可被脚本解释程序(*sh)顺序执行。
- 在命令行和脚本中,都可以定义函数
比如用户的配置文件 ~/.bashrc
#! 表明了文件类型,此处是一个脚本,紧跟着的是脚本解释器的声明,如
#! /bin/sh
- 对于cmd 脚本称为批处理文件,后缀bat
- 对于powershell
注释区别
# ...comment...
cmd/bat:
rem ...comment...
::...comment...
& :: ... inline comment...
# ...comment...
<# ...comment... #>