LabHub
学习 学习路径 课程

Shell 脚本

循环用 glob,返回值用退出码

在 LabHub 中继续学习

一句话总结

Shell 函数用退出码表达成功或失败,用标准输出返回计算值;文件列表不应通过解析 ls 获得。

循环图: 一句话总结 · 循环与函数 · 原文命令与标识符

循环与函数

遍历文件应让 Shell 直接展开 glob,并处理无匹配时模式原样保留的情况。逐行读取应为 read 设置局部 IFS 并禁用反斜杠转义。函数内变量默认是全局的,因此应使用 local;转发参数时要逐个保留参数边界。

公共函数可放进库文件,在当前 Shell 中加载。循环内频繁启动 sed 等外部命令会造成大量进程,应优先使用参数展开。并行任务必须逐个等待并收集退出状态。

严格选项各有例外:errexit 在条件上下文中不会触发,nounset 要为可选参数提供默认值,pipefail 用于传播管道前段失败。临时资源应通过 EXIT trap 清理。

原文命令与标识符

for f in /var/log/*.log; do
  [ -f "$f" ] || continue
  ...
done

ls

for f in $(ls *.log)

ls

access 2026.log

ls

[ -f "$f" ] || continue

/var/log/*.log

for x in a b c

for f in 경로/*.log

while IFS=, read -r name role; do ... done < users.csv

IFS=,

read

-r

echo

return 0

return 1

is_number 123

echo yes

if is_number "$x"

"$@"

$*

"$@"

$*

"$@"

local

local

lib.sh

. /root/bin/lib.sh

source

.

$(echo "$v" | sed ...)

${v//old/new}

xargs -P

& + wait

wait "$pid"

set -e

&&

||

!

set -e

set -u

rm -rf "$PREFX/"

rm -rf /

${1:-}

set -o pipefail

curl ... | jq ...

set -u

trap 'rm -rf "$TMP"' EXIT