shell脚本格式
#! /bin/bash
# author :jack
# date: 2020-5-20
# for study
.........
- 文件首行指定执行shell的程序以及相关说明
-
shell
脚本文件后缀,建议命名为.sh
- 脚本执行失败时,使用
exit
返回非零值,来退出程序 - 默认缩进4个空格
-
shell
脚本的命名简单,有意义
注释
单行注释
#
多行注释
:<<!
这是注释
!
案例
vim userinfo.sh
#! /bin/bash
# author :jack
# date: 2020-5-20
# for study
echo "$(cat /etc/passwd)"
- 退出vim
esc :x
执行脚本
bash userinfo.sh
或
sh userinfo.sh
或
./userinfo.sh (没有权限的情况下,chmod +x userinfo.sh) #./之间没有空格
函数
- 格式
function 函数名()
{
命令1
命令2
命令3
.....
}
-
function
关键字可省略,如果省略function
,()
不能省 - 没有参数的情况下,也可以省略括号
function hello {
echo "hello,Jack"
}
hello #调用函数
- 调用函数,直接函数名
案例1:
greet(){
echo "hello ${LOGNAME}, today is $(date)"
echo "hello ${LOGNAME}, \n today is $(date)"
echo -e "hello ${LOGNAME}, \n today is $(date)"
}
greet # 调用函数
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
hello root, today is 2020年 05月 31日 星期日 00:08:04 CST
hello root, \n today is 2020年 05月 31日 星期日 00:08:04 CST
hello root,
today is 2020年 05月 31日 星期日 00:08:04 CST
-
${}
引用变量
-$()
引用命令结果 -
echo
加-e
才转义\n
案例2
read -p "请输入你的姓名: " name #$ REPLY
read -p "请输入你的年龄:" age
function info() {
echo -e "你的姓名:${name} \n 你的年龄:${age}"
}
info
-
read
读取用户输入,赋值给name
,如果不用name
接收,默认赋值给REPLY
案例3
function info {
echo -e "你的姓名:$1 \n 你的年龄:$2"
}
info "土豆" 18
- 函数内部的
$1
,$2
接收函数调用时候的实参
案例4
read -p "请输入你的姓名: " name
read -p "请输入你的年龄:" age
#
function info() {
echo -e "你的姓名:$1 \n 你的年龄:$2"
}
info "${name} " "${age}"
-
shell
中参数名不能自定义,2 -
shell
函数不需要写形参 -
传参过程
image.png
案例5
function info() {
echo -e "你的姓名:$1 \n 你的年龄:$2"
}
info $1 $2
- 函数调用时的
$1
,$2
,是命令行传入的值,与函数内部的$1
,$2
不一样
流程控制
if
if [ 条件1 ]
then
指令
elif [ 条件2 ]
then
指令2
else
指令3
fi
read -p "请输入你的年龄"
if [ ${REPLY} -gt 70 ];then echo "回家锻炼身体吧"
elif [ ${REPLY} -gt 18 ]; then echo "热烈欢迎"
else echo "回家写作业"
fi
for
- 格式1:
for 值 in 列表
do
执行语句
done
- 格式2:
max=10
for ((i=1;i<=max;i++))
do
echo "${i}"
done
- 案例
for i in $(ls /) ; do
echo "dir:${i}"
done
dir=$(ls /)
index=1
for i in ${dir}
do
echo "第${index}个文件:${i}"
index=$((index+1))
done
n=10
for (( i = 0; i < n; i++ )); do
echo ${i}
done
while
- 只要满足条件就会一直执行
while [ 条件 ]
do
执行语句
done
- 案例
read -p "输入数字" a
while [ "${a}" -lt 20 ]
do
echo "${a}"
a=$((a+1))
done
until
- 只要条件不满足,就一直循环
until 条件
do
执行语句
done
case
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
if [ ! "$#" -eq 3 ]; then
echo -e "Usge: \n $0 num1 +|-|*|/ num2"
exit 1 # 异常退出程序
fi
case $2 in
+)
echo "$1+$3 = $(($1+$3))"
;;
-)
echo "$1-$3 = $(($1-$3))"
;;
\*)
echo "$1*$3 = $(($1*$3))"
;;
/)
echo "$1/$3 = $(($1/$3))"
;;
*)
echo "不支持的运算符"
;;
esac
exit 0
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
- bash -x 脚本.sh 调试脚本
网友评论