shell读取文件到变量、管道重定向、if和while嵌套使用、命令替换


管道介绍

管道是Linux编程中最常用的技术之一,管道符“|”
管道技术是Linux一种基本的进程间通信技术,它利用先进先出(First In First Out,FIFO)排队模型来指挥进程间的通信。对于管道,我们可以形象地把它们当作是连接两个实体的一个单向连接器。 Linux管道可用于应用程序之间、Linux命令之间,以及应用程序和Linux命令之间的通信,Shell编程主要是利用管道进行Linux命令之间的通信

command1 | command2 |…|commandn

command1到commandn表示Linux的n个命令,这n个命令利用管道进行通信。command1执行完后,如果没有管道,command1的输出结果将直接显示在Shell上,当Shell遇到管道符“|”后,就将command1的输出发送给command2,作为command2的输入。

ls -l | grep vi

列出该路径下目录的文件列表,并在其中查找与vi匹配的内容
在这里插入图片描述

ls -l | grep vi | wc -l

在上面的基础上再对查找出来的行进行计数
在这里插入图片描述
ls -l | more

用more命令显示文件显然便于用户阅读,尤其是对那些一页不够显示的结果。利用管道功能可以方便地将多页的结果进行分页显示,比如,/etc目录下有很多文件,列出这些文件时,需要多页显示,我们可以将ls的结果通过管道传给more命令,more命令将多页结果进行分页显示,便于用户查看

注意:
● 管道“|”其实也是I/O重定向的一个操作部分。

● 管道左边是一个可以送到标准输出(stdout)的命令,右边是一个从标准输入接收(stdin)的命令;如果I/O重定向符左边是有输出的命令,右边只能是文件,如果I/O重定向符左边是能接收输入的命令,右边只能是文件。

● 在管道执行的时候启动了两个进程,该进程分别执行左右两边的命令;而I/O重定向符值则在同一个进程中完成。

脚本:读取文件,在while中使用if判断

while :
do    
    python3 signyy.py | tee "log.txt"
    var=$(cat log.txt)
    if [[ $var == "yes" ]];
    then
        break
    fi
done
echo "value=$var"

注意if后面要有空格

位置参数

位置参数(Positional Parameters)是一种特殊的Shell变量,用于从命令行向Shell脚本传递参数,$1表示第1个参数,$2表示第2个参数等, 0 为 脚 本 的 名 字 , 从 0为脚本的名字,从 0{10}开始,参数号需要用花括号括起来,如 10 、 {10}、 10{11}、 100 等 。 {100}等。 100*和$@一样,表示从$1开始的全部参数。 下面举例说明位置参数的用法:

脚本:

#!/bin/bash
echo "the parameter: $1"
echo "the parameter number: $#"

命令行输入 ./test.sh a
输出
“the parameter: a”
“the parameter number: 1”
$#是位置参数的个数 $$是执行该脚本所启动的进程号

命令替换

命令替换是指将命令的标准输出作为值赋给某个变量,bash Shell定义了两种语法进行命令替换,一种是使用反引号,另一种是利用$(),两种等价的语法格式如下:

`linux命令`
$(linux命令)

echo `who`

root@iZuf64cvuzy0uruzobicmgZ:/PyTorch-YOLOv31# echo
`date`
Fri Sep 17 09:07:24 CST 2021

当命令替换返回有多行结果时,如果不引用命令替换的结果,换行符也将被删除,

命令替换删除换行符:

dir = `ls -l a*`  #命令替换
echo $dir  #不引用dir变量,换行符被删除
echo "$dir" #引用dir变量,换行符保留

命令替换使bash Shell可以与其他编程语言编写的程序结合起来,运行如C/C++、Java语言编写的程序同样输出到stdout上,我们只要使用命令替换将输出保存到Shell变量,Shell就可以对其他编程语言编写的程序所产生的输出进行任何处理。

例子:example.c

#include<stdio.h>
main(){
printf("hello")
}

然后在目录下执行:

gcc -o example example.c #编译源文件,生成可执行文件
testc = `./example` #将结果赋给testc变量
echo $testc  #输出hello

退出状态

在Linux系统中,每当命令执行完成后,系统都会返回一个退出状态。该退出状态用一整数值表示,用于判断命令运行正确与否。若退出状态值为0,表示命令运行成功;若退出状态值不为0,则表示命令运行失败。最后一次执行命令的退出状态值被保存在内置变量“$?”中,所以可以通过echo语句测试命令是否运行成功。POSIX规定了几种退出状态和退出状态的含义
在这里插入图片描述

touch exit_file #创建文件
ls 
echo $? #输出0 表示创建成功

测试条件

测试命令是判断语句和循环语句中条件测试的工具,所以该命令对编写Shell脚本是非常重要的。
测试命令可用于测试表达式的条件的真假。如果测试的条件为真,则返回一个 0值;如果测试的条件为假,将返回一个非 0整数值。这一点和C语言的条件判断语句是有区别的,在C语言中,条件为真时返回的是一个非0正整数值,条件为假时返回一个0值,所以,若以前学习过C语言,要注意其区别,以免混淆。
格式:
test expression 或者 [ expression ] 空格一定不能少

test测试数值:

在这里插入图片描述

[ "$a" -eq "$b" ]
echo $?  #退出状态为1,说明a b变量不相等

测试字符串

在这里插入图片描述

注意仅有一种格式 test string

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值