ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【Shell 知识速查表】

【Shell 知识速查表】 Shell 知识速查表一、引号与空格二、符号与括号三、重定向操作符四、特殊变量速查五、变量展开Parameter Expansion六、sed / grep 正则表达式元字符七、POSIX 字符组八、输出命令echo 与 printfecho 常用printf 常用九、Linux 常用进程信号对照表十、 /bin/sh 和 /bin/bash区别一、引号与空格引号名字作用示例...单引号里面全部字面量任何字符都不特殊包括$、、\echo $PATH输出$PATH...双引号里面大部分字面量但$、、\、!历史展开仍特殊echo $PATH输出/usr/local/sbin:/usr/local/bin:......反引号命令替换旧写法建议用$(...)代替$( ls )子 shell 执行ls命令$var不加引号变量值里的空格、Tab、换行会被当成参数分隔符* ? [ 还会被当成通配符展开[[ ]] 里 ~ 右边的正则 不能加引号加了正则就废了。[[ ]] 里 右边想用通配符 不能加引号。(( )) 里是整数运算不加引号ANSI-C 引号它支持转义序列IFS$\n必须加空格的地方场景错误写法 ❌正确写法 ✅选项和参数ls-ld/homels -ld /home[[ ]]关键字[[$a $b]][[ $a $b ]]test 条件判断[$value1 -gt 5][ $value1 -gt 5 ]比较操作符[[ $a$b ]][[ $a $b ]]逻辑运算符[[ -f file ]]echo[[ -f file ]] echo数组元素arr(1,2,3)arr(1 2 3)或arr({1,2,3})函数定义func(){ echo; }func() { echo; }绝对不能加空格的地方场景错误写法 ❌正确写法 ✅变量赋值var hellovarhello文件描述符重定向2 121关闭文件描述符2 -2-空格灵活的场合场景可以这样也可以这样重定向到文件lsfilels file推荐数组赋值arr( 1 2 3 )arr(1 2 3)推荐算术运算((a53))(( a 5 3 ))推荐管道cat file|grepcat file | grep推荐二、符号与括号符号名称 / 说明示例()进程列表生成子 Shell 执行命令(pwd ; (echo $BASH_SUBSHELL))$()命令替换将命令输出赋给变量var01$(date %F %T.%3N){}命令分组coproc、函数定义用到{ ls; sleep 10; }(())整数算术表达式支持算术和逻辑if (( a b b 30 )); ...$(( ))整数算术并返回结果var02$(( -7 / 2 ))[]旧式 test 条件判断[ $value1 -gt 5 ]、[ -n var03 ]、[ -f $file_name ][[]]Bash 增强条件判断支持模式匹配和正则[[ $file *.txt ]]、[[ ! $username ~ ^[a-zA-Z0-9]$ ]]、[[ -f $file ]]$[]⚠️ 旧式整数运算已过时deprecated建议统一用$(( ))var04$(( var0 1 ))一句话记忆数字用(( ))字符串用[[]]兼容老脚本才用[]。三、重定向操作符符号名称作用覆盖重定向将 stdout 写入文件覆盖原有内容追加重定向将 stdout 追加到文件末尾输入重定向将文件内容作为命令的 stdinHere-Document多行文本作为 stdinsh/bash 通用Here-String单行字符串作为 stdinBash 独有常用重定向写法写法说明cmd filestdout 写入 filestderr 输出到屏幕cmd 2 filestderr 写入 filestdout 输出到屏幕cmd file 21stdout stderr 都写入 file通用写法cmd /dev/null 21stdout stderr 都写入 /dev/null全部丢弃cmd filestdout stderr 都写入 fileBash 简写cmd 21 file❌ 顺序错误stderr 仍输出到屏幕cmd 1输出送到标准输出 fd1cmd filefile 作为命令输入fd0shell 脚步自定义重定向# 注意3与不能有空格# exec 3test13outexec3testout# 这句话输出到文件testoutechothis should be stored in the file3重定向文件描述符# 文件描述符fd 3重定向到标准输出STDOUTfd 1exec31# 将标准输出STDOUTfd 1重定向到文件testout1exec1testout1echoThis should store in the output fileechoalong with this line.# STDOUTfd 1又指向了它原来的位置(显示器)exec13创建输入文件描述符# 文件描述符6用来保存STDINexec60# 脚本将STDIN重定向到文件testfileexec0testfilecount1whilereadlinedoechoLine #$count:$linecount$[$count1]done# 将STDIN重定向到文件描述符6从而将STDIN恢复到原先的位置exec06四、特殊变量速查变量说明$0脚本名称若 source 加载则为当前 Shell 名称$1…$9第 1 到第 9 个位置参数${10}${11}第 10 个及以上位置参数必须加大括号$#位置参数总个数不含$0$*所有参数合并为一个字符串受IFS影响$所有参数保持独立推荐用于循环遍历$-当前 Shell 的选项标志如hB、xu、himBHs$?上一条命令的退出状态码0成功非0失败$$当前 Shell 的 PID常用于临时文件如tmp.$$$!最后一个后台进程的 PID配合使用$_上一条命令的最后一个参数五、变量展开Parameter Expansion写法作用是否修改变量${var:-default}变量为空/未定义 → 返回 default否则返回变量本身❌ 不修改${var:default}变量为空/未定义 → 赋值为 default 并返回✅ 会修改${var:alt}变量非空 → 返回 alt为空 → 返回空❌ 不修改${var:?error_msg}变量为空/未定义 → 打印错误并退出脚本❌ 不修改六、sed / grep 正则表达式元字符在Linux中有两种流行的正则表达式引擎POSIX基础正则表达式basic regular expressionBRE引擎POSIX扩展正则表达式extended regular expressionERE引擎元字符含义示例.匹配任意单个字符除换行符a.c→abc、a1c、a c*匹配前一个字符 0 次或多次ab*c→ac、abc、abbc^匹配行首^root→ 以 root 开头的行$匹配行尾bash$→ 以 bash 结尾的行[]匹配方括号中任意一个字符[0-9]→ 包含数字的行[^]匹配不在方括号中的字符取反[^0-9]→ 匹配包含非数字字符的行即不全是数字的行\转义特殊字符\$5→ 匹配$5\?匹配前一个字符 0 次或 1 次colou\?r→color或colour\匹配前一个字符 1 次或多次[0-9]\→ 匹配数字串\{}匹配前一个字符指定次数a\{2,4\}→aa、aaa、aaaa|或匹配多个模式之一error|fatal→ 匹配 error 或 fatal\(\)分组\(error|fatal\)通配符glob给shell 文件名匹配用的只有*?[]。正则regex给文本内容匹配用的符号多、能力强。用途不同通配符 glob正则 regex匹配对象文件名 / 字符串整体文本中的一段内容谁在用shell、ls、find -name、casegrep、sed、awk、[[ ~ ]]典型场景ls *.txtgrep ^a.*z$ file符号对照表目的通配符正则任意多个字符*.*任意一个字符?.字符集合[abc][abc]不在集合[!abc][^abc]转义\*\.glob 有转义用\或引号让*?[]变字面量。转义是谁解释就按谁的规则shell 层是 globfind -name是 globgrep/~是正则。七、POSIX 字符组POSIX 字符组含义等价 ASCII[[:alnum:]]字母 数字[a-zA-Z0-9][[:alpha:]]大小写字母[a-zA-Z][[:digit:]]数字 0–9[0-9][[:lower:]]小写字母[a-z][[:upper:]]大写字母[A-Z][[:blank:]]空格、制表符不含换行[ \t][[:space:]]所有空白字符空格、tab、换行、回车、垂直制表、换页[ \t\n\r\v\f][[:punct:]]标点符号!#$%()*,-./:;?[]^_{}|[[:graph:]]可见图形字符不含空格alnum punct[[:print:]]可打印字符含空格graph 空格[[:cntrl:]]控制字符不可打印ASCII 0–31、127 DEL[[:xdigit:]]十六进制字符[0-9a-fA-F]八、输出命令echo 与 printfecho 常用用法说明echo Hello World基本输出echo Hello $USER单引号不展开变量echo Hello $name双引号展开变量echo -e Line1\nLine2启用转义字符换行echo -n No newline不换行输出printf 常用示例说明printf %s\n Hello输出字符串并换行printf %d\n 42输出整数printf %.2f\n 3.1415输出浮点数保留 2 位小数printf %-10s text左对齐宽度 10printf %10s text右对齐宽度 10printf %05d 7输出00007补零printf %-15s %5d\n Name 123表格对齐九、Linux 常用进程信号对照表操作信号名信号编号发送对象默认行为能否捕获/拦截补充说明Ctrl CSIGINT2前台进程组终止进程能中断信号程序可自定义回调逻辑优雅退出Ctrl ZSIGTSTP20前台进程组暂停进程挂起能进程后台挂起可通过 fg/bg 恢复运行kill pid默认SIGTERM15指定单个进程优雅终止进程能系统推荐终止方式允许程序收尾、释放资源kill -9 pidSIGKILL9指定单个进程强制立即终止不能最高权限强制杀死无法拦截、无法收尾慎用关闭终端/SSH断开SIGHUP1当前会话所有进程终止会话进程能常用于重载配置nginx -s reload 依赖此信号Ctrl D 不是发送信号是触发 TTY 终端的 EOFEnd Of File输入流结束cat/read等待键盘输入时结束输入空提示符下按就是退出 shell十、 /bin/sh 和 /bin/bash区别特性bash 独有不能在 /bin/sh 下跑POSIX sh/bin/sh 可用条件判断[[ $var abc ]][ $var abc ]数组arr(1 2 3)❌不支持算术((i))i$((i1))字符串替换${str//old/new}需要 sed/trhere-string hello❌不支持
返回列表