内容一: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
这里采用自定义,这种情况下需要按读取的指针指向内容后面追加内容或替换内容,
这里循环读取了多有内容,所以在指针运动到了文本的最后,所以效果为在原文本后追加新的输入