{"id":20841484,"url":"https://github.com/omgzui/bash-step-to-step","last_synced_at":"2025-08-31T12:43:23.624Z","repository":{"id":110982032,"uuid":"101709568","full_name":"OMGZui/bash-step-to-step","owner":"OMGZui","description":"👀  bash命令和语法--带你升级打boss","archived":false,"fork":false,"pushed_at":"2019-01-20T06:38:02.000Z","size":1846,"stargazers_count":212,"open_issues_count":0,"forks_count":65,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-05-08T22:11:23.727Z","etag":null,"topics":["bash"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OMGZui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-08-29T02:27:05.000Z","updated_at":"2024-11-27T04:09:59.000Z","dependencies_parsed_at":"2023-07-24T14:45:53.056Z","dependency_job_id":null,"html_url":"https://github.com/OMGZui/bash-step-to-step","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/OMGZui/bash-step-to-step","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OMGZui%2Fbash-step-to-step","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OMGZui%2Fbash-step-to-step/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OMGZui%2Fbash-step-to-step/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OMGZui%2Fbash-step-to-step/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OMGZui","download_url":"https://codeload.github.com/OMGZui/bash-step-to-step/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OMGZui%2Fbash-step-to-step/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272982771,"owners_count":25025984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-31T02:00:09.071Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash"],"created_at":"2024-11-18T01:20:21.607Z","updated_at":"2025-08-31T12:43:23.599Z","avatar_url":"https://github.com/OMGZui.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bash 跟着敲\n\n前言：本文不单单是介绍常用的命令，还融入了bash语法，每个知识点都有浅显的例子配合，让你很容易消化并吸收，最后还有一个boss任务等你挑战，耐心学完的同学肯定会有很大的收获的。大家觉得有用的话，star一下，然后可以随意分享给需要的人，重点是加颗星星哦，加颗星星哦，加颗星星哦。 【持续更新】\n\n\u003c!-- TOC --\u003e\n\n- [bash 跟着敲](#bash-跟着敲)\n    - [一. 硬件、内核、shell](#一-硬件内核shell)\n    - [二. 命令行](#二-命令行)\n        - [1. 基本操作](#1-基本操作)\n            - [export](#export)\n            - [whatis](#whatis)\n            - [whereis](#whereis)\n            - [which](#which)\n            - [clear](#clear)\n        - [2. 文件操作](#2-文件操作)\n            - [cat](#cat)\n            - [chmod](#chmod)\n            - [cp](#cp)\n            - [diff](#diff)\n            - [find](#find)\n            - [head](#head)\n            - [ls](#ls)\n            - [mv](#mv)\n            - [rm](#rm)\n            - [touch](#touch)\n        - [3. 文本操作](#3-文本操作)\n            - [awk](#awk)\n            - [grep](#grep)\n            - [sed](#sed)\n            - [sort](#sort)\n            - [wc](#wc)\n        - [4. 目录操作](#4-目录操作)\n            - [cd](#cd)\n            - [mkdir](#mkdir)\n            - [pwd](#pwd)\n        - [5. SSH,系统信息，网络操作](#5-ssh系统信息网络操作)\n            - [cal](#cal)\n            - [date](#date)\n            - [df](#df)\n            - [du](#du)\n            - [ps](#ps)\n            - [ssh](#ssh)\n            - [top](#top)\n    - [三. 语法](#三-语法)\n        - [1 条件判断](#1-条件判断)\n            - [1.1 test判断语句](#11-test判断语句)\n            - [1.2 []条件判断](#12-条件判断)\n        - [2 if then else语句](#2-if-then-else语句)\n        - [3 case语句](#3-case语句)\n        - [4 for循环](#4-for循环)\n        - [5 while循环](#5-while循环)\n        - [6 使用break和continue控制循环](#6-使用break和continue控制循环)\n    - [四. 数组](#四-数组)\n        - [1 数组定义](#1-数组定义)\n        - [2 数组操作](#2-数组操作)\n    - [五.函数](#五函数)\n    - [六.数值运算](#六数值运算)\n    - [七. 字符运算](#七-字符运算)\n    - [八. bash调试](#八-bash调试)\n        - [bash [-nvx] scripts.sh](#bash--nvx-scriptssh)\n        - [echo [-neE] string](#echo--nee-string)\n    - [九. bash内建指令](#九-bash内建指令)\n        - [echo](#echo)\n        - [read](#read)\n        - [alias](#alias)\n        - [export](#export-1)\n        - [exec](#exec)\n        - [.](#)\n        - [exit](#exit)\n    - [十. 参考资料](#十-参考资料)\n    - [十一. 大BOSS](#十一-大boss)\n    - [十二. 命令详解](#十二-命令详解)\n\n\u003c!-- /TOC --\u003e\n\n## 一. 硬件、内核、shell\n\n下面这张摘自鸟哥的图可以很好的说明\n![](./img/shell.jpg)\n\n## 二. 命令行\n\n### 1. 基本操作\n\n#### export\n\n展示全部的环境变量，如果你想获取某个特殊的变量，用 `echo $变量名`\n![](./img/export.jpg)\n![](./img/echo.jpg)\n\n#### whatis\n\n展示用户命令，系统调用、库函数等\n![](./img/whatis.png)\n\n#### whereis\n\n搜索可执行文件、源文件\n![](./img/whereis.png)\n\n#### which\n\n在环境变量中搜索可执行文件，并打印完整路径\n![](./img/which.jpg)\n\n#### clear\n\n清空屏幕\n![](./img/clear.png)\n\n### 2. 文件操作\n\n#### cat\n\n在屏幕上显示文本文件\n![](./img/cat.jpg)\n\n#### chmod\n\n可以改变文件和目录的读、写、执行权限\n[linux 中的用户、组、文件][1]\n\n#### cp\n\n复制文件\n![](./img/copy.jpg)\n\n#### diff\n\n比较文件，我在上面复制的文件中加了一行diff\n![](./img/diff.jpg)\n\n#### find\n\n查找文件，可以通过正则来查\n![](./img/find.jpg)\n\n#### head\n\n查看文件前10行\n![](./img/head.jpg)\n\n#### ls\n\n显示所有文件，`-l`显示长格式化 `-a`显示包括隐藏文件\n![](./img/ls.jpg)\n\n#### mv\n\n移动文件，同时也可以重命名文件\n![](./img/mv.jpg)\n\n#### rm\n\n删除文件，`-r`删除目录 `-f`强制删除\n![](./img/rm.jpg)\n\n#### touch\n\n创建新文件\n![](./img/touch.jpg)\n\n### 3. 文本操作\n\n#### awk\n\n非常有用的一个文本处理命令，逐行运行，默认使用空格分割，`-F`表示分割的样式\n![](./img/etc:passwd.jpg)\n![](./img/awk.jpg)\n\n#### grep\n\n匹配正则表达式的文本行，并输出，`-E`正则模糊匹配 `-F`精确字母匹配 `-w`精确单词匹配\n![](./img/grep.jpg)\n![](./img/grep_w.jpg)\n\n#### sed\n\n正则替换\n![](./img/sed.jpg)\n\n#### sort\n\n排序\n![](./img/sort.jpg)\n\n#### wc\n\n统计文本行数，单词数，字符数\n![](./img/wc.jpg)\n\n### 4. 目录操作\n\n#### cd\n\n进入目录\n\n#### mkdir\n\n创建目录\n\n#### pwd\n\n当前目录的路径\n![](./img/mkdir.jpg)\n\n### 5. SSH,系统信息，网络操作\n\n#### cal\n\n月历\n![](./img/cal.jpg)\n\n#### date\n\n当前日期和时间\n![](./img/date.jpg)\n\n#### df\n\n磁盘使用情况\n\n#### du\n\n文件或目录使用情况\n![](./img/du.jpg)\n\n#### ps\n\n列出你的进程\n![](./img/ps.jpg)\n\n#### ssh\n\n远程连接\n![](./img/ssh.jpg)\n\n#### top\n\n列出当前活动进程\n![](./img/top.jpg)\n\n## 三. 语法\n\n### 1 条件判断\n\n#### 1.1 test判断语句\n\ntest是关键字，表示判断；EXPRESSION是被判断的语句。\n\n![](./img/testEx.jpg)\n\n`echo $?` 输出判断结果，0表示成功，其他表示失败。\n![](./img/test.jpg)\n\n#### 1.2 []条件判断\n\n中括号的左右扩弧和EXPRESSION之间都必须有空格！\n![](./img/[1].jpg)\n\n文件类型判断\n![](./img/[2].jpg)\n字符串和数字判断\n![](./img/string-integer.jpg)\n\n### 2 if then else语句\n\n例子1：判断文件README.md是不是文件\n\n```sh\n#!/bin/bash\n\nif [ -f ../README.md ];then\necho 'file exist'\nelse\necho 'file not exist'\nfi\n\nexit 0\n```\n\n例子2：提示用户输入值，如果大于0输出’正数’，小于0输出’负数‘，等于0输出’零‘\n\n```sh\n#!/bin/bash\n\n# 提示用户输入一个值\necho -n \"请输入一个数字：\"\n\n# 保存用户输入的值到num中\nread num\n\nif [ \"$num\" -gt 0 ];then\necho '正数'\nelif [ \"$num\" -lt 0 ];then\necho '负数'\nelse\necho '零'\nfi\n\nexit 0\n```\n\n### 3 case语句\n\n例子：提示用户输入Y/y或N/n。若输入Y/y，则输出“我们约起来吧”；若输入N/n,则输出“不约，再见”；否则，“输入有误”\n\n```sh\n#!/bin/bash\n\necho -n \"你单身吗？(y/n)\"\n\nread val\n\ncase $val in\nY|y)\necho \"我们约起来吧\"\n;;\nN|n)\necho \"不约，再见\"\n;;\n*)\necho \"输入有误\"\n;;\nesac\n\nexit 0\n```\n\n### 4 for循环\n\n例子1：输出当前文件夹的一级子目录中文件名字\n\n```sh\n#!/bin/bash\n\n# 将ls的结果保存到变量CUR_DIR中\nCUR_DIR=`ls`\n\n# 显示ls的结果\necho $CUR_DIR\n\nfor val in $CUR_DIR\ndo\nif [ -f $val ];then\necho \"FILE: $val\"\nfi\ndone\n\nexit 0\n```\n\n例子2：输出1-10之间数字的总和\n\n```sh\n#!/bin/bash\n\nsum=0\nfor ((i=1;i\u003c10;i++))\ndo\n((sum=$sum+$i))\ndone\n\necho \"sum=$sum\"\n\nexit 0\n```\n\n### 5 while循环\n\n例子：从0开始逐步递增，当数值等于5时，停止递增\n\n```sh\n#!/bin/bash\n\nval=0\n\nwhile [ \"$val\" -lt 5 ]\ndo\necho \"val=$val\"\n((val++))\ndone\n\nexit 0\n```\n\n### 6 使用break和continue控制循环\n\nbreak命令允许跳出循环\n\ncontinue命令类似于 break命令,只有一点重要差别,它不会跳出循环,只是跳过这个循环步。\n\n例子1：[break应用]从0开始逐步递增，当数值等于5时，停止递增。\n\n```sh\n#!/bin/bash\n\n# 设置起始值为0\nval=0\n\nwhile true\ndo\nif [ \"$val\" -eq \"5\" ];then\n# 如果val=5，则跳出循环\nbreak;\nelse\n# 输出数值\necho \"val=$val\"\n# 将数值加1\n((val++))\nfi\ndone\n\nexit 0\n```\n\n例子2：[continue应用]从0开始逐步递增到10：当数值为5时，将数值递增2；否则，输出数值\n\n```sh\n#!/bin/bash\n\n# 设置起始值为0\nval=0\n\nwhile [ \"$val\" -le \"10\" ]\ndo\nif [ \"$val\" -eq \"5\" ];then\n# 如果val=5，则将数值加2\n((val=$val+2))\ncontinue;\nelse\n# 输出数值\necho \"val=$val\"\n# 将数值加1\n((val++))\nfi\ndone\n\nexit 0\n```\n\n## 四. 数组\n\n### 1 数组定义\n\n- array=(10 20 30 40 50)\n\n一对括号表示是数组，数组元素用“空格”符号分割开。引用数组时从序号0开始。\n\n- 除了上面的定义方式外，也可以单独定义数组：\n\n```sh\narray[0]=10\narray[1]=20\narray[2]=30\narray[3]=40\narray[4]=50\n```\n\n- var=\"10 20 30 40 50\"; array=($var)\n\n### 2 数组操作\n\n[数组操作][2]\n\n```sh\n#!/bin/bash\n\narray=(10 20 30 40 50)\n\n# 显示数组中所有元素\necho '显示数组中所有元素'\necho ${array[*]}\necho ${array[@]}\n\n# 显示数组第2项\necho '显示数组第2项'\necho ${array[1]}\n\n# 显示数组长度\necho '显示数组长度'\necho ${#array[@]}\n\n# 输出数组的第1-3项\necho '输出数组的第1-3项'\necho ${array[@]:0:3}\n\n# 将数组中的0替换成1\necho '将数组中的0替换成1'\necho ${array[@]/0/1}\n\n# 删除数组第2项元素  \n# 说明：\n# unset仅仅只清除array[1]的值，并没有将array[1]删除掉\necho '删除数组第2项元素'\nunset array[1]\necho ${array[@]}\n\nexit 0\n```\n\n## 五.函数\n\n[函数实例][3]\n\n```sh\n#!/bin/bash\n\n# 编辑一个函数foo：打印foo的输入参数的总数，并输入每个参数和参数对应的序号。\nfunction foo()\n{\n    # 定义局部变量i\n    local i=0 \n    # 定义局部变量total=传入foo的参数总数\n    local total=$#\n    # 输出参数总数\n    echo \"total param =$total\"\n    # 输出传入foo的每一个参数\n    for val in $@\n    do\n        ((i++))\n        echo \"$i -- val=$val\"\n    done\n\n    # 返回参数总数\n    return $total\n}\n\nfoo\nfoo param1 param2 param3\n# 输出foo param1 param2 param3的返回值\necho \"return value=$?\"\n\nexit 0\n```\n\n## 六.数值运算\n\n```sh\n数值元算主要有4种实现方式：(())、let、expr、bc。\n工作效率：(()) == let \u003e expr \u003e bc**\n(())和let是bash内建命令，执行效率高；而expr和bc是系统命令，会消耗内存，执行效率低。\n(())、let和expr只支持整数运算，不支持浮点运算；而bc支持浮点运算。\n```\n\n[数值运算][4]\n实例1：用4中方式实现`3*(5+2)`\n\n```sh\n#!/bin/bash\n\n# (())\nval1=$((3*(5+2)))\necho \"val1=$val1\"\n\n# let\nlet \"val2=3*(5+2)\"\necho \"val2=$val2\"\n\n# expr\nval3=`expr 3 \\* \\(5+2\\)`\necho \"val3=$val3\"\n\n# bc\nval4=`echo \"3*(5+2)\"|bc`\necho \"val4=$val4\"\n\nexit 0\n```\n\n实例3：5/3浮点运算，保留3位小数\n\n```sh\n#!/bin/bash\n\n# bc 实现5/3浮点运算，保留3位小数\nval5=`echo \"scale=3; 5/3\"|bc`\necho \"val5=$val5\"\n\nexit 0\n```\n\n## 七. 字符运算\n\n[字符运算][5]\n\n```sh\n#!/bin/bash\n\nstr='hello world'\n\n# 显示字符串\necho '显示字符串'\necho ${str}\n\n# 显示字符串长度\necho '显示字符串长度'\necho ${#str}\n\n# 提取world\necho '提取world'\necho ${str:6}\n\n# 提取or\necho '提取or'\necho ${str:7:2}\n\n# 删除hello\necho '删除hello'\necho ${str#hello}\n\n# 删除world\necho '删除world'\necho ${str%world}\n\n# 将所有的字符l替换为m\necho '将所有的字符l替换为m'\necho ${str//l/m}\n\nexit 0\n```\n\n## 八. bash调试\n\n### bash [-nvx] scripts.sh\n\n```sh\n选项与参数:\n-n: 不要执行 script,仅查询语法的问题;\n-v: 再执行 sccript 前,先将 scripts 的内容输出到屏幕上;\n-x: 将使用到的 script 内容显示到屏幕上,这是很有用的参数!\n```\n\n例子：想要执行bash脚本，并查看bash的调用流程，可以通过以下命令：\n\n`bash -x test.sh`\n\n### echo [-neE] string\n\n```sh\n选项与参数:\n-n: 输出内容之后，不换行。默认是输入内容之后，换行。\n-e: 开启反斜线“\\”转义功能\n-E: 开启反斜线“\\”转义功能（默认）。\n```\n\n例子：输出please input a number:之后不换行\n\n`echo -n \"please input a number:\"`\n\n## 九. bash内建指令\n\n### echo\n\n在屏幕上显示出指定的字串\n\n### read\n\n从标准输入设备读入一行，分解成若干字，赋值给bash程序内部定义的变量\n\n### alias\n\n别名,`alias l='ls -al'`\n\n### export\n\nexport可以把bash的变量向下带入子bash(即子bash中可以使用父bash的变量)，从而让子进程继承父进程中的环境变量。但子bash不能用export把它的变量向上带入父bash。\n\n### exec\n\n当bash执行到exec语句时，不会去创建新的子进程，而是转去执行指定的命令，当指定的命令执行完时，该进程（也就是最初的bash）就终止了，所以bash程序中exec后面的语句将不再被执行。\n\n### .\n\n使bash读入指定的bash程序文件并依次执行文件中的所有语句。\n\n### exit\n\n退出Shell程序，在exit之后可有选择地指定一个数位作为返回状态。\n\n## 十. 参考资料\n\n后语：大家觉得有用的话，star一下，然后可以随意分享给需要的人，重点是加颗星星哦，加颗星星哦，加颗星星哦。\n\n- [Linux bash总结(一) 基础部分(适合初学者学习和非初学者参考)][6]\n- [bash-guide][7]\n- [ssr.sh][8]\n- [Markdown-TOC][9]\n\n## 十一. 大BOSS\n\n[大BOSS][10]\n\n## 十二. 命令详解\n\n- [x] basic\n- [x] file\n- [x] text\n- [x] directory\n- [x] sys\n\n[1]:./linux-user-group-file.md\n[2]:./dir/array.sh\n[3]:./dir/function.sh\n[4]:./dir/operation.sh\n[5]:./dir/string.sh\n[6]:http://www.cnblogs.com/skywang12345/archive/2013/05/30/3106570.html\n[7]:https://github.com/Idnan/bash-guide\n[8]:https://doub.bid/ss-jc42/\n[9]:https://github.com/AlanWalk/Markdown-TOC\n[10]:./ssr.sh\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fomgzui%2Fbash-step-to-step","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fomgzui%2Fbash-step-to-step","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fomgzui%2Fbash-step-to-step/lists"}