AcWing Linux基础课第三节笔记1

12 篇文章 0 订阅

1、该系列为ACWing中Linux基础课,已购买正版,课程作者为yxc。
2、为啥写在这儿,问就是oneNote的内存不够了QAQ

Shell语法(一)

概论

shell是我们通过命令行与操作系统沟通的语言。

shell脚本可以直接在命令行中执行(解释型语言),也可以将一套逻辑组织成一个文件,方便复用。
AC Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。

Linux中常见的shell脚本有很多种,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • zsh

Linux系统中一般默认使用bash,所以接下来讲解bash中的语法。
文件开头需要写#! /bin/bash,指明bash为脚本解释器

脚本示例

新建一个test.sh文件,内容如下:

#! /bin/bash
echo "Hello World!"

type+命令可以解释该命令的来源(内嵌命令,第三方命令等),如:

type readonly 
# readonly is a shell builtin(shell内部命令)
type ls 
# ls is aliased to ‘ls –color+auto’

运行方式

1、作为可执行文件
权限中-rw(作者)-rw(同组)-r(其他用户)–
运行时必须写 ./test.sh

acs@9e0ebfcd82d7:~$ chmod +x test.sh  # 使脚本具有可执行权限
acs@9e0ebfcd82d7:~$ ./test.sh  # 当前路径下执行
Hello World!  # 脚本输出
acs@9e0ebfcd82d7:~$ /home/acs/test.sh  # 绝对路径下执行
Hello World!  # 脚本输出
acs@9e0ebfcd82d7:~$ ~/test.sh  # 家目录路径下执行
Hello World!  # 脚本输出

2、用解释器执行

acs@9e0ebfcd82d7:~$ bash test.sh
Hello World!  # 脚本输出

注释

1、单行注释

# 这是一行注释
echo 'Hello World'  #  这也是注释

2、多行注释

:<<EOF
第一行注释
第二行注释
第三行注释
EOF

其中EOF可以换成其它任意字符串。例如:

:<<abc
第一行注释
第二行注释
第三行注释
abc
========分割线=======
:<<!
第一行注释
第二行注释
第三行注释
!

变量

1、定义变量(等号两边不能有空格)
定义变量,不需要加$符号,例如:

name1='zxy'  # 单引号定义字符串
name2="zxy"  # 双引号定义字符串
name3=zxy   # 也可以不加引号,同样表示字符串

字符串可以不加双引号
定义变量的时候变量都是字符串,但当变量需要是整数时,会自动把变量转换成整数

2、使用变量
使用变量,需要加上$符号,或者${}符号。花括号是可选的,主要为了帮助解释器识别变量边界。($在程序中相当于取值)

name=zxy
echo $name  # 输出zxy
echo ${name}  # 输出zxy
echo ${name}acwing  # 输出zxyacwing

推荐第三种方式可以识别变量名和字符串;

3、只读变量
使用readonly或者declare可以将变量变为只读。(不能再改变变量值)只读的变量是不能被unset的!

name=zxy
readonly name
declare -r name  # 两种写法均可
=======================================
name=abc  # 会报错,因为此时name只读

4、删除变量
unset可以删除变量,删除后是空,不会报错

name=zxy
unset name
echo $name  # 输出空行

5、变量类型

  • 自定义变量(局部变量):子进程不能访问的变量
  • 环境变量(全局变量):子进程可以访问的变量

开启子进程的方法:在bash中用bash命令,退出子进程用exitCtrl+d

验证变量是全局变量还是局部变量:

  • 在当前bashl里面申明一个name=yxc
  • 然后再新开一个bash(直接输入bash指令吗,原来的bash会睡眠掉)
  • 使用echo $name 如果可以输出值则是全局变量
    否则是局部变量

自定义变量改成环境变量:

acs@9e0ebfcd82d7:~$ name=yxc  # 定义变量
acs@9e0ebfcd82d7:~$ export name  # 第一种方法
acs@9e0ebfcd82d7:~$ declare -x name  # 第二种方法

环境变量改为自定义变量:

acs@9e0ebfcd82d7:~$ export name=yxc  # 定义环境变量
acs@9e0ebfcd82d7:~$ declare +x name  # 改为自定义变量

6、字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号与双引号的区别:

  • 单引号中的内容会原样输出,不会执行、不会取变量;
  • 双引号中的内容可以执行、可以取变量;
  • 不加引号与双引号相同
name=yxc  # 不用引号
echo 'hello, $name \"hh\"'  # 单引号字符串,输出 hello, $name \"hh\"
echo "hello, $name \"hh\""  # 双引号字符串,输出 hello, yxc "hh"

获取字符串长度(也可以取数组的长度)

name="yxc"
echo ${#name}  # 输出3

提取子串

name="hello, yxc"
echo ${name:0:5}  # 提取从0开始的5个字符

默认变量

1、文件参数变量
在执行shell脚本时,可以向脚本传递参数。$1是传入的第一个参数,$2是第二个参数,以此类推。特殊的,$0是文件名(包含路径,值取决于是用绝对路径还是相对路径运行文件)。向脚本传递参数时,参数个数超过一位需要用大括号括起来并且不需要专门写函数接收参数。例如:

创建文件test.sh

#! /bin/bash

echo "文件名:"$0
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "第四个参数:"$4
echo "第十个参数(两位):"${10}

然后执行该脚本:

acs@9e0ebfcd82d7:~$ chmod +x test.sh 
acs@9e0ebfcd82d7:~$ ./test.sh 1 2 3 4
文件名:./test.sh
第一个参数:1
第二个参数:2
第三个参数:3
第四个参数:4

2、其它参数相关变量

参数说明
$#代表文件传入的参数个数,如上例中值为4
$*由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4"
$@每个参数分别用双引号括起来的字符串,如上例中值为"$1" "$2" "$3" "$4"
$$脚本当前运行的进程ID
$?上一条命令的退出状态(注意不是stdout,而是exit code)。0表示正常退出,其他值表示错误
$(command例如ls等命令)返回command这条命令的stdout输出结果(可嵌套)
` command`返回command这条命令的stdout(不可嵌套),可以代替$(command)

数组

数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。
数组下标从0开始

1、定义
数组用小括号表示,元素之间用空格隔开,每一个其实都是字符串。例如:

array=(1 abc "def" yxc)

也可以直接定义数组中某个元素的值,可以跳着赋值:

array[0]=1
array[1]=abc
array[2]="def"
array[3]=yxc
array[1000]=yxc 

2、读取数组中某个元素的值

${array[index]}

实例:

array=(1 abc "def" yxc)
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}

3、读取整个数组
@ 和* 表示所有的意思

${array[@]}  # 第一种写法
${array[*]}  # 第二种写法

实例:

array=(1 abc "def" yxc)

echo ${array[@]}  # 第一种写法
echo ${array[*]}  # 第二种写法

4、数组长度(实际长度,有多少下标被用到了)
类似于字符串

${#array[@]}  # 第一种写法
${#array[*]}  # 第二种写法

实例:

array=(1 abc "def" yxc)

echo ${#array[@]}  # 第一种写法
echo ${#array[*]}  # 第二种写法

示例:
该文件从stdin(标准输入)中读取一个整数n。
在stdout(标准输出)输出斐波那契数列的第n项。即:a[0] = 1, a[1] = 1, a[i] = a[i - 1] + a[i - 2], 求a[n]。
数据保证 0 <= n <= 20,脚本不需要判断n的合法性。

#! /bin/bash

read n
a[0]=1
a[1]=1
for ((i = 2; i <= n; i ++ ))
do
    x=$(expr $i - 1)
    y=$(expr $i - 2)
    a[$i]=$(expr ${a[$x]} + ${a[$y]})
done
echo ${a[$n]}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值