bash
和sh
都是Unix shell,但它们有一些关键的区别,特别是在运行脚本时。(Unix shell 即命令行解释器,用于与操作系统交互。)
- sh(Bourne Shell):这是由Stephen Bourne在1979年开发的Unix shell。它是早期Unix系统的默认shell,语法简单,适合编写基础脚本。(由于它是早期Unix系统的默认shell,脚本在不同系统之间的可移植性更好。编写在
sh
中的脚本在各种Unix和类Unix系统上运行时问题较少。) - bash(Bourne Again Shell):这是GNU项目开发的一个替代和扩展版的Bourne Shell,提供了许多新特性和增强功能,如命令行编辑、历史记录、数组等。它是大多数Linux系统的默认shell。(虽然功能更强大,但并不是所有Unix系统都预装了
bash
,例如一些嵌入式系统或某些BSD系统。)
详细来说:
-
数组支持:
bash
支持一维数组,语法为arr=(element1 element2 element3)
。sh
通常不支持数组(除非特定的实现如dash
提供有限支持)。
-
字符串操作:
bash
有更丰富的字符串操作功能,例如字符串替换、子字符串提取等。sh
的字符串操作功能相对有限。
-
语法扩展:
bash
支持许多扩展语法,如[[ ... ]]
、<(...)
、> /dev/tcp/...
等。sh
支持的语法较为简单,只支持[ ... ]
。
使用
通过在脚本开头添加
#!/bin/bash
,明确指定使用bash
解释器。#!/bin/bash
arr=(1 2 3)
echo "Array element: ${arr[0]}"
通过在脚本开头添加
#!/bin/sh
,明确指定使用sh
解释器。#!/bin/sh
for i in 1 2 3; do
echo "Number: $i"
done
bash数组操作:
#!/bin/bash
arr=(1 2 3)
echo "Array element: ${arr[0]}"
bash条件判断:
#!/bin/bash
if [[ -f "file.txt" ]]; then
echo "File exists"
fi
sh条件判断:
#!/bin/sh
if [ -f "file.txt" ]; then
echo "File exists"
fi