Shell 脚本入门:变量、判断与循环一次讲清
先写一个能跑的脚本
写 Shell 脚本不需要先学一门新语言:你每天在终端敲的命令,换个文件存起来就是脚本。新建一个文件 deploy.sh,第一行写 #!/bin/bash,下面按顺序写命令,保存后 chmod +x deploy.sh,再 ./deploy.sh 就能跑。这一行叫 shebang,告诉系统用哪个解释器执行这个文件;丢了它,系统会用默认 shell 跑,行为可能不一样。
变量:等号两边别加空格
给变量赋值是最先踩坑的地方:name="world" 是对的,name = "world" 是错的——等号两边一旦有了空格,shell 会把 name 当成一条命令去执行。引用变量用 $name,想让变量传给子进程再加 export。还有两个习惯值得养成:变量名用小写或有意义的名字,别用单个字母;凡是可能为空的变量,引用时加双引号写成 "$name",空值时不会把命令拆散。
判断:if 语句的括号里有讲究
Shell 的判断写在方括号里:if [ -f "$file" ]; then echo "文件存在"; fi。常用的测试有 -f(是文件)、-d(是目录)、-z(字符串为空)、字符串相等用 =、数字比较用 -eq、-gt、-lt。注意两个细节:左括号 [ 后面和右括号 ] 前面必须有空格,因为 [ 本身就是一条命令;变量一定要加引号,否则变量为空时 [ = "x" ] 会直接报语法错。
循环:for 和 while 各管一摊
明确要遍历什么用 for:for f in *.log; do echo "$f"; done 能逐个处理当前目录下的日志文件;for i in $(seq 1 10); do ...; done 用来数数。不知道循环几次、要一直等某个条件时用 while,比如 while read line; do echo "$line"; done < list.txt 逐行读文件。循环体里 break 跳出、continue 跳过本次,行为和别的语言一样。
一个完整的小例子
把上面几点拼起来,就是一个能用的备份脚本:遍历 *.log,先判断备份文件是否已存在,存在就跳过,不存在就复制一份加 .bak。十来行代码,手动操作半小时的活一秒干完。脚本的价值就在这里:把“这次手动敲一遍,下次还得敲”的操作固化下来。
三个新手最容易踩的坑
第一,文件从 Windows 传过来时行尾可能带上 \r,执行会报 bad interpreter,用 dos2unix 或 sed -i 's/\r$//' 处理一下。第二,脚本开头加上 set -e,任何一条命令出错整个脚本立刻停下,比让它带着错误继续跑要安全。第三,别在脚本里写绝对路径的密码或密钥,敏感信息走环境变量传进来,脚本只负责干活。
- 点赞
- 收藏
- 关注作者
评论(0)