shell脚本编写

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中参数名不能自定义,1,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 调试脚本
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。