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
功能:在文件中提取所需要的信息
适用情况
- 文件中每行内容的格式一致,比较像execl里边的二维数据,也像数据库中的表中的记录
- 第一列用$1表示,是第一个域,第二列用$2表示,是第二个域,以此类推,$0代表整行
- awk -F. 'print $1' file > file1
- 上边的语句-F后边的.代表以.来划分域,'print $1'代表打印file文件域1的内容,写入到file文件中。如果以空格来划分域,-F+分割域符号不用写
6.sed
功能:sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。无论命令是什么,sed并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有定向到一个文件,将输出到屏幕。
用法:
- sed ‘3i\aaaaaaa' file > newfile:对file文件进行操作,在第三行新插入一行插入aaaaaaa,插入后将内容存入newfile文件中
- sed ‘3a\aaaaaaa' file > newfile:对file文件进行操作,在第三行后面插入一行aaaaaaa,实际上是插入到第四行,插入后将内容存入newfile文件中
- sed ‘3,5i\aaaaaaa' file > newfile:对file文件进行操作,在第三和第五行后面插入一行aaaaaaa,实际上是插入到第四行,插入后将内容存入newfile文件中
- sed -n ‘3,5i\aaaaaaa' file > newfile:将第三行至第五行的内容打印出