day18-Linux基础,shell脚本

day18-linux基础,shell脚本




一、变量的四则运算:

  1. ((   ))

不能进行浮点型的运算

调用的时候需要加钱$

可以进型幂数运算

可以进行自加自减

1
2
3
4
5
#!/bin/bash
2
3 a=$(( 3**3)) //3的3次方
4 echo $a

  1. 【 】

不能进行浮点型的运算

调用的时候需要加钱$

可以进型幂数运算

1
2
3
4
5
1 #!/bin/bash
2
3 a=$[ 3+3]
4 echo $a

  1. expr

需要命令置换符置换出来结果`   `

算数之间需要空开

当进行乘法的时候需要用\区分

没有幂数运算

1
2
3
4
5
1 #!/bin/bash
2
3 a=`expr 1 \* 2`
4 echo $a

练习:运算出a=3的3次方的值,b=5*7的值,交换

1
2
3
4
5
6
7
8
9
1 #!/bin/bash
2
3 a=$((3**3))
4 b=`expr 5 \* $((4+2))`
5 c=$a
6 a=$b
7 b=$c
8 echo a=${a}b=$b




二、shell 语句

1. 解释性语句

  • #注释一行
  • :<<!注释多行
    注释的shell语句
  • :<<EOF
    注释的shell语句
    EOF

2.功能性语句

(1)test

结构:字符串 整型 文件

  • 字符串的比较:

test 字符串1 = 字符串2 —-比较两个字符串是否相等
test 字符串1 != 字符串2 —-比较两个字符串是否不相等
test -z 字符串—判断字符串为不为空
test -n 字符串—判断字符串是否不为空

1
2
3
4
5
6
7
8
9
10
1 #!/bin/bash
2
3 a="hello"
4 b="hello"
5 test $a != $b
6 test -z $a
7 test -n $a
8 echo $?


  • 整型的比较

-eq—等于
-ne—不等于
-gt—大于
-lt–小于
-ge—大于等于
-le—小于等于

  • 文件的比较

-e —判断文件是否存在
-f—判断文件是否是普通文件
-L—判断文件是否是链接文件
-S—判断文件是否是套接字文件
-b—判断文件是否是块文件
-c—判断文件是否是字符文件
-d—判断文件是否是目录文件
-p—判断文件是否为管道文件

  • 文件的权限:

-r–判断文件是否有可读权限
-w—判断文件是否有可写权限
-x—判断文件是否有可执行权限
文件1 -nt 文件2–判断文件1是否比文件2新(时间戳)
文件1 -ot 文件2–判断文件1是否比文件2旧(时间戳)

  • 逻辑

    -o—或
    -a—与

1
2
3
4
5
6
1 #!/bin/bash
2
3 test -d $1 -a -f $2
4 echo $?
~


(2)read

把终端上的输入传给参数

read 变量1 变量2

read -p “提示” 变量名

1
2
3
4
5
6
1 #!/bin/bash
2
3 read -p "please input tow numbern:" a b
4 echo $a
5 echo $b

read -t 时间 变量名—限制时间输入

超过时间会自动结束(以秒为单位)

1
2
3
4
5
6
1 #!/bin/bash
2
3 read -t 5 a b
4 echo $a
5 echo $b

read -n –限制输入的个数,超过个数也会自动结束

1
2
3
4
5
6
 1 #!/bin/bash
2
3 read -n 1 a b
4 echo $a
5 echo $b
~

read -s —隐藏输入


3. shell的控制语句

(1)if

第一种:

1
2
3
4
5
6
7
if[]

then

​ shell语句;

fi

注意:if和【】之间要隔一个空,表达式和【】也要隔一个空

1
2
3
4
5
6
7
8
9
1 #!/bin/bash
2
3 a=56
4 b=34
5 if [ $a -gt $b ]
6 then
7 echo "hello world"
8 fi

第二种:

1
2
3
4
5
6
7
if test语句

then

​ shell语句;

fi
1
2
3
4
5
6
7
8
9
1 #!/bin/bash
2
3 a=56
4 b=34
5 if test $a -gt $b
6 then
7 echo "hello world"
8 fi

if - elif-else

1
2
3
4
5
6
7
8
9
10
11
12
13
1 #!/bin/bash
2
3 read a b
4 if test $a -gt $b
5 then
6 echo "hello world"
7 elif test $a -eq $b
8 then
9 echo "zhangcheng"
10 else
11 echo "day3"
12 fi

练习:输入一个文件名。判断这个文件是否存在,如果不存在,就创建,判断是否有可写权限,如果有,就把helloworld 写进去,如果没有,赋予可写权限,再写进去,如果存在就写入helloworld

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 1 #!/bin/bash
2
3 read -p "please input a filename:" file
4 if test -e $file
5 then
6 if test -w $file
7 then
8 echo "hello world">>$file //注意别忘了echo
9 else
10 chmod +w $file
11 echo "hello world">>$file
12 fi
13 else
14 touch $file
15 echo "hello world">>$file
16 fi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
case 表达式 in

​ 表达式)

​ shell语句

​ ;;

表达式)

​ shell语句

​ ;;

esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 3 read a
4 case $a in
5 1|2|3)
6 echo "星期一"
7 ;;
8 2)
9 echo "星期二"
10 ;;
11 3)
12 echo "星期三"
13 ;;
14 4)
15 echo "星期四"
16 ;;
17 5)
18 echo "星期五"
19 ;;
20 6)
21 echo "星期六"
22 ;;
23 7)
24 echo "星期天"
25 ;;
*)
27 echo "asdads"

26 esac

用【】

1
2
3
4
5
6
7
8
9
10
read a
4 case $a in
5 [a-zA-Z])
6 echo "星期一"
7 ;;
8 [zbc])
9 echo "星期二"
10 ;;


练习:模拟一个应用下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 1 #!/bin/bash
2
3 read -p "请选择要下载的应用:" app
4 read -p "请确认是否下载y|n|q)" chioce
5 case $chioce in
6 Y|y|yes)
7 echo "$app正在下载中....."
8 ;;
9 N|n|no)
10 echo "取消下载$app"
11 ;;
12 *)
13 echo "退出"
14 esac
15

(2)循环语句

1
2
3
4
5
6
7
while 表达式

do

shell语句

done
1
2
3
4
5
6
7
8
1 #!/bin/bash
2
3 a=5
4 while test $a -gt 0
5 do
6 ((a--))
7 echo $a
8 done

死循环

1
2
3
4
while true
do
shell语句
done

for循环

1
2
3
4
for((表达式1;表达式2;表达式3))
do
shell语句
done
1
2
3
4
5
6
7
8
9
1 #!/bin/bash
2
3
4 i=5
5 for((i=0;i<5;i++))
6 do
7 echo $i
8 done

第二种

1
2
3
4
for 变量 in 单词表
do
shell语句
done
1
2
3
4
5
6
7
8
9
1 #!/bin/bash
2
3
4 i=5
5 for i in he li oi asda adsa ada ad
6 do
7 echo $i
8 done

连续的

for 变量 in {起始..结束}

1
2
3
4
5
6
7
8
9
1 #!/bin/bash
2
3
4 i=5
5 for i in {a..z}
6 do
7 echo $i
8 done

for 变量 in ``

1
2
3
4
5
6
7
8
9
1 #!/bin/bash
2
3
4 i=5
5 for i in `ls`
6 do
7 echo $i
8 done

练习:求1到100的和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1 #!/bin/bash
2
3 sum=0
4 i=5
5 for((i=0;i<101;i++))
6 do
7 sum=$(($sum+$i))
8 done
9 echo "sum=$sum"
1 #!/bin/bash
2
3 sum=0
4 i=5
5 for((i=0;i<101;i++))
6 do
7 sum=`expr $sum + $i`
8 done
9 echo "sum=$sum"

三、shell数组

shell脚本里面只有一维数组

没有数据类型

1. 数组的初始化

数组名=(元素1 元素2 元素3.。。。)

2. 数组的赋值:

数组名【下标】=内容

3. 数组的调用:

${数组名【下标】}

4. 数组的遍历:

循环遍历

${arr[*]}

${arr[@]}

5. 求数组的长度:

1
${#arr[*]}
1
2
3
4
5
6
7
8
1 #!/bin/bash
2
3 arr=(hello world nihao shijie)
4 arr[0]="zhangcheng"
5 echo ${arr[0]}
6 echo ${arr[@]}
7 echo ${#arr[*]}

练习:

数组的逆序打印(用交换)

shijie nihao world hello

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1 #!/bin/bash
2
3 arr=(hello world nihao shijie)
4 arr[0]="zhangcheng"
5 echo ${arr[0]}
6 echo ${arr[@]}
7 len=${#arr[*]}
8 for((i=0;i<$len/2;i++))
9 do
10 temp=${arr[$i]}
11 arr[$i]=${arr[$(($len-$i-1))]}
12 arr[$(($len-$i-1))]=$temp
13 done
14
15 echo ${arr[@]}

4. shell函数

没有数据类型

没有写形参,但可以传参

只有调用函数之后,函数里面的变量才会生效

函数里面定义的都是全局变量,如果要定义局部变量,加local

(1)函数的一般形式:

1
2
3
4
5
6
7
8
9
10
11
12
function 函数名()

{
函数体
}

或者:

函数名()
{
函数体
}

(2)函数的调用,直接函数名

(3)返回值return,可以通过$?来打印函数的返回值,如果有返回值,返回在0~256

1
2
3
4
5
6
7
8
9
10
1 #!/bin/bash
2
3 add()
4 {
5 a=12
6 return $a
7 }
8 add
9 echo $?

(4)函数的传参

函数名 实参1 实参2.。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
函数体中用$1,$2$3.....来接受传递的实参
1 #!/bin/bash
2
3 add()
4 {
5 a=12
6 echo $1
7 echo $2
8 echo $3
9 return $a
10 }
11 add 34 56 78
12 echo $?

练习:写一个求和函数

1
2
3
4
5
6
7
8
9
10
11
12
13
1 #!/bin/bash
2 read m n
3 add()
4 {
5 sum=0
6 for((i=$1;i<=$2;i++))
7 do
8 sum=$(($sum+$i))
9 done
10 }
11 add m n
12 echo $sum




三、c高级:

1. 指针:

(1)指针的定义:

存储类型 数据类型 *指针变量名;

(2)指针的初始化:

存储类型 数据类型 *指针变量名=地址;

(3)指针的赋值:

1、把一个已知变量的地址赋值给指针

2、把已知数组首地址赋值给指针

3、把已有同级别指针赋值给指针

4、把NULL赋值给指针

(4)数组指针

本质是一个指针,只是这个指向了每个元素都是一维数组的一维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 7 #include <stdio.h>
8
9 int main(int argc, char *argv[])
10 {
11 int a[2][3]={1,2,3,4,5,6};
12 int (*p)[3]=a;
13
14 printf("a[1][0]=%d\n",a[1][0]);
15 printf("*(*(p+1))]=%d\n",*(*(p+1)));
16 printf("p[1][0]=%d\n",p[1][0]);
17 printf("*p[1]=%d\n",*p[1]);
18
19 return 0;
20 }

注意:用指针数组创建的字符串(char *p[]={“hello”,”nihao”,”konnichiwa”})是字符串常量,而用二维字符串数组写的字符串才算变量。

1
写博客时有{#的地方必须要放在代码里否则会渲染错误
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 nakano-mahiro
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信