开发工具

Shell 单小括号()

13 篇文章69 次收藏

在 Shell 中,单小括号 () 有多种用途,主要包括命令分组、子 Shell 执行、数组定义和算术运算等。以下是详细的解释和示例:

1. 命令分组(子 Shell 执行)

功能:在 () 中执行的命令会在一个子 Shell(新的进程)中运行,不会影响当前 Shell 的环境变量。

示例:

(cd /tmp && ls)  # 在子 Shell 中切换目录并列出文件,当前 Shell 的目录不变
echo $PWD        # 当前 Shell 的目录未改变


2. 初始化数组

功能:用 () 定义数组元素。

示例:

fruits=("apple" "banana" "cherry")
echo ${fruits[1]}  # 输出 "banana"(索引从 0 开始)


3. 命令替换(与 $ 结合)

功能:$(command) 会先执行 command,并将其输出作为结果替换到当前位置。

示例:

current_date=$(date)
echo "Today is $current_date"


4. 算术运算

功能:$(( )) 用于整数算术运算(无需 expr 命令)。

示例:

sum=$(( 5 + 3 ))
echo "5 + 3 = $sum"  # 输出 "5 + 3 = 8"


5. 进程替换(结合 < 或 >)

功能:将命令的输出作为临时文件传递给其他命令(常用于需要文件输入的场合)。

示例:

diff <(ls dir1) <(ls dir2)  # 比较两个目录的文件列表


6. 定义函数体

功能:() 用于定义函数的主体部分。

示例:

greet() { echo "Hello, $1!"; }
greet "Alice"  # 输出 "Hello, Alice!"


7. 结合 case 语句

功能:在 case 语句中,) 用于匹配模式的分支。

示例:

fruit="apple"
case $fruit in
    "apple") echo "It's an apple." ;;
    "banana") echo "It's a banana." ;;
esac


8. 子 Shell 中的变量隔离

功能:子 Shell 中的变量修改不会影响父 Shell。

示例:

var=1
(
    var=2
    echo "Inside subshell: var=$var"  # 输出 "Inside subshell: var=2"
)
echo "Outside subshell: var=$var"    # 输出 "Outside subshell: var=1"


注意事项

1、子 Shell 开销:() 会启动新进程,频繁使用可能影响性能。

2、与 {} 的区别:{} 是当前 Shell 中分组命令(不创建子 Shell),而 () 会创建子 Shell。

{ cd /tmp; ls; }  # 在当前 Shell 中执行,目录会改变
(cd /tmp; ls)     # 在子 Shell 中执行,目录不变


通过灵活使用 (),可以高效地完成命令分组、数组操作、算术运算等任务,同时保持 Shell 脚本的清晰性和可维护性。