ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Bash 技能测验全解析:77 道高频考点精讲(变量展开、重定向、文本处理与进程控制)

Bash 技能测验全解析:77 道高频考点精讲(变量展开、重定向、文本处理与进程控制) 文档教程知识库教育【免费下载链接】linkedin-skill-assessments-quizzesFull reference of LinkedIn answers 2024 for skill assessments (aws-lambda, rest-api, javascript, react, git, html, jquery, mongodb, java, Go, python, machine-learning, power-point) linkedin excel test lösungen, linkedin machine learning test LinkedIn test questions and answers项目地址https://gitcode.com/GitHub_Trending/li/linkedin-skill-assessments-quizzes点击查看免费下载本指南以仓库中的 bash-quiz-es.md西班牙语版 Bash 技能测验共 77 道题为核心主体结合英文原版 bash-quiz.md 逐题精讲。它覆盖 Linux/Unix 工程师日常工作中最常踩坑的知识点——变量与引号展开、标准输入输出重定向、sed/awk 文本处理、条件测试、glob 通配、数组循环与脚本执行权限。读完本文你将具备一套可对照自测的 Bash 考点图谱并能直接运行文中所有示例验证结论。一、文档概览一份可自测的 Bash 考点清单仓库bash/目录下存放了 Bash 测验的多个语言版本英文原版 bash-quiz.md94 题、西班牙语版 bash-quiz-es.md77 题、以及法语、意大利语、中文版bash-quiz-fr.md、bash-quiz-it.md、bash-quiz-ch.md。README.md 的目录表格中列出了各版本的题数与贡献者你可以通过表格里的语言旗帜图标assets/es.svg 等直接跳转到对应语言版本。这些语言版本由仓库根目录的 translate.py 翻译脚本生成——该脚本内置 20 种语言配置西班牙语es、法语fr、意大利语it、中文zh-CN等读取指定的 Markdown 测验文件后调用翻译引擎输出带语言后缀的新文件这也是仓库多语言化的工作流。因此各语言版本题目序号与英文原版一一对应本文讲解时以西班牙语版题号P1~P77为准并补充英文原版独有的扩展题目Q78~Q94供进阶参考。二、变量、引号与展开Bash 最容易翻车的区域2.1 波浪号~展开与带空格的路径P1cp -R ~/photo dir /backups #方法1引号阻止了 ~ 展开无效 cp -R ~/photo dir /backups #方法2~ 后紧跟引号展开失败 cp -R ~/photo dir /backups #方法3✔ 正确正确答案是方法 3。~的展开发生在词法分析早期只有当它作为词首且后接/或命令名时才展开为家目录。方法 1 把~放进双引号内双引号内的~不会被展开方法 2 中~与双引号粘连同样不满足展开条件。方法 3 先让~展开成/home/user再接上被引号保护、包含空格的photo dir两者拼接后由cp -R递归复制。稳妥的替代写法是$HOME/photo dir——用变量$HOME代替~在任何引号组合下都可靠。2.2 引号与分词for i in $(ls *.jpg)为什么失败P2for i in $(ls *.jpg); do mv $i ${i}.bak done该脚本会在包含Beach photo1.jpg文件名含空格的目录下失败。$(ls *.jpg)命令替换产生的输出会经历单词分割word splitting含空格的Beach photo1.jpg被拆成Beach和photo1.jpg两个独立的循环项mv因此收到错误参数。这是“不要解析 ls 输出”的经典反例正确做法是直接对通配符展开结果循环for i in *.jpg; do mv $i $i.bak; done。2.3 子 shell 与命令分组P3、P66在子 shell 中执行命令( command )——圆括号让其中的命令在独立 shell 进程中运行子 shell 内的变量修改不会影响父 shell。不产生子 shell 的命令分组{ command1; command2; }——花括号分组在当前 shell 内顺序执行注意花括号两侧必须有空格、末尾命令后必须加分号。2.4 命令替换与单双引号差异P21、P67echo The date is: $(date)! # 双引号内 $() 会执行输出日期 echo Hello, $(whoami)! # 单引号内一切照原样输出Hello, $(whoami)!双引号内的$(...)命令替换会执行并把结果嵌入字符串单引号则完全禁止所有展开变量、命令替换、~等因此 P67 的输出是字面量Hello, $(whoami)!。2.5 间接展开P30与参数展开操作符P18、P53、P76fnamejohn johnthomas echo ${!fname} # 输出 thomas${!fname}是间接展开先取fname的值john再把john作为变量名取它的值thomas。类似技巧常配合数组键遍历使用。参数展开的四个经典模式P18、P53、P76语法含义示例${VAR#pattern}删除最短匹配的前缀VAR/var/www/html/website.com/html/echo ${VAR#*/html}输出/website.com/html/删掉最短的前缀*/html即第一个/html${VAR##pattern}删除最长匹配的前缀P76 中${VAR##([[:space:]])}删掉开头全部空白${VAR%pattern}删除最短匹配的后缀${VAR%%pattern}删除最长匹配的后缀P76 中${VAR%%([[:space:]])}删掉结尾全部空白${VAR//pattern/repl}全部替换VARThis old man came rollingecho ${VAR//man/rolling}输出This old rolling came rollingP76 组合了扩展 glob 与参数展开完成“去首尾空白”#!/bin/bash shopt -s extglob VAR This is... a string of characters VAR${VAR##([[:space:]])}; VAR${VAR%%([[:space:]])}; echo $VAR # This is... a string of characters首尾空格均被清除中间保留([[:space:]])是启用extglob后的“一个或多个空白字符”模式##/%%从首尾贪婪删除最终实现 trim 效果。2.6 反斜杠转义P55echo Shall we play a game? yes\\no # 输出Shall we play a game? yes\no在双引号内\\转义为一个反斜杠单反斜杠\n会被当作转义序列而不输出。要用echo精确打印含反斜杠的文本记得写成\\。2.7 正则测试的引号陷阱P16、P42txtPenguins [[ $txt ~ [a-z]{8} ]]; echo $? # 输出 1falsePenguins首字母大写[a-z]不匹配大写P因此返回 1。注意~右侧的正则不能加引号P42 中[[ $var ~ ^[0-9]$ ]]因为把正则包进双引号正则被当作普通字符串匹配任何输入都匹配不上脚本永远输出 Is not numeric——去掉引号写[[ $var ~ ^[0-9]$ ]]才能正常工作。2.8 什么是“变量”P46greetingHello echo $greeting, everybody!greeting是一个变量variable不是命令、循环或参数。Bash 中变量赋值格式为namevalue等号两侧无空格引用时加$。三、重定向与数据流STDIN/STDOUT/STDERR 的完整图谱3.1 标准错误丢弃与文件描述符P5、P10、P11、P24、P41、P52、P64、P74find / -name finance.db 1results.txt 2/dev/null1把标准输出匹配文件的路径写入results.txt2/dev/null把标准错误权限不足等报错信息丢弃到黑洞设备。被丢弃的正是 find 执行过程中产生的错误信息。P10/P11 的mysql file.sql file.txt是“输入重定向 输出重定向”的组合让 mysql 从file.sql读 SQL把 mysql 的无错误输出写入file.txt而错误信息仍走 STDERR 显示在屏幕因此 P11 中屏幕上不会有任何输出因为 STDOUT 已被重定向。P24 的cat in.txt out.txt说明输入重定向与输出重定向可以同时使用out.txt最终是in.txt的内容副本。P41 则是一个陷阱题ls nonexistentfile | grep No such file out.txtls对不存在文件报错时错误走STDERR而管道只连接 STDOUT所以grep收不到任何输入out.txt为空。P52/P64 分别考察输入重定向建文件和输出重定向保存结果cat notes - # 从 STDIN 读取文本写入 notes 文件- 代表 STDIN ls filelist.txt # 把 ls 的输出发送到文件以便后续使用P74 综合考察文件描述符的读写#!/bin/bash echo 123446789 out.txt exec 3 out.txt # 以读写方式打开文件描述符 3 read -n 4 3 # 从 fd 3 读 4 个字符1234文件指针前进到第 5 个字符 echo -n 5 3 # 在第 5 个位置写入 5覆盖原第 5 个字符 4 exec 3- # 关闭 fd 3最终out.txt内容为123456789——第 4 位被5覆盖。3.2 管道与后台执行P45、P77管道符|把前一个命令的 STDOUT 接到后一个命令的 STDINP45。放在命令末尾让命令在后台运行P77shell 立即返回提示符。压缩传输的远程拷贝P68tar cvzf - /wwwdata | ssh root192.168.1.201 dd of/backup/wwwdata.tar.gztar cvzf -把/wwwdata打包压缩输出到 STDOUT-表示标准流经ssh管道传送到远端由dd of...落盘实现跨主机压缩备份。四、文本处理三剑客sed 与 awk4.1 awk 字段与内建变量P4、P7、P13echo 1 2 3 | awk {for (i1; iNF; i) ss$i};END {print s} # 输出 6NF是“当前行字段数”循环累加$i第 i 个字段得 1236。awk -F: /user1/{print $1 - $3 - $6} /etc/passwd-F:把字段分隔符设为冒号匹配含user1的行后打印用户名、UID、家目录用-连接。/etc/passwd每行格式为用户名:密码占位:UID:GID:注释:家目录:shell因此$1、$3、$6分别对应用户名、UID、家目录。提取第一列P13的标准写法是cat textfile | awk {print $1}4.2 sed 的增删改查P6、P31、P53、P61、P73删除空行P6必须用-i就地修改且正则^$表示“行首紧接行尾”即空行sed -i /^$/d textfile不带-i只输出到屏幕不落盘sed -i s/^$// textfile只是把空行替换为空内容不变。P31图片题考察 sed 的替换流ll | sed -e s,file,text,g——g表示全局替换s,file,text,用逗号作分隔符把每行中所有file替换为text。由于目录项file1.txt等文件名中的file全部被替换正确输出为text1.txt、text2.txt……见下图题目截图。P61 只替换“倒数第二个 variable”varA constant is a variable that is a variable that isnt variable echo $var | sed s/\(.*\)variable\(.*variable\)/\1rock\2/\(.*\)variable\(.*variable\)用两个捕获组定位第一个.*贪婪吃掉前面所有内容使匹配落在倒数第二个variable上替换为\1rock\2后得到A constant is a variable that is a rock that isnt variable。P73 的 here-documentcat EOF ------------------------ This is line 1. This is line 2. This is line 3. ------------------------ EOFEOF开启 here-docEOF结束标记cat原样输出包括缩进与分隔线因此答案是 C保留原始格式。五、条件测试与运算符5.1 set -e 与退出码P8、P25、P29set -e让 Bash 在任何命令、命令列表、复合命令或管道返回非零退出码时立即退出脚本P8。注意被条件语句if/while直接测试的命令不受影响。P25 的(( $a $b ))是算术比较等价于测试两变量值是否相等echo $?打印上一条命令的退出码0 表示真、非 0 表示假。$?正是检查上一条命令是否成功的专用变量P29$$是当前 shell 的 PID$!是最近后台任务的 PID$是所有位置参数。5.2 单方括号、双方括号与算术括号P32、P35、P42、P47、P57[ ... ]是 shell 内建命令P35本质是test的别名read -p Enter your pet type. PET if [ $PET dog ] ;then echo You have a dog fiP32 指出该脚本的缺陷若用户直接回车不输入$PET为空展开后变成[ dog ]报unary operator expected错误。修复方式是给变量加引号if [ $PET dog ]。P57 是重定向陷阱if [ $var 5 ]中的在单括号内不是比较运算符而是输出重定向——会创建一个名为5的文件var8时[ 8 ]因为8非空字符串返回真所以看似“正常”但目录里多出的5文件暴露了问题。正确写法是[ $var -gt 5 ]或(( var 5 ))。数值与字符串比较P47、P84(( num 5 ))是算术求值支持 [ $num -gt 5 ]用-gt/用于字符串比较。英文原版 Q84 进一步说明[[ $A $B ]]与[[ $A -eq $B ]]的差异用于字符串比较-eq用于数值比较。5.3 case 语句P26、P27、P65case $num in 1) echo one ;; 2) echo two ;; *) echo a mystery ;; esac;;表示结束当前分支P26*是通配分支匹配任意值充当默认兜底P27esac是case倒拼标志整个求值块结束P65。六、glob 通配与扩展匹配6.1 find 与文件名通配P23、P70find . -name \*.html -print反斜杠转义*防止 shell 提前展开让 find 自己处理模式才能递归列出所有.html文件。find . -name *.html在含.html文件的当前目录会先被 shell 展开成具体文件名从而漏掉子目录。P70 的“不显示任何错误”写法find $HOME -name *.csv 2/dev/null2/dev/null丢弃权限错误$HOME展开家目录递归打印所有.csv完整路径。6.2 大括号展开与范围P28touch file{1..10}.txt{1..10}大括号展开生成file1.txt到file10.txt十个文件。{110}、{1-10}是非法语法。6.3 extglob 扩展通配P40、P48、P56启用shopt -s extglob后可用的模式模式含义(pat1\|pat2)恰好匹配其中一个(pat)一个或多个*(pat)零个或多个?(pat)零个或一个!(pat)除 pat 之外P40ls Hello[[.vertical-line.]]World中[[.vertical-line.]]是字符类等价语法表示字符|所以匹配的是Hello|World。P48shopt -s extglob ls -l (ba*(na)|a(p)le)(...|...)恰好匹配两个分支之一ba*(na)匹配ba后跟零个或多个na→ 命中bananaa(p)le匹配a加一个或多个p再接le→ 命中apple。bananapplebananapple两个分支都不匹配因此输出只有apple与banana。P56 的反向删除shopt -s extglob rm !(*gif|*jpg)!(*gif|*jpg)匹配“不以 .gif 或 .jpg 结尾”的所有文件删除后只剩image1.gif、image1.jpg、image2.gif、image2.jpg。6.4 方括号否定与范围P72ls -l file[^abc]*.txt[^abc]中的^表示否定——匹配文件名第 5 个字符不是 a/b/c 的.txt文件因此输出file1.txt和file10.txt。6.5 组合题扩展 glob 反向删除目录内容Q60 图片题对应 P58题目截图展示了以下场景在foo目录内ll列出 9 个file*.txt文件然后cd ..回到上级执行rm * foo/。*会匹配当前目录家目录下所有可见文件并删除它们因此结果是删除当前目录家目录中的所有文件——foo/作为参数只是让 rm 处理该目录并不会保护家目录中的文件。这是“通配符 目录参数”组合的经典陷阱。七、数组、循环与迭代7.1 数组切片删除元素P36Linux(Debian Redhat Ubuntu Android Fedora Suse) x3 Linux(${Linux[]:0:$x} ${Linux[]:$(($x 1))}) echo ${Linux[]}${Linux[]:0:3}取前 3 个元素Debian Redhat Ubuntu${Linux[]:4}取从索引 4 开始的元素Fedora Suse拼接后跳过索引 3 的Android输出Debian Redhat Ubuntu Fedora Suse。7.2 关联数组与 C 风格 forP39declare -A ARRAY([user1]bob [user2]ted [user3]sally) KEYS(${!ARRAY[]}) # ${!ARRAY[]} 取所有键 for (( i0; $i ${#ARRAY[]}; i1 )); do echo ${KEYS[$i]} - ${ARRAY[${KEYS[$i]}]} donedeclare -A声明关联数组${!ARRAY[]}提取键集合存入索引数组KEYS再用 C 风格for (( i0; i...; i1 ))按下标遍历输出每个键值对如user1 - bob。7.3 遍历目录文件的写法P44for i in $(ls); do ... done是遍历目录文件的常见写法for $ls之类则语法错误。八、脚本执行、权限与安全模型8.1 shebang 与可执行位P20、P62、P88、P90脚本首行 shebang 的标准写法是#!/usr/bin/env bashenv会在$PATH中定位 bash比硬编码/bin/bash更可移植P20、P88。让脚本像系统命令一样执行还需两步chmod x script.shP62赋予执行位且$PATH包含脚本所在目录。若脚本没有 shebang 或执行权限仍可用bash script.sh显式调用解释器运行P90。8.2 三种执行方式对比P22假设当前目录就是家目录运行demo.sh有三种正确方式./demo.sh # 相对路径 执行位B ~/demo.sh # 波浪号展开家目录路径C bash demo.sh # 显式用 bash 解释器E/home/demo.sh依赖具体路径A 不保证通用bash /home/demo.shD虽可行但不属于“当前位置”的最直接答案。8.3 SUID、ACL 与权限字符串P12、P38、P50、P59、P71SUIDsetuidP12当命令被执行时运行权限提升到该命令属主的权限典型如passwd。属主执行 → 以属主权限运行。权限字符串末尾的P38、P50-rwx------中的表示该文件存在ACL访问控制列表ls -l只显示传统 9 位权限ACL 可能给user2额外授予读、写、执行权限。DAC 与 SELinuxP59SELinuxMAC 层的策略检查发生在传统 DAC属主/属组/其他权限位检查之后。提示符#P71默认提示符以#结尾表示当前用户是root普通用户是$。8.4 环境与别名P37、P54、P69跨会话保存 shell 环境修改写入~/.profile登录 shell 启动时读取P37。shell 依据$PATH变量查找可执行程序P54。定义命令别名alias lhls -lahP69之后输入lh即执行ls -lah。九、历史记录、提示符与高频日常命令9.1 历史搜索与共享P14、P33、P43(reverse-i-search)反向增量搜索历史按Ctrl RMac 上显示为bck-i-search:P14。从历史中找最近执行的 cp 命令history | grep cpP43。让多个终端共享/合并历史shopt -s histappendP33——退出时把当前会话历史追加到历史文件避免互相覆盖。9.2 提示符定制P17export PS1HALPS1是主提示符变量export使其传递给子进程立即生效P17。9.3 目录切换与用户信息P51、P60cd -回到上一个工作目录P51等价于cd $OLDPWD。w显示当前登录机器上的用户及其活动信息P60。9.4 输入交互与文件描述符P9、P19、P52read内建命令从标准输入读取一行并赋给变量实现脚本暂停等待输入P9。结束标准输入输入Ctrl DWindows/Command DMac发送 EOF 标志P19。cat notes -把标准输入内容写入notes文件P52。9.5 数值计算精度P15、P79var$(echo scale2; 10 / 8 | bc) # bc 支持小数精度输出 1.25expr 10 / 8、(( 10 / 8 ))、$(( 10 / 8 ))都只做整数除法得 1P79 中echo $((4/3))输出 1只有借助bc计算器并指定scale才能得到精确小数P15。十、特殊变量速查表以下变量贯穿测验多个题目汇总如下变量含义出处$0脚本名称P49$#位置参数个数P49注释、英文版 Q87$所有位置参数每个引号参数视为独立实体P34、P49$*所有位置参数视为单个整体字符串P34$$当前 shell 的 PIDP75、P49注释$!最近后台进程的 PIDP29干扰项$?上一条命令的退出状态P29$PATH可执行程序搜索路径P54$HOME当前用户家目录P70P34 的要点$把每个引号参数当作独立实体$*把整个参数串当作一个实体——在带引号的场景$vs$*差异尤为明显。十一、综合实战演练把考点串成脚本11.1 去掉空行与去空白P6、P76 综合# 就地删除空行 sed -i /^$/d textfile # 去掉变量首尾空白extglob 参数展开 shopt -s extglob VAR${VAR##([[:space:]])}; VAR${VAR%%([[:space:]])}11.2 安全遍历与算术判断# 对带空格文件名安全的循环 for i in *.jpg; do mv $i ${i%.jpg}_new.jpg; done # 数值比较避免 [ $var 5 ] 的重定向陷阱 if (( var 5 )); then echo $var is greater than 5; fi11.3 读写文件描述符exec 3 out.txt # 打开 fd 3 读写 read -n 4 3 # 读前 4 字符 echo -n 5 3 # 从当前位置覆盖写入 exec 3- # 关闭11.4 后台任务与退出码检查long_task bg_pid$! # 记录后台任务 PID wait $bg_pid echo $? # 检查任务退出状态十二、如何继续深入仓库资源导览若想系统自测可以直接对照仓库中的多个语言版本逐题练习英文原版 bash-quiz.md 共 94 题比西班牙语版多出 Q78~Q94涵盖 nice 值范围、回文正则匹配sed -E -n /^(.)(.)(.)\2\1$/p、${VAR^}大写化、 与 覆盖/追加差异、find ... -exec cat {} \; | wc -l统计行数等进阶题而 bash-quiz-es.md 的 77 题与之一一对应可作为双语对照练习。图片题所用的终端截图存放在 bash/images/Q30/ll | sed -e s,file,text,g的题目与四个选项和 bash/images/Q60/question.pngrm * foo/题目可结合截图理解命令行为。仓库还提供法语 bash-quiz-fr.md、意大利语 bash-quiz-it.md 与中文 bash-quiz-ch.md 版本配合 translate.py 脚本可了解多语言题库的生成流水线。建议练习方式先不看答案完成 77 题自测把做错的题按“变量展开 / 重定向 / 文本处理 / 条件测试 / glob / 数组 / 权限”七个主题归类再回到本文对应章节精读解析最后在真实 shell 中逐一复现文中命令注意rm、chmod类命令仅在可控测试目录中演练把考点转化为肌肉记忆。赞分享文档教程知识库教育【免费下载链接】linkedin-skill-assessments-quizzesFull reference of LinkedIn answers 2024 for skill assessments (aws-lambda, rest-api, javascript, react, git, html, jquery, mongodb, java, Go, python, machine-learning, power-point) linkedin excel test lösungen, linkedin machine learning test LinkedIn test questions and answers项目地址https://gitcode.com/GitHub_Trending/li/linkedin-skill-assessments-quizzes点击查看免费下载相关推荐Autodesk Fusion 360 技能测验精讲36 道高频考点与正确答案全解析基于 linkedin-skill-assessments-quizzes 题库Autodesk Fusion 360 技能测验精讲36 道高频考点与正确答案全解析基于 linkedin skill assessments quizze文档教程知识库教育Adobe Premiere Pro 技能测验精讲linkedin-skill-assessments-quizzes 仓库 48 道经典考点全解析Adobe Premiere Pro 技能测验精讲linkedin skill assessments quizzes 仓库 48 道经典考点全解析 本文以开文档教程知识库教育LinkedIn 会计技能评估测验繁体中文版核心考点全解析46 道真题的内部控制、财务报表与成本会计精讲LinkedIn 会计技能评估测验繁体中文版核心考点全解析46 道真题的内部控制、财务报表与成本会计精讲 导读 本文以仓库中的 accounting/a文档教程知识库教育上一篇如何用AI News Radar实现24小时AI资讯智能聚合从信息过载到精准阅读下一篇Vue Storefront服务端渲染优化数据预取与缓存策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表