0.缘起
前段时间,有一次调试.sh时废了好大功夫,单独执行各行指令,可以,但是存储为.sh就不行了,最终发现,我漏加了文件头部的那个声明:
#!/bin/bash
https://wikimili.com/en/Stephen_R._Bourne
命令行输入:
bash xxxxx.sh
也立马可以运行。
因为对sh不是很熟悉,今天在编写if -else分支时,再次遇到问题:
./first_record.sh: line 7: syntax error near unexpected token `then'
./first_record.sh: line 7: `if[ $num_args -eq 0 ]; then'
注意那个if后面少了一个空格。不仅仅如此,空格对bash非常重要,甚至设置语句不允许有空格,这些如此严格的语法规则让我头疼,然后有了下面的AI对答:
1.关于bash的知识
1.1bash脚本怎么会那么严格?比如if,空格都不能省,这个shell是什么时候开发出来的?
Bash 脚本的语法要求是相对严格的,尤其在像 if 语句这样的结构中,空格的正确使用至关重要。这是因为 Bash 脚本的解析器需要明确地知道每个命令的各个部分。例如,在 if 语句中,关键字和条件之间必须有空格,这样解析器才能正确地解析和执行代码。
Bash 的历史
Bash(Bourne Again SHell)是一个 UNIX Shell,它是由 Brian Fox 为 GNU 项目编写的。Bash 是对早期 Bourne Shell (sh) 的增强版本。它包含了许多新的功能,例如命令行编辑、命令补全和更多的编程功能。Bash 的开发历史如下:
1989年:Brian Fox 开始开发 Bash 作为 GNU 项目的一部分。
1990年:Bash 1.0 版本发布。
1993年:Bash 2.0 发布,增加了许多新功能和改进。
2004年:Bash 3.0 发布,引入了更多的新特性。
2009年:Bash 4.0 发布,增加了数组支持等新特性。
2014年:Bash 4.3 发布,包含了许多 bug 修复和新特性。
为什么空格很重要
Bash 是一个基于命令行的解释器,它使用空格来分隔命令和参数。如果你省略了空格,Bash 可能无法正确解析命令,从而导致语法错误。例如:
if[ $a -eq $b ]; then
echo "a 等于 b"
fi
在上述示例中,if 和 [ 之间缺少空格,这会导致 Bash 解释器无法识别 if 语句的条件部分。正确的写法应该是:
if [ $a -eq $b ]; then
echo "a 等于 b"
fi
Shell 脚本的严格性
这种严格性保证了脚本的可预测性和稳定性,因为每个命令和参数的边界都明确地定义了。这也有助于避免由于解析不清晰而引发的意外行为。
总结来说,Bash 作为一个功能强大且历史悠久的 Shell,设计时非常注重细节和兼容性,因此要求编写的脚本严格遵守语法规则。这些规则帮助确保脚本的准确执行和可靠性。
2.你推荐它的替代品吗?
当然可以!虽然 Bash 是最流行的 shell 之一,但还有许多其他的 shell 和脚本语言可以用作替代品,具体选择取决于你的需求和习惯。以下是几种常见的替代品:
- Zsh (Z Shell)
优点: Zsh 是一个功能强大的 shell,提供了丰富的功能,如命令补全、主题、插件支持等。Zsh 被 Oh My Zsh 框架支持,可以方便地管理插件和主题。
使用场景: 适合需要强大交互式体验的用户,尤其是开发人员。
- Fish Shell (Friendly Interactive Shell)
优点: Fish 强调用户友好性,具有自动建议和智能补全功能。语法更加简洁,容易上手,适合新手。
使用场景: 希望快速写出脚本而不被复杂语法困扰的用户。
- Dash (Debian Almquist Shell)
优点: Dash 是一个轻量级的 POSIX 兼容 shell,启动速度快,适用于脚本执行。很多系统在 /bin/sh 中使用 Dash 提高性能。
使用场景: 适合需要极简和高效的脚本环境时。
- Ksh (Korn Shell)
优点: Ksh 具有强大的脚本编写功能,支持很多不错的编程特性,并兼容 Bourne Shell 的大部分语法。
使用场景: 适合需要强大脚本功能而又希望保持与 Bourne Shell 兼容的用户。
- PowerShell
优点: PowerShell 是微软开发的一种跨平台脚本语言和命令行界面,强大的对象管理和命令管道功能使得它在处理复杂任务时非常灵活。
使用场景: 适合 Windows 平台的系统管理和与 .NET 相关操作的用户。
- Python
优点: 虽然 Python 不是 shell,但它可以用于编写脚本,具有人类可读的语法,功能强大,接受广泛。可以结合系统调用,处理文件和文本等。
使用场景: 适合需要编写复杂逻辑或处理数据的情况,更易于维护和扩展。
总结
选择哪种替代品取决于你的具体需求,例如脚本的复杂性、可读性、性能,以及你对语法的熟悉程度。如果你是新手,可能会更喜欢 Fish 或 Zsh,因为它们提供了更友好的用户体验。如果你更关注性能和轻量级,Dash 是一个不错的选择。对于复杂的系统管理任务,PowerShell 或 Python 可能是更合适的选择。
3.是不是bash只是集成在了内核里,人们才更多使用它,你有现在各种sh的使用的分析数据吗?
Bash 并不是集成在 Linux 内核中的,它是用户空间的一个程序。Linux 内核和用户空间是分开的,内核负责管理系统资源,而用户空间的程序(例如 shell)可以与内核进行交互。
Bash 的流行原因
默认 Shell: 在许多 Linux 发行版中,Bash 是默认的命令行 Shell,因此用户在安装系统后通常会使用它。这种广泛的默认使用使得 Bash 成为了许多开发者和管理员的首选。
丰富的功能: Bash 提供了强大的命令行功能,包括脚本编程、命令补全、历史记录、管道等,使得用户可以高效地执行复杂的任务。
POSIX 兼容性: Bash 支持 POSIX 标准,使得许多在 Bourne Shell 中编写的脚本可以无缝迁移到 Bash 中使用。
活跃的社区: Bash 拥有一个庞大活跃的用户群体和社区,提供了大量的文档、教程和支持,便于新手学习和老手进阶。
使用统计数据
关于不同 Shell 的使用统计数据并不总是公开可用,但我可以提供一些一般性的观察:
Bash: 由于其广泛的默认使用和功能,Bash 目前是最流行的 shell。
Zsh: 在开发者特别是 Web 开发人员中日益流行,尤其是与 Oh My Zsh 框架一起使用时。Zsh 的用户数量正在上升。
Fish: 作为一个用户友好的 shell,Fish 近年来也获得了一些关注,尤其是在希望简化命令行体验的用户中。
Dash 和 Ksh: 这些 shell 通常用于特定的场景,如脚本性能优化或兼容性需求,但用户群体相对较小。
数据来源和工具
如果你想获取关于不同 shell 使用的具体统计或分析,可以考虑以下方法:
调查和研究: 一些技术和开发社区会进行调查,例如 Stack Overflow Developer Survey 或 JetBrains 的开发者报告,通常会包含关于开发环境和工具的使用情况的统计信息。
操作系统使用统计: 一些操作系统(如 Ubuntu、Fedora、Debian 等)社区可能会分享关于默认 shell 的使用情况的数据。
GitHub 和开源项目: 开源项目的脚本示例和开发环境设置可以反映出流行的 shell 使用情况。
虽然我无法提供具体的最新使用数据,但以上观察和方法可以帮助你了解 Bash 及其他 Shell 的使用情况。如果你有兴趣获取最新的数据,建议查看相关的社区调查或开发者报告。
4.Bourne 是个法文单词?
"Bourne" 不是法文单词,而是一个英文姓氏。Bourne Shell(通常称为 sh)是由 Stephen Bourne 开发的,这个名字正是来自于他的姓氏。
Stephen Bourne 是一个计算机科学家,他在 1970 年代开发了 Bourne Shell,它成为了 Unix 操作系统的一个标准 shell。Bourne Shell 是早期的 Unix Shell 之一,它为后来的许多 shell(如 Bash 和 Ksh)提供了基础和灵感。
总结来说,"Bourne" 在这里是人名而不是法语单词。
sh的作者还活着!
2.各种sh的使用统计数据
1.2024 Stack Overflow Developer Survey
这个调查报告每年一份。似乎是年终6月底给出当年报告, 这是2024年度的统计
3.bash调试
3.1 bash调试激活
sudo bash -x ./create_video_service.sh
- $'\r'
./create_video_service.sh: 行 2: $'\r': 未找到命令
num_args=$'0\r'
$'\r'
./create_video_service.sh: 行 5: $'\r': 未找到命令
./create_video_service.sh: 行 58: 警告:立即文档在第 33 行被文件结束符分隔(需要 "EOL")
./create_video_service.sh: 行 59: 语法错误:未预期的文件结束符
3.2 典型错误登记
3.2.1 dos-linux格式问题
报警消息:
./create_video_service.sh: 行 2: $'\r': 未找到命令
num_args=$'0\r'
$'\r'
处理:
root@debian-ai:~/video_cycle_storage_test/sub_video_recorder# dos2unix ./create_video_service.sh
dos2unix: 正在转换文件 ./create_video_service.sh 为Unix格式...
root@debian-ai:~/video_cycle_storage_test/sub_video_recorder# sudo bash -x ./create_video_service.sh
num_args=0
'[' 0 -ne 4 ']'
echo 'usage: ./create_video_service.sh <video_file_path> <min_per_file> <rtsp_path> <chIdxbase1>'
usage: ./create_video_service.sh <video_file_path> <min_per_file> <rtsp_path> <chIdxbase1>
- exit 1
3.2.2 乱码
现象:
- echo '���� guide_video_storage_ch05 ������������ɡ�'
���� guide_video_storage_ch05 ������������ɡ�
root@debian-ai:~/video_cycle_storage_test/sub_video_recorder# file -i ./create_video_service.sh
./create_video_service.sh: text/x-shellscript; charset=iso-8859-1
处理:
iconv -f iso-8859-1 -t utf-8 ./create_video_service.sh > /dev/null
附录A 2024 Stack Overflow Developer Survey摘录
Methodology | 2024 Stack Overflow Developer Survey
一些数据摘引:
- 一半程序员没有受过专业的编程训练
- 82%的编程技能提升来自网络,但是新生代更倾向于专门的编程培训
- 技术性文档是90%的编程参考来源
- MySQL, 59%的使用率,PostgreSQL在快速上升,使用率接近50%
- 59%的专业程序员使用docker;npm 45%
- Jira Confluenc异步调用使用场合使用率最高
- JavaScript, Python and SQL是使用广泛的脚本语言,Rust是其中最高的,89%的人使用它。
- 最流行的web框架,73%的人选择Svelte,StackOverflow2024用户调查使用它构建。
- Replit Ghostwrite以及Tabnine是chatgpt之外的使用率最高的AI工具,GitHub Copilot在升温。
- AI在编程各个环节的使用比例: documenting code (81%), testing code (80%), and writing code (76%).
- 六成程序员每个工作日会耗费30分钟以上用于查询一些工作所需的在线技术文档和解决方案。
A.1编程语言使用率统计
|----------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|
| 新人 | 老同志 |
| | |
A.2数据库使用统计
|----------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|
| 新人 | 老同志 |
| | |