循环用 glob,返回值用退出码
一句话总结
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