【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(七)-shell语法(5)

shell语法的一些知识和练习,可以当作笔记收藏一下!!

文章目录
前言

一、shell

二、shell语法

1.文件重定向

2.引入外部脚本

3.作业

总结


前言

shell语法的一些知识和练习,可以当作笔记收藏一下!!


提示:以下是本篇文章正文内容,下面案例可供参考

一、shell

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

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为脚本解释器。

二、shell语法

1.文件重定向

每个进程默认打开3个文件描述符:

  • stdin标准输入,从命令行读取数据,文件描述符为0
  • stdout标准输出,向命令行输出数据,文件描述符为1
  • stderr标准错误输出,向命令行输出数据,文件描述符为2

可以用文件重定向将这三个文件重定向到其他文件中。

重定向命令列表

|--------------------|-----------------------|
| 命令 | 说明 |
| command > file | 将stdout重定向到file中 |
| command < file | 将stdin重定向到file中 |
| command >> file | 将stdout以追加方式重定向到file中 |
| command n> file | 将文件描述符n重定向到file中 |
| command n>> file | 将文件描述符n以追加方式重定向到file中 |

输入和输出重定向:

echo "World" >> output.txt  # 将字符串追加到output.txt中

read str < output.txt  # 从output.txt中读取字符串

echo $str  # 输出结果:Hello World

同时重定向stdin和stdout

创建bash脚本:

#! /bin/bash

read a
read b

echo $(expr "$a" + "$b")

创建input.txt,里面的内容为:

3
4

acs@9e0ebfcd82d7:~$ chmod +x test.sh  # 添加可执行权限
acs@9e0ebfcd82d7:~$ ./test.sh < input.txt > output.txt  # 从input.txt中读取内容,将输出写入output.txt中
acs@9e0ebfcd82d7:~$ cat output.txt  # 查看output.txt中的内容
7

2.引入外部脚本

类似于C/C++中的include操作,bash也可以引入其他文件中的代码。

语法格式:

java 复制代码
. filename  # 注意点和文件名之间有一个空格

或

source filename

示例

创建test1.sh,内容为:

java 复制代码
#! /bin/bash

name=yxc  # 定义变量name

然后创建test2.sh,内容为:

java 复制代码
#! /bin/bash

source test1.sh # 或 . test1.sh

echo My name is: $name  # 可以使用test1.sh中的变量

执行命令:

java 复制代码
acs@9e0ebfcd82d7:~$ chmod +x test2.sh 
acs@9e0ebfcd82d7:~$ ./test2.sh 
My name is: yxc

3.作业

创建好作业后,先进入文件夹/home/acs/homework/lesson_3/,然后:

(0) 进入homework_0文件夹,编写自动完成lesson_1作业的脚本helper.sh。要求:

[1] 当前目录下仅包含helper.sh

[2] helper.sh具有可执行权限

(1) 进入homework_1文件夹,编写脚本check_file.sh。要求:

[1] 当前目录下仅包含check_file.sh。

[2] check_file.sh具有可执行权限。

[3] check_file.sh接收一个传入参数。格式为 ./check_file.sh file

[4] 判断传递参数,分别在标准输出中输出如下内容(不包括双引号):

  1. 如果传入参数个数不是1,则输出一行:"arguments not valid",然后退出,退出状态等于1。

  2. 如果file文件不存在,则输出一行:"not exist",然后退出,退出状态等于2。

  3. 如果file文件存在,则输出分别进行如下5个判断,然后退出,退出状态等于0。

1] 如果file为普通文件,则输出一行:"regular file"

2] 如果file为目录(文件夹),则输出一行:"directory"

3] 如果file具有可读权限,则输出一行:"readable"

4] 如果file具有可写权限,则输出一行:"writable"

5] 如果file具有可执行权限,则输出一行:"executable"

(2) 进入homework_2文件夹,编写脚本main.sh。要求:

[1] 当前目录下仅包含main.sh

[2] main.sh具有可执行权限

[3] 该文件从stdin(标准输入)中读取一个整数n

[4] 在stdout(标准输出)输出斐波那契数列的第n项。即:a[0] = 1, a[1] = 1, a[i] = a[i - 1] + a[i - 2], 求a[n]。

[5] 数据保证 0 <= n <= 20,脚本不需要判断n的合法性。

(3) 进入homework_3文件夹,编写脚本main.sh。要求:

[1] 当前目录下仅包含main.sh

[2] main.sh具有可执行权限

[3] 该文件从stdin(标准输入)中读取两行整数n和m

[4] 在stdout(标准输出)中输出1~n的按字典序从小到大的顺序数第m个全排列,输出一行,用空格隔开所有数,行末可以有多余空格。

[5] 数据保证 1 <= n <= 10, 1 <= m <= min(100, n!),脚本不需要判断数据的合法性。

java 复制代码
#! /bin/bash

read n
read m

#:<<EOF
for (( i = 1; i <= n; i ++ ))
do
    st[$i]=0
    p[$i]=0
done

dfs(){
    if [ $1 -eq $n ]
    then
        m=$(expr $m - 1)
        if [ $m -eq 0 ]
        then
            for (( i = 0; i < n; i ++ ))
            do
                echo -e "${p[$i]} \c"
            done
            echo ''
        return 0
        fi
        return 1
    fi
    local j=0
    for (( j = 1; j <= n; j ++ ))
    do
        if [ ${st[$j]} -eq 0 ]
        then
            p[$1]=$j
            st[$j]=1
            #x=$(expr $1 + 1)
            if dfs $(expr $1 + 1)
            then
                return 0
            fi
            st[$j]=0
        fi
    done
    return 1
}
dfs 0
#EOF

(4) 进入homework_4文件夹,编写脚本main.sh。要求:

[1] 当前目录下仅包含main.sh

[2] main.sh具有可执行权限

[3] main.sh接收两个传入参数。格式为 ./main.sh input_file output_file

[4] 从input_file中读取一个正整数n,然后将前n个正整数的平方和写入output_file中

[5] 数据保证 1 <= n <= 100,脚本不需要判断所有数据的合法性。

java 复制代码
#! /bin/bash

:<<EOF
input_file=$1
output_file=$2
EOF

#read n < $input_file
read n < $1
sum=0

for (( i = 1; i <= n; i ++ ))
do
    sqr=$(expr $i \* $i)
    sum=$(expr $sum + $sqr)
done

#echo $sum > $output_file
echo $sum > $2

总结

上述是shell语法的一些知识和练习,可以当作笔记收藏一下!!

相关推荐
上海文顺负载箱11 分钟前
如何评估焊机测试负载均衡性能
运维·负载均衡
粤海科技君24 分钟前
如何使用腾讯云GPU云服务器自建一个简单的类似ChatGPT、Kimi的会话机器人
服务器·chatgpt·机器人·腾讯云
傲骄鹿先生34 分钟前
阿里云centos7.9服务器磁盘挂载,切换服务路径
服务器·阿里云·磁盘
有谁看见我的剑了?1 小时前
Ubuntu 22.04.5 配置vlan子接口和网桥
服务器·网络·ubuntu
铁锤妹妹头发多1 小时前
新手用docker真**难受
运维·docker·容器
2739920291 小时前
Ubuntu20.04 安装build-essential问题
linux
超栈1 小时前
HCIP(11)-期中综合实验(BGP、Peer、OSPF、VLAN、IP、Route-Policy)
运维·网络·网络协议·计算机网络·web安全·网络安全·信息与通信
Cachel wood1 小时前
Github配置ssh key原理及操作步骤
运维·开发语言·数据库·windows·postgresql·ssh·github
编程一生1 小时前
回调数据丢了?
运维·服务器·前端
华为云PaaS服务小智2 小时前
华为大咖说 | 浅谈智能运维技术
运维·华为·华为云