《Linux程序设计》笔记(二)shell程序设计
1. 进程树形显示
ps -e f
2. 重定向
>
覆盖文件
>>
附加至文件
1>
标准输出
2>
标准错误输出
0
代表一个程序的标准输入
3. 程序可以在当前目录被查找
执行PATH=$PATH:.
或者添加这条命令到.bash_profile
,退出登录后再重新登录
4. 变量
用户输入赋值:read var1
改变命令提示符:echo "PS1='\u: \W$ '" >> ~/.bashrc
引号:如果把一个\(变量表达式放在双引号中,程序执行到这一行时就会把变量替换为它的值;如果你把它放在单引号中,就不会发生替换现象。还可以在\)字符前面加上一个\字符以取消它的特殊含义。
环境变量:
环境变量 | 说明 |
---|---|
$HOME | 当前用户的HOME目录 |
$PATH | 以冒号分隔的用来搜索命令的目录列表 |
$PS1 | 命令提示符,通常是\(字符,但在bash中,可以使用一些复杂的值。例如,字符串[\u@\h \W]\)就是一个流行的默认值,它给出用户名、机器名和当前目录名 |
$PS2 | 二级提示符,用来提示后续的输入 |
$IFS | 输入域分隔符 |
$0 | shell脚本的名字 |
$# | 传递给脚本的参数个数 |
$$ | shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件,如/tmp/tmpfile_$$ |
参数变量:
参数变量 | 说明 |
---|---|
$1, $2, ... | 脚本程序的参数 |
$* | 在一个脚本变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个分隔符分开。 |
$@ | 它是$*的一种精巧的变体,它不使用IFS环境变量 |
5. 条件
test或[命令:布尔判断命令。
可使用的条件类型归为3类:字符串比较、算数比较、与文件有关的条件测试。
具体使用方法参照:man test
Exmaple:
if test -f fred.c
then
...
fi
还可以写成这样:
if [ -f fred.c ]
then
...
fi
6. 控制结构
if语句
elif语句
echo -n
可以去除尾部的换行符。(password.sh
)
for循环
#!/bin/sh
for foo in bar fud 43; do
echo $foo
done
exit
使用通配符扩展for循环
#!/bin/sh
for file in $(ls f*); do
lpr $file
done
exit 0
while语句
用法见password.sh
until语句
与while语句相反
until condition; do
statements
done
case语句
case variable in
pattern [ | pattern] ...) statements;;
pattern [ | pattern] ...) statements;;
...
esac
详情见case.sh
命令列表
AND列表 | OR列表 |
---|---|
&& | || |
语句块
如果想在某些只允许使用单个语句的地方(比如AND或OR列表中)使用多条语句,可以把它们括在{}中来构造一个语句块。
get_confirm && {
grep -v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
函数
foo() {
echo "Function foo is executing"
}
echo "script starting"
foo
echo "script ended"
exit 0
详细用法见my_name.sh
命令
break
命令:跳出for、while、until循环。:
命令:空命令,在条件逻辑中也相当于true的别名,内置命令。while :
实现了一个无限循环。if [-f fred.sh ]; then
:
else
echo file fred did not exist
fi
continue
命令:跳到for、while、until的下一次循环。1. .
命令:用于在当前shell中执行命令。. ./shell_scripte
source命令和点命令在执行脚本程序中列出的命令时,使用的是调用该脚本程序的同一个shell。
echo
命令:输出结尾带有换行符的字符串。eval
命令:对参数进行求值。有点像一个额外的$,它给出一个变量的值的值。
foo=10
x=foo
eval y='\('\)x
echo $y
```
exec
命令:1.将当前shell替换为一个不同的程序; 2.修改当前文件描述符。exit n
命令:退出码0表示成功,退出1~125是脚本程序可以使用的错误代码。其余数字具有保留含义。退出码 说明 123 文件不可执行 127 命令未找到 128及以上 出现一个信号 export
命令:将作为它参数的变量导出到子shell中,并使之在子shell中有效。expr
命令:将它的参数当作一个表达式来求值。x=\
expr \(x + 1\`` 或 `x=\)(expr $x + 1)`在较新的脚本程序中,
expr
命令通常会被替换为更有效的$((...))
语法。printf
命令:格式化输出。不支持浮点数。更详细介绍可以参考printf在线手册的第一部分(man 1 printf
)。字符转换限定符 说明 d 输出一个十进制数字 c 输出一个字符 s 输出一个字符串 % 输出一个%字符 printf "%s\n" hello
printf "%s %d\t%s" "Hi There" 15 people
return
命令:函数返回。set
命令:为shell设置参数变量。#!/bin/sh echo the date is $(date)
set $(date)
echo The month is $2 exit 0
这个程序把date命令的输出设置为参数列表,然后通过位置参数$2获得月份。
shift
命令:把所有参数变量左移一个位置,使$2变成$1,原来$1的值将被丢弃,$0不变。shift命令后面可以指定左移位数。#!/bin/sh while [ "$1" != "" ]; do
echo "$1"
shift
done exit 0
trap
命令:用于指定在接收到信号后将要采取的行动。trap command signal
第一个参数是接收到指定信号时将要采取的行动,第二个参数是要处理的信号名。
信号 说明 HUP(1) 挂起,通常因终端掉线或用户退出而引发 INT(2) 中断,通常因按下Ctrl+C组合键而引发 QUIT(3) 退出,通常因按下Ctrl+\组合键而引发 ABRT(6) 中止,通常因某些严重的执行错误而引发 ALRM(14) 报警,通常用来处理超时 TERM(15) 终止,通常在系统关机时发送 具体使用见
trap/sh
unset
命令:从环境中删除变量或函数。这个命令不能删除shell本身定义的只读变量(如IFS)。foo = "Hello World"
echo $foo unset foo
echo $foo
find
命令:用于搜索文件的命令。find [path] [options] [tests] [actions]
find . -newer while2 -type f -print
在当前目录下搜索比文件while2要新的文件grep
命令:通用正则表达式解析器。选项 含义 -c 输出匹配行的数目,而不是输出匹配的行 -E 启用扩展式 -h 取消每个输出行的普通前缀,即匹配查询模式8的文件名 -i 忽略大小写 -l 只列出包含匹配行的文件名,而不输出真正的匹配行 -v 对匹配模式取反,即搜索不匹配行而不是匹配行 grep -c in words.txt words2.txt
在两个不同的文件中计算匹配行的数目。正则表达式
常用特殊符号 含义 ^ 指向一行的开头 $ 指向一行的结尾 . 任意单个字符 [] 方括号内包含一个字符范围,其中任何一个字符都可以被匹配。例如自负范围a~e,或在字符范围前面加上^符号表示使用反向字符范围,即不匹配指定范围内的字符 选项 含义 ? 匹配是可选的,但是最多匹配一次 * 必须匹配0次或多次 + 必须匹配1次或多次 {n} 必须匹配n次 {n,} 必须匹配n次或n次以上 {n,m} 匹配次数在n到m之间,包括n和m
命令的执行
$(command)
语法用来捕获command命令的执行结果。也就是说,执行一条命令,并把该命令的输出放到一个变量中。例如:
echo The current directory is $PWD
echo The current users are $(who)
whoisthere=$(who)
echo $whoisthere
exit
算数扩展
#!/bin/sh x=0
while [ "$x" -ne 10 ]; do
echo $x
x=$(($x+1))
done exit 0
参数扩展
#!/bin/sh
for i in 1 2
do
cat ${i}_tmp
done
在每次循环中,变量i的值替换了$(i),从而给出正确的文件名。
参数扩展 说明 ${param:-dafault} 如果param为空,就把它设置为default的值 ${#param} 给出param的长度 ${param%word} 从param的尾部开始删除与word匹配的最小部分,然后返回剩余部分 ${param%%word} 从param的尾部开始删除与word匹配的最长部分,然后返回剩余部分 ${param#word} 从param的头部开始删除与word匹配的最小部分,然后返回剩余部分 ${param##word} 从param的头部开始删除与word匹配的最长部分,然后返回剩余部分 比如:
lor@lor-vm:~$ w=nidaye
lor@lor-vm:~$ echo ${w%%y}
nidaye
lor@lor-vm:~$ echo ${w%%e}
niday
lor@lor-vm:~$ echo ${w%%*} lor@lor-vm:~$ echo ${w%*}
nidaye
lor@lor-vm:~$ echo ${w%e}
niday
lor@lor-vm:~$ echo www${w%%e}
wwwniday
here
文档
在shell脚本程序中向一条命令传递输入得一种特殊方法是使用here
文档。它允许一条命令在获得输入数据时就好像是在读取一个文件或键盘一样,而实际上是从脚本程序中得到的输入数据。
#!/bin/sh
cat <<melo
hello
world
melo
cat <<!this-is-here-document!
this
is
here
document
!
!this-is-here-document!
------------------------------------
运行结果:
lor@lor-vm:~$ bash ./here
hello
world
this
is
here
document
!
调试脚本程序
命令行选项 | set选项 | 说明 |
---|---|---|
sh -n <script> | set -o noexec set -n |
只检查语法错误,不执行命令 |
sh -v <script> | set -o verbose set -v |
在执行命令之前回显它们 |
sh -x <script> | set -o xtrace set -x |
在处理完命令之后回显它们 |
sh -u <script> | set -o nounset set -u |
如果使用了未定义的变量,就给出出错信息 |
使用下面的命令来启用xtrace选项:
set -o xtrace
再用下面的命令来关闭xtrace选项:
set +o xtrace
在shell中,你还可以通过捕获EXIT信号,从而在脚本程序退出时查看到程序的状态。
`trap 'echo Exiting: critical variable = $critiacal_variable' EXIT
7. 迈向图形化:dialog工具
第一个程序:
dialog --msgbox "Hello World" 9 18
更复杂的程序:
dialog --title "Confirm" --yesno "Are you willing to take part?" 9 18
if [ $? != 0 ]; then
dialog --infobox "Thank you anyway" 5 20
sleep 2
dialog --clear
exit 0
fi
使用一个输入框来询问用户的姓名,将它保存到变量Q_NAME中:
dialog --title "Questionnaire" --input "Please enter your name" 9 30 2>_1.txt
Q_NAME=$(cat _1.txt)
重定向标准错误流2到临时文件_1.txt,然后再将它放到变量Q_NAME中。
8. 综合应用
CD数据库应用程序。对每张CD唱片保存以下消息:
- CD唱片的目录编号
- 标题
- 曲目类型
- 作曲家或艺术家
对曲目,我们只保存两条信息:
- 曲目编号
- 曲名
标题文件:
目录编号 | 标题 | 曲目类型 | 作曲家 |
---|---|---|---|
CD123 | Cool sax | 爵士 | Bix |
CD234 | Classic violin | 古典 | Bach |
CD345 | Hits99 | 流行 | Various |
曲目文件:
目录编号 | 曲目编号 | 曲名 |
---|---|---|
CD123 | 1 | Some jazz |
CD123 | 2 | More jazz |
CD234 | 1 | Sonata in D minor |
CD345 | 1 | Dizzy |
使用CSV文件保存数据。
代码见CDDB.sh
《Linux程序设计》笔记(二)shell程序设计的更多相关文章
- Linux学习笔记(二) 文件管理
了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...
- Linux 的使用基础---Shell程序设计
Shell是Linux系统中的一个重要的层次,它是用户与系统交互作用的界面.Shell除了作为命令解释程序以外,还是一种高级程序设计语言.利用Shell程序设计语言可以编写出功能很强.但代码简单的程序 ...
- Linux学习笔记 -- 初识 Shell
Shell 是什么 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell既是 ...
- Linux分享笔记:shell终端的介绍
[1] Linux中 “shell终端” 和 “bash解释器” 的区别 shell终端是通过基于系统调用接口开发出的程序,用来让用户与系统进行对话,管理计Linux系统.它是一个命令行工具,操作类似 ...
- linux 学习笔记二
笔记二 命令行格式 command [-options] parameter1 parameter2 ... 命令 选项 参数(1) 参数(2) options 和 参数 不是必须的 帮助命令 man ...
- Linux学习笔记二:Ubuntu安装SSH(Secure Shell)服务
Ubuntu默认是没有安装SSH(Secure Shell)服务,如果想要通过ssh链接到Ubuntu,我们需要手动安装ssh-server. SSH分客户端ssh-client,服务端ssh-ser ...
- Linux 读书笔记 二
一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 若不小心登出后,直接刷新页面即可 2. 环境使用 完成实验后可以点击桌面上方的“实验截图”保存并分 ...
- MongoDB学习笔记二—Shell操作
数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- #Linux学习笔记# 自定义shell终端提示符
我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...
随机推荐
- java 同时安装多版本问题
java 同时安装多版本问题(转) http://www.cnblogs.com/SamuelSun/p/6022296.html http://blog.csdn.net/u013256622/ar ...
- hdu2005 第几天?【C++】
第几天? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 【[Offer收割]编程练习赛12 C】矩形分割
[题目链接]:http://hihocoder.com/problemset/problem/1495 [题意] [题解] 把每个方块都再分成3*3的小块; 这样; 对于一个方块来说 如果是'\' 则 ...
- Awesome Python(中文对照)
python中文资源大全:https://github.com/jobbole/awesome-python-cn A curated list of awesome Python framework ...
- nyoj_218_Dinner_201312021434
Dinner 时间限制:100 ms | 内存限制:65535 KB 难度:1 描述 Little A is one member of ACM team. He had j ...
- K - Count the string kmp_Next数组应用
It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ...
- cogs 22. [HAOI2005] 路由选择问题
22. [HAOI2005] 路由选择问题 ★★★ 输入文件:route.in 输出文件:route.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] X城有一个 ...
- DELPHI RTTI实现非可视的功能插件
思路:通过数据字典定义BPL包名,然后定义BPL包里面的类名,然后定义类里面的方法名,最后定义方法的参数值. 可实现动态加载BPL,调用哪个BPL的哪个类的哪个方法并给该方法赋给指定的参数值,如果是函 ...
- PHP array_diff()
定义和用法 array_diff() 函数返回两个数组的差集数组.返回的数组的元素都取自被比较的数组(既第一个数组). 在返回的数组中,键名保持不变. 语法 array_diff(array1,arr ...
- SQL Server 2012内部原理及故障排除(专栏)
PROFESSIONAL SQL SERVER® 2012 INTERNALS AND TROUBLESHOOTING一书(可从这里下载).认为内容非常不错.自己也想对SQL Server 2012有 ...