管道介绍
管道是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