bash-命令行-脚本-shell入门

为什么要学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中,这些程序通常存在于/bin,/usr/bin 目录中
  • 外部程序
    • 当前目录中的脚本(用户手写/下载)和二进制程序
    • 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

执行过程:

  1. 先把$address 变成https://manyouit.com
  2. 执行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

命令组合与分隔符

  1. command1 ; command2
  2. command1 && command2
  3. 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

注释区别

bash

# ...comment...

cmd/bat:

rem ...comment... 
::...comment...
& :: ... inline comment...

PowerShell

# ...comment... 
<# ...comment... #>
Jan 5, 2020 scripts 脚本 cui gui 命令后 脚本 shell sh zsh bash

相关文章