Bash 入门:先弄清变量、条件与循环这三件事
刚开始写 Bash 脚本,很多人会先去背一堆命令:ls、grep、awk、sed……命令当然要学,但真正决定脚本能不能跑稳的,往往是更基础的三件事:变量、条件与循环。把这三件事弄清楚,再去学具体命令,效率会高很多。
一、变量:先给数据起个名字
变量就是给一个值起的名字,方便后面反复使用。Bash 里赋值时等号两边不能有空格,写成 name=backup 是对的,写成 name = backup 就会报错,因为 Bash 会把 name 当成命令。
name="backup"
today=$(date +%Y%m%d)
echo "正在打包 ${name}_${today}.tar.gz"
引用变量要用 $name,花括号可以把变量名和后面的文字分开,比如 ${name}_bak 就不会被误读成一个叫 name_bak 的变量。单引号里的变量不会展开,双引号里的会展开,例如 echo '$name' 原样输出 $name,而 echo "$name" 输出 backup。需要保存命令结果时,用 $(...),比如 today=$(date +%Y%m%d)。不确定的变量可以先给默认值,写法是 ${name:-backup}。
二、条件:让脚本自己做判断
脚本不是一路执行到底,遇到不同情况要走不同的路,这就是条件。最常用的是 if,里面用 [ ] 或 [[ ]] 做测试:
if [ -f "report.txt" ]; then
echo "文件存在,开始处理"
else
echo "文件不存在,先退出"
exit 1
fi
常用的测试有:-f 判断是不是普通文件,-d 判断是不是目录,-z 判断字符串是否为空,-n 判断是否不为空。数字比较用 -eq 等于、-ne 不等于、-gt 大于、-lt 小于;字符串比较用 = 和 !=。多个条件可以用 && 表示并且,用 || 表示或者。写 if 时注意 then 前面要有分号或换行,结尾别忘了 fi。需要多分支时,再加 elif,比如先判断参数个数,再判断文件类型。
三、循环:把重复的事交给机器
同样一件事要做很多次,就不要一行行复制粘贴,交给循环。for 适合次数或范围明确的情况,while 适合条件成立就一直做的情况:
for file in *.log; do
echo "正在处理 $file"
done
count=0
while [ $count -lt 3 ]; do
count=$((count + 1))
echo "第 $count 次检查"
done
循环里可以用 break 提前跳出,用 continue 跳过这一次、直接进入下一次。遍历文件时,最好把 "$file" 加上双引号,这样文件名里有空格也不会被拆成两部分。
把三件事连起来
一个能用的小脚本,通常就是变量加条件加循环的组合。下面这段例子先用变量定好目录,再用条件判断目录在不在,最后用循环逐个处理里面的日志文件:
dir="logs"
if [ ! -d "$dir" ]; then
echo "目录 $dir 不存在"
exit 1
fi
for file in "$dir"/*.log; do
echo "正在处理 $file"
done
写脚本时多留心三个小坑:赋值时等号两边不要加空格;用变量时别忘了在变量名前加 $;if 和循环的结尾分别是 fi 和 done,别写混。先把变量、条件与循环练熟,再去学管道、函数和文本处理,Bash 这条路就顺了。你可以先做一个小练习:写一个脚本,统计当前目录下有多少个 .txt 文件,如果一个都没有,就输出提示。
- 点赞
- 收藏
- 关注作者
评论(0)