与shell相关的命令介绍

1.case语句

#!/usr/bin/bash

echo "input passwd"
read line

case "$line" in
    [yY][eE][sS] | [yY] ) echo "this is yes";;
    no ) echo "this is no";;
    * ) echo "this is ***";;
esac

2.函数

#1.函数的基本形式,与C语言函数形式基本相同,但是没有返回值
#$?代表最后一行语句的执行结果是为真还是为假
fun()
{
    echo "fun run"
    echo "fun \$# = $#"
    echo "fun \$1 = $1"
    echo "fun \$2 = $2"    
    echo "$?"
}

#2.函数如何传参,$1,$2放在函数中就是传给函数的第一个参数和第二个参数,在函数外边就是传给脚本的参数
#注意:脚本中没有主函数
main()
{
    fun 123 abc
}

#3.脚本中的函数如何返回值
add()
{
    if [ "$#" -eq 0 ]
    then 
        return 0
    fi
    if [ "$#" -eq 1 ]
    then
        return $1
    fi

    x=$1
    y=$2
    num=`expr $x + $y`
    return $num
}    
#第一种方法,打印出返回值
add 2 3
echo "add=$?"
#第二种方式
add 2 3
a=$?
echo "add=$a"

#4.上边的例子中,在函数外边使用num也是可以的,在一行一行解释之后,解释器种有num,会一直存在,所以以下的打印方法也是可以的,如果在第一个num定义之后,在定义一个num,第二个num实际上也就是第一个num,对num的改变,改变的是第一个num,与C语言的语法是不一样的
echo "add=$num"

#5.为了解决像上边的问题(可能未发生重命名的问题),可以用以下的两种方法解决
#第一种方法,利用local,则str只在此函数中生效
mytest()
{
    local str="hello"
    echo "mytest::$str"
}
#第二种方法,利用unset,str在函数以外的地方就不可用了,也就是在解释器中将这个变量移除了
mytest()
{
    str="hello"
    echo "mytest::$str"
    unset str
}

3.脚本调用脚本

#脚本调用脚本
#方法:直接在一个脚本中写出另一个脚本的绝对路径或者相对路径
#假设有两个脚本文件 a.sh和b.sh

#在a.sh中,调用b脚本,相对路径的前提条件是两个脚本在同一个目录下,调用b脚本b是a的子进程
echo "a.sh run pid=$$"
MYSTR="hello"
echo "MYSTR=$MYSTR"
./b.sh

#执行a脚本,是否会打印出b脚本中MYSTR的值,答案是不会的
#因为两个脚本被不同的解释器执行,解释器的进程号都是不一样的
#在b.sh中
echo "b.sh run pid=$$"
echo "MYSTR=$MYSTR"

#要在b脚本中得到a脚本中MYSTR的值,有3种方法
#第1种方法,export将变量变成环境变量,在之后产生的子进程中都会继承环境变量
echo "a.sh run pid=$$"
MYSTR="hello"
export MYSTR
./b.sh

#第2中方法,将MYSTR这个参数当作参数传递给 b.sh
echo "a.sh run pid=$$"
MYSTR="hello"
./b.sh MYSTR
#在b.sh中
echo "b.sh run pid=$$"
echo "MYSTR=$1"

#第3种方法,以点命令去执行b脚本,意味要将b脚本放在a脚本的解释器种去执行,这两个脚本用的是同一个解释器
echo "a.sh run pid=$$"
MYSTR="hello"
. ./b.sh MYSTR
#sourse与上边的 . 等价
sourse ./b.sh MYSTR
#在b.sh中
echo "b.sh run pid=$$"
echo "MYSTR=$MYSTR"




4.C程序调用脚本

#a.sh中的程序如下
#!/usr/bin/bash
echo "a.sh run pid=$$"
echo "a.sh argc=$#"

scho "shell name:$0"
for arg in $*
do
    echo "arg=$arg"
    shift
done

exit 0

#C程序,里边去调用脚本,将C程序替换成了脚本解释器的bash进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    printf("main pid=%d\n",getpid());
    execl("./a.sh","b.sh","aa","hello","123",(char*)0);
    perror("execl error");
}

#补充:在脚本调用C程序,直接在脚本中执行命令就行,例如:./main 或者 rm main.c,命令本身就是C程序

5.awk

功能:在文件中提取所需要的信息

适用情况

  1. 文件中每行内容的格式一致,比较像execl里边的二维数据,也像数据库中的表中的记录
  2. 第一列用$1表示,是第一个域,第二列用$2表示,是第二个域,以此类推,$0代表整行
  3. awk -F.  'print $1' file > file1     
  4. 上边的语句-F后边的.代表以.来划分域,'print $1'代表打印file文件域1的内容,写入到file文件中。如果以空格来划分域,-F+分割域符号不用写

6.sed

功能:sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。无论命令是什么,sed并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有定向到一个文件,将输出到屏幕。

用法:

  1. sed ‘3i\aaaaaaa' file > newfile:对file文件进行操作,在第三行新插入一行插入aaaaaaa,插入后将内容存入newfile文件中
  2. sed ‘3a\aaaaaaa' file > newfile:对file文件进行操作,在第三行后面插入一行aaaaaaa,实际上是插入到第四行,插入后将内容存入newfile文件中
  3. sed ‘3,5i\aaaaaaa' file > newfile:对file文件进行操作,在第三和第五行后面插入一行aaaaaaa,实际上是插入到第四行,插入后将内容存入newfile文件中
  4. sed  -n ‘3,5i\aaaaaaa' file > newfile:将第三行至第五行的内容打印出
上一篇:学习安装并配置一台~~Ubuntu~~ kali虚拟机并学习shell基本命令以及c++程序的调试


下一篇:Flink实战(八十):flink-sql使用(七)Flink SQL Clien读取Kafka数据流式写入Hive(用hive 管理kafka元数据)