美文网首页
Shell | 初识Shell 1

Shell | 初识Shell 1

作者: Ricsy | 来源:发表于2019-09-24 20:58 被阅读0次


一、初识Shell

  • shell是一段应用程序,是用户与操作系统交互的桥梁
  • shell通常指shell脚本
  • shell是弱类型语言,在定义变量时不需要指定变量的类型

二、Shell脚本规范

  • shell是以.sh文件结尾的文件
  • .sh文件的第一行是:
    #!/bin/bash
  • .sh的注释符号是:
    #
  • .sh运行方式

第一种方式:
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

  • 覆盖
    格式:[command] 1 >[filename]
    eg:
    ls -l 1>a.txt
  • 追加
    格式:[command] 1 >>[filename]
    ls -l /tmp 1>>a.txt

3.2.2 错误的命令(2

  • 覆盖
    格式:[command] 2 >[filename]
    eg:
    cd hahaha 2>a.txt
  • 追加
    格式:[command] 2 >>[filename]
    cd hahaha 2>>a.txt

3.3 基本运算

3.3.1 基本运算符

参阅:

  • 变量 a 为 10,变量 b 为 20
基本运算符 说明
算术运算符
-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 ]
  • d、e、f都有判断是否存在
  • d 判断文件名是否存在且为目录
  • e 判断文件是否存在
  • f 判断文件是否存在且为文件
  • test可省略中括号,没有test不可以省略中括号
    eg:
if test -d /root
then
   echo "/root是目录"
else
   echo "/root不是目录"
fi

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

3.3.2 基本变量运算

  • 加1
    ((i++))
    ((i+=1))
    let i=i+1
    i=$[$i+1]
    i=$(($i+1))

  • 加减
    s=$(($s+$i))
    s=$[$s+$i]
    ((s=$s+$i))

3.4 程序结构

3.4.1 分支结构

1. if...else分支

(1) 规范

格式:

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

if [ 条件 ];then 
语句
else
语句
fi
  • 条件两边有空格
  • 多个条件间有空格
  • if后面要有空格
  • 条件中如果存在变量,变量两边要有双引号
(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

参阅:

  • 判断用户输入的用户名和密码是否为admin 123456,如果是的话,提示登陆成功,不是的话,则提示登陆失败
#!/bin/bash
if [ "$1" == "admin" -a "$2" == "123456" ];then
        echo "登录成功"
else
        echo "登陆失败"
fi
  • 输入数字,判断是否大于0,如果大于0,则-1输出,否则+1输出
#!/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) 应用
  • 评判成绩:85-100优秀,60-84合格,0-59不合格
#!/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
  • ;;结束语句
  • *)默认语句
  • esac是case语句的结束
  • 值可以是数字、字符串、区间等
(2) 应用
  • 根据用户输入的字母,判断选择的产品
#!/bin/bash
read -p "请输入产品代号:" pro
case "$pro" in
A)
        echo "笔记本";;
B)
        echo "电饭煲";;
C)
        echo "小台灯";;
*)
        echo "笔记本";;
esac
  • 请输入对客服的满意度,0-3不满意,4-6满意,7-9非常满意
#!/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) 应用
  • 输出0-10的数
#!/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) 应用
  • 求1-100的和
#!/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) 应用

更新中......


相关文章

  • shell 第一天

    shell编程初识 1.1 shell编程初识 shell的定义 Shell 是命令解释器 Shell 也是...

  • Shell | 初识Shell 1

    一、初识Shell shell是一段应用程序,是用户与操作系统交互的桥梁 shell通常指shell脚本 shel...

  • 目录

    shell 一、 初识shell二、 shell变量三、 正则表达式四、 认识脚本和shell判断表达式五、she...

  • 1.初识shell

    shell作为程序员与内核系统交流的中间件,语言有很多种类,常用的是Bash。 注:以下操作使用终端: 创建一个简...

  • 1初识Linux shell

    1.Linux系统 Linux可划分为以下四个部分:Linux内核,GNU工具,图形化桌面环境,应用软件 1.1....

  • 初识shell

    什么是shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种...

  • 初识Shell

    前段时间在学习git命令行,同时接触了Mac终端运行常用的Linux系统命令觉得挺有意思的,加上正需要对一些文件进...

  • Shell初识

    1.简介 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种...

  • 初识shell

    1、创建shell脚本文件 vim test.sh 2、shell脚本第一行 第一行需要写:#!/bin/bash...

  • 初识Shell

    shell shell:俗称壳,为使用者提供操作界面的软件(命令解析器)多数Linux发行版的默认shell都是G...

网友评论

      本文标题:Shell | 初识Shell 1

      本文链接:https://www.haomeiwen.com/subject/lefidctx.html