概述
1 shell脚本
1.1 脚本讲解
1.1.1 脚本头区别
#!/bin/bash
和#!/bin/sh
#!/bin/bash
和#!/bin/sh
是两种不同的shebang
(也称为hashbang
或者sha-bang
)命令,用于指定脚本文件的解释器。
#!/bin/bash
指定了Bash shell
作为脚本文件的解释器,而#!/bin/sh
指定了POSIX shell
作为脚本文件的解释器。
Bash shell
是一种功能更强大的shell
,它支持更多的特性和语法,包括数组、循环、条件语句等等。而POSIX shell
是一种更加基础的shell
,它只支持最基本的shell
语法和命令。
因此,如果脚本文件中使用了Bash shell
的特性或语法,就需要使用#!/bin/bash
来指定解释器;如果脚本文件中只使用了基本的shell
语法和命令,就可以使用#!/bin/sh
来指定解释器,这样可以提高脚本的可移植性。
1.1.2 调试脚本 xv
如果脚本头是:#!/bin/bash -xv
,这是一个包含了调试模式标志Bash 脚本。在运行脚本时,会显示每个命令的输出和执行过程,以便更轻松地调试脚本
-xv
选项是 bash
的调试模式选项,它会在执行脚本时输出详细的调试信息,包括每个命令的执行结果和变量的值。
-x
选项会输出每个命令执行前
的命令本身-v
选项会输出每个命令执行时
的参数和输入。这些信息可以帮助开发者快速定位脚本中的错误和问题
1.1.3 变量默认值
在shell脚本中设置默认值有两种形式:
${pass:-123456}
:表示如果变量pass
已经设置并且非空,则使用变量pass
的值,否则使用默认值123456
。这是一种参数扩展的形式,用于提供默认值${pass:+123456}
:如果变量pass已经设置(非空),则返回123456,否则返回空字符串。这种扩展通常用于为变量提供默认值unset pass
:用于取消设置变量pass
1.2 游戏类脚本
1.2.1 复杂类猜数字
小游戏源码
#!/bin/sh
function handleNum(){
if [[ $1 -ge 100 ]]
then
echo "开始递归生成随机数字 ......"
handleNum $(($1/10))
else
return $1
fi
}
handleNum $RANDOM
number=$?
while true
do
echo -n "请输入数字:"
read readNumber;
echo $readNumber;
echo -n "是否需要提升(y/n):"
read tip;
echo $tip;
if [[ $readNumber -gt $number ]]
then
echo "your number is bigger ......"
if [ y = $tip ] ; then
echo "the result is $number ,and your number is $readNumber "
fi
elif [[ $readNumber -lt $number ]]
then
echo "your number is smaller ......"
if [ y = $tip ] ; then
echo "the result is $number ,and your number is $readNumber "
fi
else
echo "you are right "
break
fi
done
之所以用函数来生成随机数,就是想练习一下linux语法
1.2.2 简单类猜数字
脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
猜小了或猜大了,直至用户猜对脚本结束。
其中RANDOM
为系统自带的系统变量,值为 0‐32767的随机数
使用取余算法将随机数变为 1‐100
的随机数
#!/bin/bash
num=$[RANDOM%100+1]
echo "$num"
# 使用 read 提示用户猜数字
# 使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),
# ‐lt(小于),‐le(小于等于)
while :
do
read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai
if [ $cai -eq $num ]
then
echo "恭喜,猜对了"
exit
elif [ $cai -gt $num ]
then
echo "Oops,猜大了"
else
echo "Oops,猜小了"
fi
done
1.2.3 石头剪刀布游戏
脚本编写 剪刀 、 石头、布游戏,使用了case
语法
#!/bin/bash
game=(石头 剪刀 布)
num=$[RANDOM%3]
computer=${game[$sum]}
echo "请根据下列提示选择您的出拳手势"
echo " 1. 石头"
echo " 2. 剪刀"
echo " 3. 布 "
read -p "请选择 1-3 :" person
case $person in
1)
if [ $num -eq 0 ]
then
echo "平局"
elif [ $num -eq 1 ]
then
echo "你赢"
else
echo "计算机赢"
fi;;
2)
if [ $num -eq 0 ]
then
echo "计算机赢"
elif [ $num -eq 1 ]
then
echo "平局"
else
echo "你赢"
fi;;
3)
if [ $num -eq 0 ]
then
echo "你赢"
elif [ $num -eq 1 ]
then
echo "计算机赢"
else
echo "平局"
fi;;
*)
echo "必须输入1-3 的数字"
esac
1.2.4 打印国际象棋棋盘
打印国际象棋棋盘
设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘
i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列
i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块
使用 echo ‐ne
打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块
-n
:不换行输出,-e
:开启转义字符功能
#!/bin/bash
for i in {1..8}
do
for j in {1..8}
do
sum=$[i+j]
if [ $[sum%2] -eq 0 ];then
echo -ne "