shell脚本知识梳理(八)文本处理

文本处理带真正用到时再研究吧。

2018/12/9 posted in  shell脚本

shell脚本知识梳理 (六)函数

函数

#!/bin/bash
function testFunc(){
    echo $1:$2
    return 100;
}

echo "调用前"
testFunc "rao" "jun";
echo "返回结果$?"
echo "调用后"

函数的传参数与在命令里的传参数基本相同。返回值用$?记录上次函数的返回值。

2018/12/9 posted in  shell脚本

shell脚本知识梳理(零)linux 基础命令

shell的基础命令,列出已经掌握的基本命令

linux的文件权限

-rwxr--r--  1 raojunbo  staff   159 12  8 17:20 file2.sh

chmod 改变文件的权限
chown 改变文件所有者
chgrp 改变文件所属用户

Linux的文件与目录管理

ls 列出文件及目录列表
cd 进入目录
pwd 显示文件路径
touch 创建新文件
file 查看文件类型

目录操作

mkdir
rmdir

文件操作

cp
rm
mv

查看文件

cat
more
less
head
tail

查找文件名

whereis
locate
find

2018/12/9 posted in  shell脚本

shell脚本知识梳理(七)SQL应用处理

导出.cvs格式

2018/12/8 posted in  shell脚本

shell脚本知识梳理(五)输出

echo

printf 格式化输出

[TOC]
- 区别一
print不会自动换行
echo 会自动换行

  • 区别二 print 用于格式打印 echo 用于标准的输出
printf "%-4s%-8s%-4s\n" 姓名 性别 体重
printf "%-4s%-8s%-4s\n" raoraoraorao 男 120
printf "%-4s%-8s%-4s\n" jun 女 130
printf "%-4s%-8s%-4s\n" bo 女 140

格式化输出 "s"表示字符串,一个宽度是10的字符,如果超出也显示,不足10用空白不齐,”-“表示左对齐。

管道

将一个命令的输出做威另一个命令的输入

重定向输出

原来是重定向到控制台输出,现在是重定向输出到文件

文件重定向
以控制台为参照
系统已经存在的文件描述符0(标准输入即键盘),1(标准输出即控制台),2(标准错误),其他是可自定义的文件描述符

白话理解cat命令行重定向
原来是从键盘输入,现在是从文件输入
cat 命令直接输入cat命令,从键盘输入,然后在控制台输出。
cat file 采用cat接收一个非STDIN文件输入,即将输入变成从文件读取
特别说明

重定向不限制于cat命令,任何命令都可以。
就是将一个命令的输出重定向到其他文件或者标准输出。在一个命令的输入时,也可以从一个文件或者标准输入作为输入,即输入重定向

“> ” 重定向输出到一个文件
">>" 重定向输出到一个文件并且是追加到后面

命令行里的输入与输出重定向

案例一:重定向错误输出到一个文件中
当我们的命令发生错误时,shell并不会将错误重定向到输出的重定向文件。重定向时要写上文件描述符

ls -al fileC 2> errfile.sh 

案例二:将正确信息重定向到一个文件,将错误信息重定向到一个文件

ls -al fileA.sh fileC.sh 2> errfile.sh 1> fileD.sh

案例三:将正确与错误输入到同一个文件

ls -al fileA.sh fileC.sh &>  fileD.sh 

脚本文件里的输入与输出重定向

要想在脚本文件里指定文件的输入与输出重定向,需要对这个要输出的内容做标记。告诉要输入或者输出到哪个文件。那么这个文件的描述符就需要在脚本里写出

  • 临时重定向 这里的&2是一种标记,标记其内容将会进入那个重定向,因为只起到临时标记的作用。所以叫临时重定向。这里的临时,永久是在脚本文件里告诉,命令的输入与输入。也就是在脚本文件里告诉有输出,有输入的一个流。
# 临时重定向 在一个shell脚本里,将一个输出设置成临时重定向

echo "hello owrk" >&2;
echo "你好" >&2;
  • 永久重定向 这里的永久重定向,说白点就是一次性标记。
exec 1> fileContent.sh
echo "hello world"
echo "你好"

# 更改为重定向
exec 2> errorfile.sh
echo "我报错了" >&2   
# 将我报错了进行标记 
exec 0< fileContent.sh
# 读物文件的所有行
count=1;
while read line  
do
echo "读取的内容${line},行数${count}";
count=`expr $count + 1`;
done

自定义文件描述符

  • 创建文件读写描述符号示例
#创建文件的读写描述符
exec 3<> fileContent.sh

#读取文件中的一行数据
read line <&3

#打印数据
echo "读取数据:"$line;
echo "哈哈,看写入文件了没wwwww有" >&3
  • 关闭文件描述符 关闭文件描述符后,不能写入文件

exec 3>&-

  • 恢复文件描述符(这个很难理解,实际上是一个暂存)
# 创建一个文件描述符3,执行原有文件描述符1,也就是是控制台输出
exec 3>&1;

# 创建文件描述符1,重定向到一个文件
exec 1> fileContent.sh

echo "工作1";

echo "工作2";

# 将1重定向到预先保存的控制台输出,所左这之后会输出都屏幕,也就是恢复了
exec 1>&3
echo "完成了";

修改输入并恢复输入
exec 6<&0;
exec 0< fileContent.sh

# 系统还是会从0所指向的文件进行读取,输出还是原有的输出
while read line 
do
 echo "文件内容${line}"
done

exec 0<&6;

echo "读取完成";

总结

0,1,2,是系统默认已经指定了的文件描述符,分别指向键盘文件,控台台文件,错误文件。exec的本质是在一个进程里创建一个文件描述符。在shell脚本里可以创建文件描述符指定特定的文件进行输入与输出。
文件描述符的理解,文件描述符只是一个符号

2018/12/6 posted in  shell脚本

shell脚本知识梳理(三) 流程控制

if语句

这里的条件就是上节说的test命令的参数

if [ 条件 ]
then
    代码
fi
if [ 条件]
then
    代码
else
    代码
fi
if [ 条件 ]
then
    代码
elif [ 条件 ]
then
    代码
fi

for语句

for 变量名 in item1 item2 item3
do
    代码    
done
for name in "rao" "jun" "bo"
do
    echo ${name}
done    
//列出当前目录所有文件(用的for in)
file=`pwd`/*;
for name in ${file}
do
    echo ${name}
done
//for 的c形式
for (( i = 0; i < 10; i++ )); do
    echo $i;
    for (( j = 0; j < 10; j++ )); do
        echo $j;
    done
done
//一个一个显示文件列表
for i in `ls `
do
echo "这是文件${i}";
done

while

while [] 
do

done
//示例
var=10;
while [ ${var} -gt 0 ];
do
echo $var;
var=`expr ${var} - 1`;
done

switch case

number=1
case $number in
    1) echo "等于1";;
    2) echo "等于2";;
esac
2018/12/6 posted in  shell脚本

shell脚本知识梳理(二)test命令的条件

算术运算

a=1;
b=2;
c=`expr ${a} + ${b}`;
d=`expr ${a} - ${b}`;
e=`expr ${a} \* ${b}`;
f=`expr ${a} / ${b}`;
echo $c;
echo $d;
echo $e;
echo $f;
a=1;
b=1;

if [ ${a} != ${b} ]
    then
    echo "a不相等b"
fi


if [ ${a} == ${b} ]; then
    echo "a相等b"
fi
a=100;
b=200;
val=`expr $a + $b`;//这个算是最标准的写法吧
echo $val;
a=100;
b=200;
val=$(expr $a + $b);
echo $val;
a=100;
b=200;
val=$[ $a + $b ];
echo $val;

特别说明,上述的拿到一个命令的输出值用一个变量去接收。可以有三种写法。但通常还是低一种写法
特别说明expr即运算表达式计算命令。在命令行里可以直接执行。实际上expr永远不止,运算表达式。里面也可以是关系表达式,逻辑表达式,字符串表达式。只不过shell的的运算比较弱,需要借助这个命令行工具来实现计算。

算术运算bc(浮点解决方案)

在做运算时,可以用expr也可以用bc计算器。bc实际是一个专门的命令。在脚本中,将其当做普通命令就可以了,即使用命令替换就可以得到结果。bc 的输入实际是一个表达式.

bc基本用法

bc计算器
数字,整数,浮点数
示例
直接在命令行输入:bc命令,然后进行计算
解释一下bc命令:在shell脚本语言中提示符下通过bc命令访问bc计算。相当于打开计算器。

quit退出计算器

  • bc 在脚本中的应用
val1=1.314;
val2=0.618;
val3=`echo "$val1 * $val2" | bc`;
val4=`echo "$val3 * $val2" | bc`;
echo $val4;
  • bc的输入重定向之打包计算
val=$(bc << fg
    options
    statements
    expression
    fg
)
val1=1.314;
val2=0.618;
val3=100;
val4=100;
val=$(bc << fg
    a=($val1 *$val2)
    b=($val3 *$val4)
    a * b
    fg
)
echo "val结果:${val}";

数值比较运算

特别说明
这里说的数值运算,布尔运算,逻辑运算,字符串比较运算,文件测试运算实际上都是test命令的条件参数,实际就是test 条件参数的返回结果,在分支语句中都是通过test来计算的。只不过为了简便,分支语句将test 用[] 等替换了。

-eq 检测两个数是否相等(equal);
-ne 检测两个数是否相等(not equal),不相等时返回true;
-gt  检测左边的数是否大于右边的数(greater)
-lt 小于
-elt 小于等于(equal or less than)

布尔运算

! 非运算
-O 或运算(or)
-a 与运算(and)
a=10;
b=20;
if [ $a != $b ]
    then
    echo "a 于b 不相等";
fi
if [ $a -lt 100 -a $b -gt 15 ]
    then
    echo "$a 小于100,并且$b 大于15";
fi

逻辑运算

&&逻辑且
||逻辑或

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

字符串运算符

= 两字符串是否相等,相等返回true
!= 两字符串是否相等,不相等返回true
-z 字符串长度是否为0(zero)
-n 字符串长度是否为0

文件测试运算符

屏幕快照 2018-12-06 11.47.58

2018/12/6 posted in  shell脚本

shell脚本知识梳理(四)输入

文件包含

文件包含进来后,当执行这个脚本时都会执行

  • 方式一 #!/bin/bash ./fileA.sh //文件路径 echo "我是文件B"
  • 方式二
source fileA.sh  //文件路径

cat

read

read 输入读取单行数据

  • 方式一
#!/bin/bash
echo "请输入名字";
read name;
echo "您的名字"${name};
  • 方式二(带输入提示,带输入超时时间)
#!/bin/bash

read -p "请输入您的名字" name;
echo "您的名字"${name};
if [ `read -t 3 -p "请输入您的名字" name` ]
    then
    echo ${name}
else
    echo "超时";
fi
  • 方式三(隐藏输入)
read -s  -p "请输入您的名字" name
echo ${name}

这里在实践的过程中,发现条件命令。等有时写不正确,也就是在一些控制语句,[] 里的条件。

2018/12/6 posted in  shell脚本

shell脚本知识梳理(一)之变量

shell变量

一:定义变量

name="rjb";

  • 定义变量时候,变量名直接定义
  • 变量名和=号之间不能有空格
  • 变量名首位不能是数字

删除变量

unset name

变量类型

  • 本地变量
    整个bash进程可以使用,name="rjb";

  • 局部变量
    当前的代码段,local name="qing";(local是关键字)

  • 环境变量
    当前shell的进程以及子进程export name="raojunbo";
    export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。也即是

  • 位置变量:

//位置变量示例
name=${1};age=${2}; echo "姓名:${name} 年龄:${age}``;
执行脚本时./hello.sh  rjb  28

如下是位置变量

${0}是脚本文件名,参数是从1开始的,且在执行脚本时,参数与参数之间要有空格
${?} 表示返回上一个命令执行状态的反回值,0表示成功,1表示执行结果,2然后是错误状态吗
${#} 表示参数的个数
${*} 表示参数列表,将所有的参数组成一个字符串
${@} 表示参数列表
${$} 获取当前shell的进程id
特别说明: $?,$#,$*,$@,$$,$raojunbo 。不过书写成加{}更好区分。

使用变量

${变量名} 或者$变量名

二:字符串

区别单引号与双引号字符串

单引号里都是原样输出,双引号里

字符串拼接

   name="rjb";
    age=100;
    info="姓名:${name}年龄:${age}";
    echo $info;

    方式二
    
    
    name="rjb";
    age=100;
    info="姓名"${name}"年龄"${age};
     echo $info;    

字符串长度 ${#变量}

name="raojunbo";
echo ${#name};

字符串截取 ${变量:开始位置:结束位置}

//从1到3的子串
 name="raojunbo";   
 ${name:1:3}  
 
//从1开始直到最后
     name="raojunbo";
    ${name:1}

字符串的操作是一个比价大的话题。在具体使用时可以查相关文档。知道基本的用法就可以了。

三:数组

初始化方式

方式一:name=("404","andy","全班");
方式二:
name=();
name[0]="404"
name[1]="anddy"
name[2]="柚子

name=();
name[0]="1";
name[1]="2";

读取数组

name={"404","anddy","全部"}
echo ${name[1]}
echo ${name[@]}<!--输出所有数据-->

特别说明

@ 是一个一个输出
* 是组成一个字符串后输出 

数组长度

${#name[@]}表示取数组的全部个数,#表示取数目

#表示取长度或者数目

参数的传递

./文件名.sh 参数1 参数2 参数3

${0};表示文件名称
${1};表示参数1
${2};表示参数2
$#:表示传进来脚本的参数个数
2018/11/19 posted in  shell脚本