推荐 #!/usr/bin/env bash,因其通过 $path 动态查找 bash,兼容 macos、alpine 等非标准路径环境;#!/bin/bash 虽在 centos/ubuntu 等主流发行版中稳定,但跨平台易因路径缺失失败。

脚本第一行写 #!/bin/bash 还是 #!/usr/bin/env bash?
取决于你是否需要跨系统兼容。固定路径 #!/bin/bash 在大多数 Linux 发行版上能直接跑,但某些容器环境或 macOS(特别是较新版本)里 /bin/bash 可能不存在或不是最新版;而 #!/usr/bin/env bash 会动态查找 PATH 中第一个 bash,更健壮。
常见错误现象:./script.sh: /bin/bash^M: bad interpreter —— 这其实是 Windows 换行符(CRLF)导致的,和 shebang 无关,需用 dos2unix script.sh 或在编辑器中切换换行符为 LF。
- 生产环境脚本建议统一用
#!/usr/bin/env bash,尤其涉及 CI/CD 或多平台部署时 - 如果明确只跑在 CentOS/RHEL 7+ 或 Ubuntu 20.04+,
#!/bin/bash完全够用 -
#!/bin/sh不等于#!/bin/bash:前者调用的是 POSIX 兼容 shell(如 dash),不支持数组、[[、$(())等 Bash 特性
为什么 chmod +x 后还是报 “Permission denied”?
权限问题常被误判。真正原因往往不是没加执行权,而是文件系统挂载时用了 noexec 选项,或者脚本放在 NFS、FAT32、NTFS 等不支持 Unix 权限的分区上。
验证方式:mount | grep "$(df . | tail -1 | awk '{print }')" 查看当前目录所在挂载点是否含 noexec;再用 ls -l script.sh 确认 x 位已存在。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
- 临时绕过:用
bash script.sh执行(不依赖文件权限,但会启动子 shell,变量不回传) - 根本解决:重新挂载时去掉
noexec,或把脚本移到/tmp、/home等本地 ext4/xfs 分区 - 注意:
sudo chmod +x对只读文件系统无效,sudo解不了挂载限制
./script.sh 和 source script.sh 的本质区别是什么?
关键在于是否新建 shell 进程。./script.sh 总是 fork 出一个子 shell 执行,脚本里定义的变量、函数、cd 切换等,全部隔离,退出后对当前终端无影响;source(或 .)是在当前 shell 进程内逐行解释执行,所有变更立即生效。
典型误用场景:写了个 export PATH=$PATH:/my/bin 的脚本,用 ./setup.sh 运行完发现 $PATH 没变 —— 因为它只改了子 shell 的环境。
- 适合
./script.sh:独立任务,如备份、日志清理、批量重命名 - 适合
source script.sh:初始化环境、加载函数库、设置别名、修改当前 shell 状态 - 注意:
source不检查 shebang,它忽略第一行,纯按当前 shell 语法解析
变量赋值时加不加引号?什么时候必须加?
不加引号是 Shell 最常见的隐性 bug 来源。只要变量值可能含空格、制表符、通配符(*、?)、路径分隔符(/)或特殊字符,就必须用双引号包裹。
错误示例:file="my file.txt"; cp $file /tmp → 实际执行 cp my file.txt /tmp,被拆成两个参数,cp 报错 “missing destination”。正确写法:cp "$file" /tmp。
- 单引号
'$var':完全禁止变量展开,适合字面量字符串 - 双引号
"$var":允许变量展开和命令替换,但保留空格结构 - 未加引号
$var:触发 word splitting 和 pathname expansion,危险操作 - 例外:用在
[[条件判断中,[[ $var == "abc" ]]可不加引号(但加了更安全)










