shell脚本是什么
Shell脚本是利用shell功能所写的程序,是纯文本文件,将shell的语法和指令搭配正则表达时候、管道命令、数据流重定向等功能,实现想要的处理。
shell脚本的基础语法
- shell脚本第一行
#!bin/bash
,告诉系统该脚本是bash语法,使用/bin/bash程序执行; - 除去第一行以外,
#
开头的行是注释,程序不会执行; - shell脚本的执行方式:
sh myshell.sh
、./myshell.sh
或source myshell.sh(. myshell.sh)
,前两者会创建一个子bash程序来执行shell脚本,执行完后又回到原bash,因此子bash和原bash的变量不共享。后者直接在原bash执行,共享变量;
- 可以通过read和echo命令与用户交互,用户可以从终端输入数据;
- 用declare声明变量,声明时可以直接初始化;
${var}
可以获取变量的值,$(command)
可以让程序先执行command命令,如nowdate=$(date +%Y%m%d)
;- 命令支持数值运算,如
value=${var1}+${var2}
; - 条件判断有几种语法:test命令、判断符号[]、
if...then...elif...then...else...then...
、case...in...esac
; - 循环有几种语法:
while […] do … done
,until […] do … done
,for … in … do … done
- 支持定义函数:
function funname(){}
; - 特殊变量:
- $0,$1,$2…分别表示执行命令和各个入参,如
./mushell.sh para1 para2
,$0=./mushell.sh, $1=para1 $2=para2 - $#: 入参个数,如上述示例 $#=2
- $@: 入参拼接,用空格隔开,如上述示例 $@=para1 para2
- $*: 入参拼接,可以指定分隔符,默认是空格,即默认等于 $@
- $0,$1,$2…分别表示执行命令和各个入参,如
- shell支持debug调试:
sh -x myshell.sh
示例
实现一个根据输入生日日期计算年龄的程序:
#!/bin/bash
read -p "input your birthday:" birthday
if [ "$(echo ${birthday} | grep '[0-9]\{8\}')" == "" ]; then
echo "input birthday error! birthday format : YYYYMMDD"
exit 1
fi
declare -i now_time=$(date +%s)
declare -i birth_time=$(date --date="${birthday}" +%s)
declare -i diff_time=$((${now_time}-${birth_time}))
test ${diff_time} -lt 0 && echo "input birthday error! later then today!" && exit 1
declare -i diff_day=$((${diff_time}/60/60/24))
declare -i diff_year=$((${diff_day}/365))
echo -e "your age is ${diff_day} days!"
echo -e "${diff_year} years $((${diff_day}-${diff_year}*365)) days"
输入8位生日日期,计算年龄:
(后续有新增内容再补充)