《Linux程序设计》学习笔记(二)——Shell

Shell

用户与Linux系统间接口的程序

功能强大:

< 和 > 输入输出重定向

| 同时运行程序,程序间数据管道传递

$(...) 获取子进程的输出

默认的 Shell 是 /bin/sh ,它是对 /bin/bash 的连接

Shell 脚本第一行是 #!/bin/sh

重定向

文件描述符0,一个程序的标准输入

文件描述符1,标准输出

文件描述符2,错误输出

例1: $ls -l > lsoutput.txt ,把标准输出重定向到一个文件

例2: $ps >> psoutput.txt ,重定向到文件,不是覆盖而是加到尾部

例3: $kill -HUP 1234 > killout.txt 2>killerr.txt ,标准输出重定向到killout.txt,错误输出重定向到killerr.txt

例4: $more < killout.txt ,重定向标准输入

管道

用 | 来连接进程

连接的进程可同时运行

数据流在进程间的传递可自动协调

例1: $ps | sort > pssort.out ,对ps的输出排序后保存

省去了进程间用来沟通的临时文件

Shell变量

默认情况下变量当做字符串对待

变量名前加 $ 来访问内容

赋值只需要变量名

检查变量内容, echo $变量名

例1:

salutation=Hello

echo $salutation

注意:

①若赋值的字符串里有空格,括号引起

②等号两侧不能有空格

用read命令给变量赋值

例2:

read salutation

在键盘上输入内容,完毕后回车

echo $salutation

"$foo" 把变量替换为它的值,引号作用是将变量中的空格作为字符串的一部分

'$foo' 就表示字符串$foo,当做普通字符串

参数变量

有时脚本程序在调用时带有参数

$0 表示Shell脚本的名字

$# 表示传给脚本参数的个数

$$ 表示Shell脚本的进程号

$1, $2, ... 用来指代脚本程序的参数

$* 在一个变量里列出所有参数,推荐使用 $@

case语句

语法:

case variable in

pattern [ | pattern ] ... ) statements;;

pattern [ | pattern ] ... ) statements;;

esac

将变量内容和模式进行匹配,分别执行不同代码

每个模式行以双分号结尾

非常适合处理用户输入

例1:用户输入

case "$timeofday" in

yes ) echo "Good Morning";;

no  ) echo "Good Afternoon";;

y    ) echo "Good Morning";;

n   ) echo "Good Afternoon";;

*   ) echo "not recognized";;

esac

例2:合并匹配模式

case "$timeofday" in

yes | y | Yes | YES ) echo "Good Morning";;

n* | N*  ) echo "Good Afternoon";;

*   ) echo "not recognized";;

esac

AND、OR列表

statement1 && statement2 && statement3 && ...

只有前面命令执行成功才运行后一条

statement1 || statement2 || statement3 || ...

如果有一条返回 false ,运行后面一条,直到有一条返回 true 就停止

Shell函数

语法:

function_name () {

statement

}

例1:

foo() {

echo "Function"

}

echo "script starting"

foo

echo "script ended"

把函数定义放在前面,shell先记住函数,然后才能调用

可通过 return 返回数值