Shell ==> 基础

一、规范

  • Shell脚本是以.sh结尾的文件;
  • sh 文件的第一行内容为 #!/bin/bash,它告诉系统使用(Bourne Again Shell)解释器来执行;
  • shell 中的注释:# ;
  • shell 文件的执行有两种方式:
    • sh 文件名.sh;
    • 添加可执行权限:chmod +x 文件名.sh ,再进入文件所在目录,执行 ./文件名.sh;

二、变量

  • 变量名=变量值:等于号两边不能有空格;
  • 变量命名规范:不能以数字开头,可以由字母、数字、下划线组成;
  • 输出变量内容:echo $变量名;
  • 变量的释放:unset 变量名;
  • 特殊的变量,带有空格的变量定义
    • 双引号"":如果变量值中存在 $变量名 的话,那么输出结果将会是变量名对应的变量值。如果想原样输出内容,可以在 $变量名 前面加转义字符 “\”;
    • 单引号'':如果变量值中存在 $变量名,那么将原样输出;
    • 反单引号``:存放的是命令;

练习:

#!bin/bash
dir=`pwd`
echo "当前所在的目录是:$dir"
输出当前所在的目录
#!bin/bash
# 进入/etc目录下
cd /etc
# 计算文件个数
num=`ls -al|wc -l`
# 输出
echo "/etc下文件个数为:$num"
计算/etc目录下有多少个文件
#!bin/bash
read -p "请输入指定目录:" dir
cd $dir
# 计算文件个数
num=`ls -al|wc -l`
# 输出
echo "$dir下文件个数为:$num"
统计任何指定目录下的文件个数

read 用法

  • 变量名可以有一个或者多个,变量名用空格隔开,变量值用空格隔开;
  • 如果变量值多于变量名,那么将会把多余的变量值赋值给最后一个变量;
  • 可以添加提示信息:read -p "提示的内容" 变量名;

三、参数传递

  • 命令:文件名 参数,如:sh script.sh /etc;
  • 文件中接收参数的方式
    • $1---> 表示第一个参数;
    • $2---> 表示第二个参数;
    • $n---> 表示第n个参数;
    • $0---> 代表文件名;
    • $@--> 显示全部参数;
    • $#--> 显示参数的个数;

练习:

#!/bin/bash
echo "这个数据是$1"
echo "这个数据是$2"
echo "这是$0"
echo "这是$@"
echo "这是$#"

结果:

Shell ==> 基础_第1张图片

四、重定向

把命令的结果输出到文件中

  • 正确的命令:用 1 表示
    • 覆盖:命令 1>文件名,如:ls 1>a.txt;
    • 追加:命令 1>>文件名,如:ls /tmp 1>>a.txt;
  • 错误的命令:用 2 表示
    • 覆盖:命令 2>文件名,如:ls 2>a.txt;
    • 追加:命令 2>>文件名,如:ls /tmp 2>>a.txt;

五、条件判断

1、if...else

if [ 条件 ]
then
 语句
else
 语句
fi
#####################
if [ 条件 ];then
 语句
else
 语句
fi
if...else语法
  • if 后面要有空格
  • 中括号内条件两边要有空格
  • 多个条件间要有空格
  • 条件中如果存在变量,那么变量的两边要有双引号,如:if [ "$dir" == "" ]

练习:

#!/bin/bash
dir=/root
command=`ls $dir`
if [ "$command" == "" ];then
    echo "目录为空"
else
    echo "目录不为空"
fi
判断/root目录是否为空
#!/bin/bash
read -p "请输入目标目录:" dir
command=`ls $dir`
if [ "$command" == "" ];then
        echo "目录为空"
else
        echo "目录不为空"
fi
通过用户输入任意目录判断是否为空
  • 字符串比较
    • ==:判断是否相等
    • !=:判断是否不相等
#!/bin/bash
read -p "请输入用户名和密码:" username password
if [ "$username" == "admin" -a "$password" == "123456" ];then
        echo "用户名和密码正确"
else
        echo "用户名或密码不正确"
fi
判断用户输入的用户名和密码是否正确
  • 逻辑运算符:
    • 或:-o
    • 与:-a
    • 非:!
#!/bin/bash
read -p "请输入一个数字:" num
if [ "$num" -gt 0 ]
then
        ((num++))
        echo $num
else
        ((num--))
        echo $num
fi
输入数字,判断是否大于0
  • 比较运算符(数字)
    • -eq ---> 判断是否相等
    • -ne ---> 判断是否不相等
    • -gt ----> 判断是否大于
    • -ge ---> 判断是否大于等于
    • -lt ----> 判断是否小于
    • -le ----> 判断是否小于等于
  •  数字变量操作
    • 递增
      • ((i++))
      • ((i+=1))
      • i=$[$i+1]
      • let i=i+1
      • i=$(($i+1))
    • 递减也是一样有上面5中方式
#!/bin/bash
read -p "请输入对应的目录:" dir
if test -d $dir
then
        num=`ls $dir|wc -l`
        echo "目录$dir下的文件个数为:$num"
else
        echo "目录$dir不存在"
fi
判断用户输入的目录是否存在
  • 测试文件状态
    • test 参数 变量名
    • 参数
      • -e:表示文件是否存在
      • -f:表示文件是否存在且为文件
      • -d:表示文件名是否存在且为目录
      • -r:可读
      • -w:可写
      • -x:可执行

2、if...elif..else

if [ 条件 ]
then
 语句
elif [ 条件 ]
then
  语句
elif [ 条件 ]
then
  语句
....
else
  语句
fi
if...elif...else语法

练习:

判断学生的成绩,范围在90-100提示优秀,80-90之间提示良好,70-80之间则提示一般,60-70之间提示及格。其他则提示不及格

#!/bin/bash
read -p "请输入学生的成绩:" score
if [ "$score" -gt 90 -a "$score" -lt 100 ]
then
        echo "优秀"
elif [ "$score" -gt 80 -a "$score" -lt 90 ]
then
        echo "良好"
elif [ "$score" -gt 70 -a "$score" -lt 80 ]
then
        echo "一般"
elif [ "$score" -gt 60 -a "$score" -lt 70 ]
then
        echo "及格"
else
        echo "不及格"
fi
判断学生成绩

判断用户输入的内容是否为空,为空则提示,不为空则判断是否为目录,不为目录则判断是否为文件,否则提示错误信息

#!/bin/bash
read -p "请输入内容:" content
if [ -z "$content" ]
then
        echo "输入内容为空"
elif [ -d "$content" ]
then
        echo "是一个目录"
elif [ -f "$content" ]
then
        echo "是一个文件"
else
        echo "输入错误"
fi
判断用户输入内容
  • 文件判断
    • -r:文件是否存在且可读
    • -w:文件是否存在且可写
    • -x:文件是否存在且可执行
    • -f:文件是否存在且是普通文件
    • -d:文件是否存在且是一个目录
    • -e:文件是否存在
    • -n:字符串长度是否不等于0
    • -z:字符串长度是否等于0

3、case

case $变量名 in
"")
  语句;;
"")
  语句;;
"")
  语句;;
.....
*)
  语句;;
esac
case...esac
  • case 这一行最后必须为 in
  • ;; ----> 结束语句
  • *----> 默认分支
  • esac ---> case语句的结束
  • 值可以是字符串也可以是数字,还可以是区间范围,但是范围必须是:[0-9]之间

练习:

#!/bin/bash
read -p "请输入产品编号:" chr
case $chr in
"001")
        echo "台灯";;
"002")
        echo "风扇";;
"003")
        echo "电脑";;
*)
        echo "默认是空调";;
esac
输入一个字符串,判断该用户选择哪款产品
#!/bin/bash
read -p "请输入对客服的满意度:" chr
case $chr in
[0-3])
        echo "不满意";;
[4-6])
        echo "满意";;
[7-9])
        echo "非常满意";;
esac
满意度调查

六、循环

1、for

for 变量名 in 列表
do
  语句
done
for循环格式

练习:

#!/bin/bash
#循环
for i in 1 2 3 4 5 6 7 8 9 10
do
    echo $i
done
输出1到10之间的数
#!bin/bash
for i in `seq 1 2 10`
do 
        echo $i
done
输出1到10之间的奇数
  • seq start size max
    • start:开始点
    • size:间隔
    • max:结束点
    • 如果size的值为1,则可以省略

2、while

while [ 条件 ]
do
    命令
done
while循环格式

练习:

#!bin/bash
i=1
sum=0
while [ "$i" -le 100 ]
do
        ((sum=sum+i))
        ((i++))
done
echo $sum
求1-100之间的和

七、函数

函数名(){
  代码
}
函数格式
  • 函数的调用
    • 必须先定义再调用
    • 格式:直接使用函数名
  • 函数中的参数
    • 使用$n来接收数据
  • 返回值
    • 函数中默认的存在返回值
    • 正确时返回0
    • 错误时返回1
    • 查看返回值内容:$?

练习:

#!/bin/bash
# 定义函数
add(){
        sum=$(($1+$2))
return $sum
}
# 从键盘输入
read -p "请输入第一个数字:" aNum
read -p "请输入第一个数字:" bNum
echo "输入的两个数分别为:$aNum 和 $bNum"
add $aNum $bNum
# 输出返回值
echo "两个数之间的和为:$?"
输入任意两个整数进行求和运算

输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名,判断创建的文件是否存在,如果不存在,则继续创建,否则提示该文件已经存在,用函数实现

#!/bin/bash
# 创建文件函数
create_file(){
        # 进入目录
        cd $1
        # 提示用户输入文件名
        read -p "请输入需要创建的文件名:" filename
        # 判断文件是否存在
        if test -e $filename
        then
                echo "文件已存在"
        else
                echo "文件不存在"
                echo "开始创建文件..."
                touch $filename
                echo "文件创建成功"
        fi        
}

# 提示用户输入
read -p "请输入目录名:" dir
if test -d $dir
then
        # 调用创建文件函数
        create_file $dir
else
        echo "目录$dir不存在"
fi
创建文件

你可能感兴趣的:(Shell ==> 基础)