shell脚本的那点小事儿--shell脚本管道和重定向(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27339239/article/details/82625251

内容一:shell脚本管道

分析场景:一个命令的输出作为另外一个命令的输入

语法结构: command1 | command2

内容二:输入/输出重定向

1.expr 关键字的应用

e.g:

#!/bin/bash

function operationAdd1() {

    number1=${1}
    number2=${2}
    result=`expr $number1 + $number2`
    return $result

}

function operationAdd2() {

    result=$(expr ${1} + ${2})
    return $result

}

function operationAdd3() {

    return $[${1} + ${2}]

}

operationAdd1 $1 $2
echo "result1: ${?}"

operationAdd2 $1 $2
echo "result2: ${?}"

operationAdd3 $1 $2
echo "result3: ${?}"

#shell中的运算可以一类expr和[]来完成

expr操作表格

操作符 描述
ARG1 | ARG2 如果ARG1既不是null也不是零值,那么返回ARG1,否则返回ARG2
ARG1 & ARG2 若两边的值都不为0 或为空,则返回ARG1,否则返回 0
ARG1 < ARG2 ARG1 小于ARG2
ARG1 <= ARG2 ARG1 小于或等于ARG2
ARG1 = ARG2 ARG1 等于ARG2
ARG1 != ARG2 ARG1 不等于ARG2
ARG1 >= ARG2 ARG1 大于或等于ARG2
ARG1 > ARG2 ARG1 大于ARG2
ARG1 + ARG2 计算 ARG1 与ARG2 相加之和
ARG1 - ARG2 计算 ARG1 与ARG2 相减之差
ARG1 * ARG2  计算 ARG1 与ARG2 相乘之积
ARG1 / ARG2 计算 ARG1 与ARG2 相除之商
ARG1 % ARG2 计算 ARG1 与ARG2 相除之余数

2.浮点数

2.1 bash 基本用法

bash计算器,实际上bash是一种编程语言

bash提供了执行浮点数的命令,允许在命令中输入浮点数,解释并且计算表达式,返回结果。

可以识别的数据类型

1.整数,浮点数

2.变量,简单的变量数组

3.注释,表达式

bc 命令,shell脚本通过bc访问bash

开启计算器 bc 退出计算器quit

shell脚本中运用bash计算器

语法结构:

val=$(echo "options;expression" | bc)

案例一:

function func1 () {

    #val=$(echo "options;expression" | bc)
    #option:选项
    #expression 表达式
    val=$(echo "scale=30;${1} * ${2}" | bc)
    val2=$(echo "$val * ${2}" | bc)
    echo $val2
    return $val

}
func1 $1 $2
echo "val=${?}"

案例二: bc命令+输出重定向

#!/bin/bash
function func2 () {
    
    val1=$1
    val2=$2
    val3=$3
    val4=$4
    val=$(bc<<sign
            scale=1
            a=($val1 * $val2)
            b=($val3 * $val4)
            a * b
          sign
         )
    echo "val=$val"
}

func2 $1 $2 $3 $4

#解析:
#val=$(bc<<标志符号
#        options
#        statements
#        expression
#        标志符号
#        )
# 标志符可以为任意字符,只需保持前后两个标志符号一致即可,一般使用EOF作为标志符,两个标志符号直接的内容视为一个整体

4.重定向的输出

4.1如何理解输入,输出和错误

在shell 脚本中将:输入,输出,错误分为了三种描述符(3种状态),分别对应的值为0,1,2

4.1.1第一种状态:STDIN->标准输入->0->键盘输入,文件读取

cat指令,接收键盘输入并且打印输出

a)cat STDIN标准输入

b)cat 非STDIN输入

第二种状态:STDOUT->标准输出->1->对应终端显示

a)重定向输出到文件

ls -l 显示文件的信息

b)将错误输出到文件中

文件a.sh代码如下

#!/bin/bash
if[ $0 ] 
    echo "false"
else 
    echo "success"
fi
#这一段脚本存在语法的错误,if与[]之间应有空格,if-else语句缺少了then关键字

终端输入:ls -al a.sh >> error.text

"-al":文件列表

shell不会将错误信息重定向到文件里面,虽然创建了error.text但不会将错误写入error.text,error.text内容为空

如果需要捕获异常需要通过STDERR去捕获

STDOUT和STDERR结合查看

STDERR的值为2

应在终端输入:ls -al a.sh 2> error.text

4.2.1重定向错误:

ls al fileC.sh 2> error.sh

4.2.2STDOUT和STDERR结合使用,向不同文件输出错误和查看的信息

重定向错误和重定向数据2>和1>

第一步:执行命令 

终端输入:ls -al fileA.sh fileB.sh fileC.sh 2> error.sh

第二步:查看结果

终端输入:ls -l fileA.sh fileB.sh

终端合并步骤一二得出:ls -al fileA.sh fileB.sh fileC.sh 2> error.sh 1> fileContent.sh

4.2.3将错误和信息重定向到同一个文件

终端输入:ls -al fileA.sh fileB.sh fileC.sh &> error.sh

4.3重定向输出

4.3.1 临时重定向"&"

案例一:

#!/bin/bash
echo "hello world" > &2
echo "你好世界"

#将echo "hello world" 定义为一个错误信息的打印
#终端输入:ls -al fileA.sh fileB.sh fileC.sh &> error.sh

案例二:

#!/bin/bash
#将下面的打印视为错误打印
echo "hello world" > &2
echo "你好世界"

运行:

./fileB.sh > error.sh # > 将正常标准输出打印到error.sh文件
./fileB.sh &> error.sh # &> 将所有输出打印到error.sh文件
./fileB.sh 2> error.sh # 2> 将输出打印到error.sh文件

4.3.2永久重定向

exec命令

exec 1> fileContent.sh 或者 exec 1>> fileContent.sh
exec 2> fileContent.sh 或者 exec 2>> fileContent.sh
exec &> fileContent.sh

e.g

#!/bin/bash
exec 1> fileContent.sh #exec 1> 将正常标准输出打印到 fileContent.sh
exec 2> fileContent.sh #exec 2> 将错误输出打印到 fileContent.sh

echo "hello shell"
echo "I am error" >&2 

5. 重定向的输入

5.1.1从文件输入内容

#!/bin/bash

exec fileContent.sh

count=0
while read line
do
    echo "line${count}: ${line}"
    count=$[ $count + 1 ]
done

#从fileContent.sh输入内容, read接收输入

6.创建自定义的重定向

系统提供了0,1,2的定向

6.1创建自己(自定义)输入文件描述

案例一:创建新的文件,或者替换内容

#!/bin/bash

#exec 创建重定向类型
exec 4> fileContent.sh
#标记输出的内容
echo "hello world" > &4

7.恢复文件描述符

7.1

#!/bin/bash

#最开始是40,重定向到1
exec 40 >> &1
exec 1 >> fileContent.sh
exec 40 >> error.sh
echo "hello shell"

#将还原为40
exce 1 >> &40
echo "你好, shell"

#重定向输出还原

8.输入重定向恢复

#!/bin/bash

exec 6<&0
exec 0< fileContent.sh

count=0
while read line
do
    echo "line${count}: ${line}"
    count=$[ $line + 1]
done

exec 0<&6
read -p "你是不是一个男人: " isMan
case $isMan in
    yes) echo "是男人";;
    no) echo "是女人";;
    *) echo "是人妖";;
esac

9.读写描述符

文件的内容

fileContent.sh内容代码

hello shell

你好 shell

fileA.sh脚本代码

#!/bin/bash

exec 4<>fileContent.sh
while read line <&4
do
    echo "${line}"
done
echo "我已经读完了" >&4

这里采用自定义,这种情况下需要按读取的指针指向内容后面追加内容或替换内容,

这里循环读取了多有内容,所以在指针运动到了文本的最后,所以效果为在原文本后追加新的输入

注意:以上的缩进是为了方便查看层级关系,如果在运行代码中报错(not found command),请去除缩进,注意if后的空格

猜你喜欢

转载自blog.csdn.net/qq_27339239/article/details/82625251