Shell脚本编写技巧:从小白到高手,你只差这几个关键点!1. 引言:写Shell脚本,真的只是简单拼命令吗?很多人刚接触 Linux Shell 的时候,都会有个错觉——“不就是把几条命令写到一个 .sh 文件里然后执行吗?” 但当你真正开始写复杂的 Shell 脚本,问题就来了:
变量莫名其妙不对,怎么 $var 和 ${var} 差别这么大? 条件判断写不对,到底 if [ 条件 ] 还是 if [[ 条件 ]]? 循环执行却没效果,for 和 while 看不懂? 日志输出乱七八糟,想把执行过程记录下来却总出错? Shell 脚本的坑真的不少,但只要掌握几个关键技巧,你就能从“小白”进阶成 Shell 高手!
2. 变量和字符串处理:别再掉进 $ 和 {} 的坑!Shell 脚本中,变量是基础,但很多人经常搞混 $var 和 ${var} 的区别。这里有一个小技巧:
代码语言:bash复制name="Echo_Wish"
echo "Hello, $name" # 正常输出
echo "Hello, ${name}!" # 这样也可以用,推荐如果变量名和后续字符串容易混淆,比如:
代码语言:bash复制echo "路径:$HOME_DIR"会导致 Shell 误认为 HOME_DIR 是一个新的变量,而它其实应该是 HOME + _DIR。正确写法是👇
代码语言:bash复制echo "路径:${HOME}_DIR"🔹 小技巧:字符串截取和替换有时候,我们需要从变量里提取特定的部分,比如文件名去掉扩展名👇
代码语言:bash复制file="document.txt"
echo "${file%.*}" # 输出:document或者替换某些字符👇
代码语言:bash复制text="hello world"
echo "${text/world/universe}" # 输出:hello universe这些小技巧能让你的 Shell 脚本更简洁高效!
3. 条件判断:[ ] 还是 [[ ]],到底该用哪个?很多 Shell 脚本写 if 判断的时候,[ ] 和 [[ ]] 傻傻分不清楚。简单来说:
[ 是 老式 Shell 用的,功能较弱。[[ 是 Bash 提供的,功能更强大,推荐使用! 来看对比👇
代码语言:bash复制value=10
if [ $value -eq 10 ]; then
echo "传统写法:值是 10"
fi
if [[ $value -eq 10 ]]; then
echo "推荐写法:值是 10"
fi你可能会问,两者的区别到底在哪?最坑的就是字符串比较!
代码语言:bash复制str="hello world"
if [ "$str" == "hello world" ]; then # ❌ 这是错误写法,不能用 `==`
echo "匹配成功"
fi
if [[ "$str" == "hello world" ]]; then # ✅ 这样才对
echo "匹配成功"
fi总结: 字符串比较要用 [[ ]],不用 [!
4. 循环和数组:让你的脚本更智能!🔹 for 循环有时候我们需要遍历多个文件,这时候 for 循环就派上用场了!👇
代码语言:bash复制for file in *.txt; do
echo "处理文件:$file"
done这个语法会遍历当前目录下所有 .txt 文件并执行操作。
🔹 while 循环如果你希望一直等待某个服务启动,可以用 while👇
代码语言:bash复制while ! ping -c 1 example.com > /dev/null 2>&1; do
echo "等待服务器启动..."
sleep 5
done
echo "服务器已启动!"5. 日志输出与调试技巧编写 Shell 脚本时,最头疼的莫过于不知道哪里出错,所以日志输出和调试非常重要。
🔹 让日志更专业代码语言:bash复制LOGFILE="/var/log/script.log"
echo "$(date): 脚本开始执行" >> "$LOGFILE"这样每次执行都会把日志存入文件,方便以后排查问题。
🔹 set -x 调试模式如果你的脚本执行出错,可以在脚本开头加一句:
代码语言:bash复制set -x # 开启调试模式这样,每一行执行的内容都会显示出来,方便找问题。
如果调试完毕,关闭调试模式:
代码语言:bash复制set +x # 关闭调试模式这招在排查 Bug 方面超级好用!
6. 结语:Shell脚本真的很有趣!很多人觉得 Shell 只是拼命令,但其实,它能做到的事远超你的想象:
可以写智能运维脚本,自动清理日志、监控服务器状态。可以做批量处理,快速整理数据、批量重命名文件。可以自动化运维,像运维神器一样减少重复性工作。