shell 命令的一些基本用法
0 背景
在使用shell的时候,总是有些不习惯,记录一下常用的用法吧。
一、符号
1.1 引号
Shell中有三种引号,分别为双引号(" ")、单引号(' ')以及反引号(` `)
含义:
双引号(" "):在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身。
单引号(' '):在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。
反引号(` `):在反引号中的字符串将解释成shell命令来执行,并返回执行结果。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ a=1 $ echo $a 1 $ echo 'this is $a' #单引号 this is $a $ echo "this is $a" #双引号 this is 1 $ a=`ls` $ echo $a #反引号,显示执行ls命令后的结果 使用变量与其它字符连接时,可以如下如下使用 $ echo ${a}_2 1_2 |
1.2 重定向
含义:
> 输出重定向,可以把内容输出到文件中,但是会覆盖文件中原来的内容;
>> 输出重定向,可以把内容输出到文件中,不会覆盖文件中原来的内容,而是追加输入到文件中
< 输入重定向,可以把文件的内容输入到一个变量上
示例:
1 2 3 4 5 6 7 | $ echo "hello" > file #将字符串“hello”输出到文件file 中 $ echo "hello" >> file #将字符串“hello”追加输出到文件file 中 $ resd x < file #把file 文件中的内容输入到x (read 命令一次读取一行) $ echo $x xxxx #file文件中的内容 |
扩展:
1 2 | $ ls ddd > a 2>&1 #前提,已建立了文件a,2代表当前的标准错误输出,1代表标准输入。 2>&1 该命令的意思:将ddd输入到文件中,若报错,将报错信息也输入到文件a中,若正常执行,则将正常执行的结果输入到文件a中;2>&1 该命令是一个固定模式,不能修改 |
1.3 括号
$() 在括号中执行的的子 shell,相当于函数的作用域。而 {} 执行的是当前的语句块
1 2 | $(a=1) $echo $a #不会显示 1 |
1.4 $$
$echo $$ #查看当前的进程的ID
1.5 $!
$echo $! #返回当前进程的最后一个进程的 ID
1.6 &
“&”字符表示该操作在后台进行,且不影响当前界面进行其他操作
1 | $ for ((i=0;i<5;i++)); do echo $i;sleep 2;done & #每两秒操作操作一次字符,并且是后台运行。 |
1.7 (()) 与 $!
(()) #对变量进行操作,把括号中的变量当做整数去处理
echo $? 表示上一个语句是否执行正确,返回响应的值,在bash中,0代表true,所有非0的代表false
注意,针对的是上一个语句,整个表达式的执行
1 2 3 4 5 6 7 | $ a=2;b=3 $ echo $((a+3)) 5 $ a=1;b=3 $ (($a>$b));echo $? 1 |
1.8 |、|| 、& 、&&
- 管道前面是内容,管道后面是命令,前面命令的输出作为'|'后面的输入
1 2 | $ echo adbc | grep -o c 前面的 adbc 通过后面的精准匹配 c 符号,然后输出 c |
- 双竖线‘||’,用双竖线‘||’分割的多条命令,执行的时候遵循如下规则,如果前一条命令为真,则后面的命令不会执行,如果前一条命令为假,则继续执行后面的命令。可以表示为“或”
- “&” 同时执行多条命令,不管命令是否执行成功
- “&&” 可同时执行多条命令,当碰到执行错误的命令时,将不再执行后面的命令。如果一直没有错误的,则执行完毕。
二、命令
2.1 一些快捷操作命令
$ echo $PWD #返回当前的目录路径
$ echo $USER #返回当前用户名
$ echo $HOME #返回当前的目录路径 等价于 $ echo ~
$ echo $PATH #返回当前的环境变量的内
$ ls -l #显示当前目录下的文件具体信息,如权限、大小、创建时间、文件名字等,可以简写为 $ ll
$ ls -al #显示当前目录下的文件具体信息,包含了隐藏文件一起显示
$ which #加文件名 例如 $ which python 是从当前的环境变量中查找该文件的安装位置
$ export PATH=$PATH:$PWD #把当前的目录的添加到当前的系统变量中
$ cd expert/ #进入expert/目录
$ cd .. #回到上一层目录
$ cd #回到根目录
$jobs #显示当前进程的状态
2.2 seq
seq 命令,给定初始值和终值,构建一串序列
2.3 grep
1 2 3 4 5 6 7 8 9 10 11 12 | grep [OPTIONS] "PATTERN" [FILE...] Options: -E, --extended-regexp # equal to "egrep" -i, --ignore- case # 忽略大小写 -n, --line-number # 显示行号 -v, --invert-match -o, --only-matching # show only the part of a line matching PATTERN,精准匹配 -r "PATTERN" DIR # 根据文件内容, 查找文件 -A NUM, --after-context=NUM -B NUM, --before-context=NUM -C NUM, --context=NUM --color |
2.4 curl
status=$(curl -I -m 10 -o /dev/null -s --head -w %{http_code} $url)
status=$(curl -s --head $url | head -n 1 | awk '{print $2}')
以上两句都是匹配某个 URL 进行请求后返回的状态码,并赋值给 status 变量,部分命令解释:
# -I 只显示http response的头信息
# -m 10 最大传输时间10s
# -o /dev/null 屏蔽原有输出信息
# -s silent 模式,不输出任何东西
# -w %{http_code} 控制额外输出
# --head 显示http response的头信息,不包含网页代码
# head -n 1 指定需要输出的文本行数量
三、数据操作
3.1 特殊字符处理
1 2 3 | $ echo -e "a\nbb" #-e 开启转义功能,不开启,输出的是 a\nbb a bb |
3.2 数组处理
1 2 3 4 5 6 7 8 9 | $ array=(1 2 3 4 5) $ echo ${array[@]} #@不管加不加双引号,都当做数组处理 1 2 3 4 5 $ echo ${array[*]} # * 当加上双引号时, 把数组中的值都当做字符串处理 1 2 3 4 5 $ echo ${#array[@]} #返回数组中有多少个元素 5 $ echo ${array[2]} #通过数组下标索引输出元素 3 |
3.3 字符串
3.3.1 字符串操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ s= "hello from testerhome" $ echo ${s:6} #从字符串的第六个字符开始输出,类似python的切片 from testerhome $ echo ${s:6:3} #截取从字符串的第六个字符开始,到后面的第三个字符,然后输出 fro $ echo ${s#hello} #将指定的字符/字符串去掉(默认包含了前后空格,从头部开始匹配),然后输出 from testerhome $ echo “${s#hello}” #将指定的字符/字符串去掉(加双引号不包含前后空格),然后输出 from testerhome $ echo ${s#*m} #采用了正则匹配,*是通配符,代表任意字符,m只匹配一次(非贪婪匹配) testerhome $ echo ${s##*m} #采用了正则匹配,*是通配符,代表任意字符,m匹配多个(贪婪匹配) e $ echo ${s%home} #将指定的字符/字符串去掉(默认包含了前后空格,从尾部开始),然后输出 hello from tester $ echo ${s%h*} #采用了正则匹配,*是通配符,代表任意字符,h只匹配一次(非贪婪匹配),从尾部开始匹配 hello from tester<br><br>$ echo ${s/ from /to} #替换字符串,第一个斜杠后边是被替换的字符,第二个斜杠后边是要替换的字符,只匹配到识别的第一个字符。贪婪匹配模式可以参照上面的例子。<br>hello to testerhome |
3.3.2 字符串比较
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ a=testerhome $ b= "testerhome" $ [ "$a" = "$b" ] $ echo $? 1 $ [ "$a" != "$b" ] 0 $ [ -n $a] #如果字符串不为空,则结果为真 $ echo $? 0 $ [ -z $a] #如果字符串为空,则结果为真 $ echo $? 1 |
3.3.3 字符串替换
${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $ test= 'c:/windows/boot.ini' $ echo ${test/\ //\\} c:\windows/boot.ini $ echo ${test //\//\\} c:\windows\boot.ini $ x=abcdabcd $ echo ${x/a/b} # 只替换一个 bbcdabcd $ echo ${x //a/b} # 替换所有 bbcdbbcd #举例 $ test= 'liu.' $ echo ${test //'.'/'\.'} liu\. #使用 awk 或 sed 命令表示 $ a= "1234567" $ echo $a | awk '{print substr($0,2,3)}' 234 $ echo $a | sed 's/3/c/g' # g 表示进行全局匹配 12c4567 |
四、综合
按键盘 CTRL+Z ,会把当前正在执行的进程暂停,然后放到后台,按 CTRL+Z 后,程序会给被暂停的进程一个标识号。
若想把被暂停的进程调回来继续执行,使用命令 bg + 标识号;
若被调到后台的进程想调到前台,使用命令 fg + 标识号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?