C高级(3):shell脚本

目录

1shell的基础概念:

1.1概念

1.2创建和执行

2变量

2.1用户自定义变量

2.2位置变量

2.3预定义变量

2.4环境变量

3功能语句

3.1说明性语句

3.2功能性语句

1)read

2)expr

3)let

4结构性语句

4.1if语句

4.2case语句

4.3for循环

4.4while

4.5循环控制语句

5.数组

5.1数组的赋值

5.2数组的调用

6函数

6.1函数的定义方式

6.2函数调用


1shell的基础概念:

1.1概念

shell的使用方式:手动命令和脚本

shell脚本的本质:shell命令的有序集合,扩展名可以为.sh,也可以没有

shell不仅是一个应用程序还是一种脚本语言

1)编译型语言:c ,java ,c++ ,当中间出错,err直接结束,修改重新编译运行

2)解释型语言:shell python,不需要编译直接执行,当中间出粗偶,智慧在错误的地方报错,但是不会影响后面的内容;解析一条指令,执行一条指令

1.2创建和执行

创建shell脚本:

touch test.sh

第一行写:#!/bin/bash

解释性信息,意思是使用/bin/bash来解释执行

执行方式:

1.chmod 777 test.sh :是脚本具有执行权限

./test.sh

2.sh test.sh (不要用,应急shell)

例如:

#!/bin/bash
touch file34.c

练习:

1)在上级目录下创建file1.c file2.c 两个文件

2)将该两个文件移动到家目录

3)将两个文件用tar压缩成gz的格式

#!/bin/bash
cd ..
touch file1.c file2.c
mv file1.c file2.c ~
cd 
tar -czf file.tar.gz file1.c file2.c

2变量

2.1用户自定义变量

一般用大写

进行赋值用=,左右两边不能有空格

引用变量前面加$

2.2位置变量

$0,与输入的命令行一样,包含脚本名字 xx.sh

$1 , $2 .... $9 :分别包含第一个到第九个命令行参数

$#:命令行参数的个数,不包含脚本文件

$@:所有命令行参数

$*:所有命令行参数

2.3预定义变量

$?前一个命令的退出状态(0为真,非零为假)

$$正在运行进程的ID号

2.4环境变量

变量没有类型

环境变量一般指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置、系统文件位置等

HOME /etc/passwd文件中列出的用户的主目录

PATH shell搜索路径,一系列的目录

3功能语句

3.1说明性语句

以#开头

注释用#

3.2功能性语句

1)read

功能:read从标准输入读入一行,并赋值给后面的变量

格式: read VAR1 VAR2 VAR3

读入行的第一个单词赋值给var1 ,第二个单词赋值给var2,..其余所有都赋值给最后一个变量

read -p "提示语句" 变量名 : 可以将提示语句输出,同时输入变量

2)expr

格式:expr 表达式

算术运算符命令expr主要用于简单的整数运算, 加(+),减(-)乘( \*) 除 (/)取余 (%)

例:

expr 12 + 5 \* 3

注意:

1)表达式符号之间必须用空格间隔

2)expr引用变量必须$

3)expr自带打印功能

4)使用乘号\* 小括号\( \) 需要转义

  1. 把expr的结果赋值给变量需要命令置换符
  2. expr不能进行++ -- 操作
#!/bin/bash
VAR=5
NUM=`expr \( 2 + $VAR \) \* 4`
# ((NUM++))
echo $NUM

练习2:通过expr实现变量自加运算

#!/bin/bash
NUM=5
NUM=`expr $NUM + 1`

echo $NUM #6

练习2:计算表达式值a*b+c-d/b,a=2,b=3,c=15,d=18

要求:

1)从终端读入4个数a,b,c,d

2)进行运算

3)打印结果输出到终端

3)let

let 表达式

  1. 运算的时候运算符左右两边不能有空格
  2. 不能自己打印,输出需要用echo
  3. let语句可以不加$引用变量
  4. let n=n**2 表示平方
  5. 可以++ -- ,()转义,*不转义

4)test

可以测试三种对象:字符串 整数 文件属性

1.字符串测试

s1 = s2 测试两个字符串是否完全一样

s1 != s2 测试两个字符串是否有差异

-z s1 测试s1长度是否为0

-n s1 测试s1长度是否不为0

2.整数的测试

$a -eq $b 测试a与b是否相等 equal

$a -ne $b 测试a与b是否不相等 not equal

$a -gt $b 测试a是否大于b greater than

$a -ge $b 测试a是否大于等于b

$a -lt $b 测试a是否小于b less than

$a -le $b 测试a是否小于等于b

#!/bin/bash
NUM=10
test $NUM -eq 1
echo $? #1

test $NUM -ne 10
echo $?#1

test $NUM -lt 15
echo $?#0


​​​​​​​​​​​​3.文件属性测试

测试name 是否为一个目录 -d name

测试name 是否为一个普通文件 -f name

测试name 是否存在 -e name

4结构性语句

4.1if语句

1)基本结构

if 条件

then

     命令表1

else

     命令表2

fi

#!/bin/bash
read NUM
if test $NUM -eq 10
then
    echo "=10"
else
    echo "!=10"
fi

2)分层结构

if 条件1

then

     命令表1

elift 条件2

then

      命令表2

else

      命令表3

fi

#!/bin/bash
read NUM
if test $NUM -eq 10
then
    echo "=10"
elif test $NUM -gt 10
then
    echo ">10"
else
    echo "<10"
fi


3)嵌套结构

if 条件

then

      if 条件

      then

            命令表1

      else

            命令表2

      fi

else

      命令表2

fi

4)判断语句其他格式

if [ 条件 ];

then

      命令表1

else

      命令表2

fi

注意:

if 和 fi是条件语句的括号,必须成对使用

命令表中的命令可以一条也可以多条

注释整段代码:

if false

then

fi

#!/bin/bash
read NUM
if false
then 
    if test $NUM -ge 10
    then
        if test $NUM -gt 10
        then
            echo ">10"
        else
            echo "==10"
        fi
    else
        echo "<10"
    fi
fi

if [ $NUM -ge 10 ]
then
    echo ">=10"
else
    echo "<10"
fi

补充:

-o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true

-a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false

! 非运算 例如 [ ! false ] 返回 true

&& 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false

|| 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true

| 位或 例如 echo $[2|2]

&位与 例如 echo $[2&1]

练习:从终端输入3个整数;从小到大排序

4.2case语句

格式:

case 变量 in

模式1)

      命令表1

      ;;

模式2)

      命令表2

      ;;

......

*)

      命令表n

      ;;

esac

注意:

1)case语句只能检测字符串变量

2)命令表以单独的;;结束,退出case语句

3)模式n通常写为*,表示其他所有的模式

4)case匹配项中可以存在多个模式,每种模式之间|隔开

4.3for循环

格式:

for 变量名 in 单词表

do

命令表

done

变量依次从单词表中读取各个单词,每取一次单词,就执行一次循环体中的命令表,循环次数由单词表中的单词数决定,命令表中的命令可以一条,也可以是由分号或换行符分隔开的多条。

例如:

for语句的几种基本书写格式:

1)for i in 1 2 3 4 5

do

....

done

变量i从单词表中取值

2)for i

do

...

done

变量i从命令行取值,可以省略in 单词表

3)for i in {1..10}

do

...

done

变量i从1-10取值

4)for ((i=0;i<10;i++))

do

...

done

书写格式类似于c语言

#!/bin/bash
#1)
# for i in 1 2 3 4 5
# do
#     echo -n "$i  "
# done
# echo 

#2)
# for i 
# do
#     echo -n "$i  "
# done
# echo 

#3)
# for i in {1..10}
# do
#     echo -n "$i  "
# done
# echo 

# 4)
for ((n=1;n<=10;n++))
do 
    echo -n "$n  "
done
echo 

练习:实现1-10求和

4.4while

格式:

while 命令或表达式

do

命令表

done

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

4.5循环控制语句

break n:结束n层循环

continue n:结束n层本次循环,继续外层循环

#!/bin/bash
for ((i=0;i<3;i++))
do
    for ((j=0;j<4;j++))
    do
        if test $j -eq 2
        then
            # break  #00 01  10 11  20 21 
            # break 2 #00 01 
            # continue #00 01 03 10 11 13 20 21 23
            # continue 2 #00 01 10 11 20 21
        fi
        echo -n "$i $j ,"
    done
done
echo

5.数组

5.1数组的赋值

  1. array=(1 2 3 4 5)
  2. array=($1 $2 $3 $4) 命令行传参

(3)read a b c

array=($a $b $c)

  1. read -a array 终端输入数据到数组中

5.2数组的调用

${array[i]} 数组下标0~n-1,通过下标获取数组元素

array[i]=200 对数组元素重新赋值

${array[@]} 遍历数组

${#array[@]} 计算数组元素的个数

遍历数组:

1)echo ${array[@]}

  1. for ((i=0;i < ${#array[@]};i++}

do

echo -n ${array[i]}

done

练习:用shell脚本实现冒泡排序

6函数

6.1函数的定义方式

1)function_name()

{

command1

...

commandn

}

2)

function function_name()

{

command1

...

commandn

}

6.2函数调用

function_name 参数列表

#!/bin/bash
fun()
{
    echo "hello"
}
function fun1()
{
    NUM=`expr $1 + $2`
    echo $NUM
}
fun
fun1 1 2

函数内$1 $2表示的是传递的参数

  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值