Shell | 初识Shell 1

2019-09-24  本文已影响0人  Ricsy


一、初识Shell


二、Shell脚本规范

第一种方式:
sh [].sh

第二种方式:
chmod +x [].sh
./[].sh


三、Shell语法

3.1 变量

3.1.1 定义变量

格式:变量名=变量值

注意:

  • 变量名与=、变量值与=没有空格
  • 变量值有空格时,需加单引号或双引号

提示:

  • 输出变量值:
    格式:echo $[变量名]
  • 释放变量值:
    格式:unset [变量名]

1. 变量名

2. 单引号、双引号、反单引号

提示:

  • 在$前加上转义字符\,就可以原样输出

3.1.2 应用

  1. 输出当前所在的目录
#!/bin/bash
dir=`pwd`
echo $dir
  1. 统计/etc目录下的文件个数
#!/bin/bash
filenum=`ls -alh /etc |wc -l`
echo "运行结果:/etc目录下有$((filenum-3))个文件"

2-1. 统计任意目录下的文件个数

第一种方式:
read读入键盘输入的参数

vim test.sh
sh test.sh

提醒:

  • 关键:read -p "[提示内容]" [变量1] [变量2]...

如果变量值的个数大于变量名的个数,就会把多余的变量值赋值给最后一个变量

#!/bin/bash
read -p "请输入要查看的目录:" dir
filenum=`ls -alh $dir |wc -l`
echo "运行结果:$dir目录下有$((filenum-3))个文件"

第二种方式:
参数传递

名称 说明
$n 第n个参数
$0 文件名称
$@ 显示所有参数
$# 参数个数

vim test.sh
sh test.sh [目录路径]

#!/bin/bash
filenum=`ls -alh $1 |wc -l`
echo "运行结果:$1目录下有$((filenum-3))个文件"

3.2 重定向

把命令内容输入到文件中

3.2.1 正确的命令(1

3.2.2 错误的命令(2

3.3 基本运算

3.3.1 基本运算符

参阅:

基本运算符 说明
算术运算符
-eq 检测两个数是否相等,相等返回 true

eg:

[ $a -eq $b ]
-ne 检测两个数是否不相等,不相等返回 true

eg:

[ $a -ne $b ]
-gt 检测左边的数是否大于右边的,如果是,则返回 true

eg:

[ $a -gt $b ]
-lt 检测左边的数是否小于右边的,如果是,则返回 true

eg:

[ $a -lt $b ]
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true

eg:

[ $a -ge $b ]
-le 检测左边的数是否小于等于右边的,如果是,则返回 true

eg:

[ $a -le $b ]
逻辑运算符
&&

eg:

[[ $a -lt 100 && $b -gt 100 ]]
||

eg:

[[ $a -lt 100 || $b -gt 100 ]]
布尔运算符
-a

eg:

[ $a -lt 20 -a $b -gt 100 ]
-o

eg:

[ $a -lt 20 -o $b -gt 100 ]
!

eg:

[ ! false ]
字符串运算符
== 检测两个字符串是否相等,相等返回true

eg:

[ "$a" == "$b" ]
!= 检测两个字符串是否相等,不相等返回true

eg:

[ "$a" != "$b" ]
-z 检测字符串长度是否为0,为0返回 true

eg:

[ -z $a ]
-n 检测字符串长度是否不为0,不为0返回 true

eg:

[ -n "$a" ]
$ 检测字符串是否为空,不为空返回 true

eg:

[ $a ]
文件测试运算符
-b file 检测文件是否是块设备文件,如果是,则返回 true

eg:

[ -b $file ]
-c file 检测文件是否是字符设备文件,如果是,则返回 true

eg:

[ -c $file ]
-d file 检测文件是否存在且是目录,如果是,则返回true

eg:

[ -d $file ]
-e file 检测文件(包括目录)是否存在,如果是,则返回 true

eg:

[ -e $file ]
-f file 检测文件是否存在且是普通文件(既不是目录,也不是设备文件),如果是,则返回 true

eg:

[ -f $file ]
-s file 检测文件是否为(文件大小是否大于0),不为空返回 true

eg:

[ -s $file ]
-x file 检测文件是否可执行,如果是,则返回 true

eg:

[ -x $file ]
if test -d /root
then
   echo "/root是目录"
else
   echo "/root不是目录"
fi

if [ -d /root ]
then
    echo "/root是目录"
else
    echo "/root不是目录"
fi

3.3.2 基本变量运算

3.4 程序结构

3.4.1 分支结构

1. if...else分支

(1) 规范

格式:

if [ 条件 ]
then 
语句
else
语句
fi

if [ 条件 ];then 
语句
else
语句
fi
(2) 应用
#!/bin/bash
dir=$1
if [ ! -d "$1" ];then
        echo "error:文件路径不存在"
else
        result=`ls -al $dir|wc -l`
        if [ $result -eq 3 ];then
                echo "$dir目录为空"
        else
                echo "$dir目录不为空"
        fi
fi

#!/bin/bash
dir=$1
if test -d "$1" ;then
        result=`ls -al $dir|wc -l`
        if [ $result -eq 3 ];then
                echo "$dir目录为空"
        else
                echo "$dir目录不为空"
        fi
else
        echo "error:文件路径不存在"
fi

参阅:

#!/bin/bash
if [ "$1" == "admin" -a "$2" == "123456" ];then
        echo "登录成功"
else
        echo "登陆失败"
fi
#!/bin/bash
if [ "$1" -gt 0 ];then
        echo "$(($1-1))"
else
        echo "$(($1+1))"
fi

2. if...elif...else分支

(1) 规范

格式:

if [ 条件 ];then 
语句
elif [ 条件 ];then
语句
...
elif [ 条件 ];then
语句
else
语句
fi
(2) 应用
#!/bin/bash
read -p "Enter your score(0-100): " GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ] ; then
        echo "$GRADE is Error"
else
        if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
                echo "$GRADE is Excellent"
        elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
                echo "$GRADE is Pass"
        else
                echo "$GRADE is Fail"
        fi
fi
#!/bin/bash
read -p "请输入信息:" message
if [ -z "$message" ];then
        echo "error:未输入内容"
elif [ -d "$message" ];then
        echo "输入内容是:目录"
elif [ -e "$message" ];then
        echo "输入内容是:文件"
else
        echo "error:输入内容错误"
fi

3. case分支

(1) 规范

格式:

case [$变量名] in 
[值1])
语句;;
...
[值n])
语句;;
*)
语句;;
esac
(2) 应用
#!/bin/bash
read -p "请输入产品代号:" pro
case "$pro" in
A)
        echo "笔记本";;
B)
        echo "电饭煲";;
C)
        echo "小台灯";;
*)
        echo "笔记本";;
esac
#!/bin/bash
read -p "请做出评价:" comment
case "$comment" in
[0-3])
        echo "不满意";;
[4-6])
        echo "满意";;
[7=9])
        echo "非常满意";;
*)
        echo "满意";;
esac

3.4.2 循环结构

1. for循环

(1) 规范

格式:

for [变量名] in [列表]
do
语句
done
(2) 应用
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
        echo "$i"
done

seq
格式:step start size max
size为1可以省略

#!/bin/bash
for i in `seq 1 1 10`
do
        echo "$i"
done

1. while循环

(1) 规范

格式:

while [ 条件 ]
do
语句
done
(2) 应用
#!/bin/bash
sum=0
i=1
while [ "$i" -le 100 ]
do
        sum=$(($sum+$i))
        ((i++))
done
echo "1-100的和:$sum"

3.4.3 函数

(1) 规范

格式:

  1. 定义函数
[函数名](){
语句
}
  1. 函数调用
    函数先定义再调用

格式:

[函数名]
  1. 函数参数
    $1...$n

eg:

4+5

#!/bin/bash
add(){
        echo "$1+$2=$(($1+$2))"
}
add 4 5
  1. 函数返回值
    默认存在返回值

查看函数返回值:echo $?,没有错误返回0,有错误返回1

#!/bin/bash
hello(){
        echo "Hello World!!!"
}
hello
echo $?
(2) 应用

更新中......


上一篇 下一篇

猜你喜欢

热点阅读