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

命令

  1. break命令:跳出for、while、until循环。

  2. :命令:空命令,在条件逻辑中也相当于true的别名,内置命令。while :实现了一个无限循环。

    if [-f fred.sh ]; then
    :
    else
    echo file fred did not exist
    fi
  3. continue命令:跳到for、while、until的下一次循环。

    1. .命令:用于在当前shell中执行命令。

    . ./shell_scripte

    source命令和点命令在执行脚本程序中列出的命令时,使用的是调用该脚本程序的同一个shell。

  4. echo命令:输出结尾带有换行符的字符串。

  5. eval命令:对参数进行求值。有点像一个额外的$,它给出一个变量的值的值。

foo=10

x=foo

eval y='\('\)x

echo $y

```

  1. exec命令:1.将当前shell替换为一个不同的程序; 2.修改当前文件描述符。

  2. exit n命令:退出码0表示成功,退出1~125是脚本程序可以使用的错误代码。其余数字具有保留含义。

    退出码 说明
    123 文件不可执行
    127 命令未找到
    128及以上 出现一个信号
  3. export命令:将作为它参数的变量导出到子shell中,并使之在子shell中有效。

  4. expr命令:将它的参数当作一个表达式来求值。

    x=\expr \(x + 1\`` 或 `x=\)(expr $x + 1)`

    在较新的脚本程序中,expr命令通常会被替换为更有效的$((...))语法。

  5. printf命令:格式化输出。不支持浮点数。更详细介绍可以参考printf在线手册的第一部分(man 1 printf)。

    字符转换限定符 说明
    d 输出一个十进制数字
    c 输出一个字符
    s 输出一个字符串
    % 输出一个%字符

    printf "%s\n" hello

    printf "%s %d\t%s" "Hi There" 15 people

  6. return命令:函数返回。

  7. set命令:为shell设置参数变量。

    #!/bin/sh
    
    echo the date is $(date)
    set $(date)
    echo The month is $2 exit 0

    这个程序把date命令的输出设置为参数列表,然后通过位置参数$2获得月份。

  8. shift命令:把所有参数变量左移一个位置,使$2变成$1,原来$1的值将被丢弃,$0不变。shift命令后面可以指定左移位数。

    #!/bin/sh
    
    while [ "$1" != "" ]; do
    echo "$1"
    shift
    done exit 0
  9. trap命令:用于指定在接收到信号后将要采取的行动。

    trap command signal

    第一个参数是接收到指定信号时将要采取的行动,第二个参数是要处理的信号名。

    信号 说明
    HUP(1) 挂起,通常因终端掉线或用户退出而引发
    INT(2) 中断,通常因按下Ctrl+C组合键而引发
    QUIT(3) 退出,通常因按下Ctrl+\组合键而引发
    ABRT(6) 中止,通常因某些严重的执行错误而引发
    ALRM(14) 报警,通常用来处理超时
    TERM(15) 终止,通常在系统关机时发送

    具体使用见trap/sh

  10. unset命令:从环境中删除变量或函数。这个命令不能删除shell本身定义的只读变量(如IFS)。

    foo = "Hello World"
    echo $foo unset foo
    echo $foo
  11. find命令:用于搜索文件的命令。

    find [path] [options] [tests] [actions]

    find . -newer while2 -type f -print 在当前目录下搜索比文件while2要新的文件

  12. grep命令:通用正则表达式解析器。

    选项 含义
    -c 输出匹配行的数目,而不是输出匹配的行
    -E 启用扩展式
    -h 取消每个输出行的普通前缀,即匹配查询模式8的文件名
    -i 忽略大小写
    -l 只列出包含匹配行的文件名,而不输出真正的匹配行
    -v 对匹配模式取反,即搜索不匹配行而不是匹配行

    grep -c in words.txt words2.txt 在两个不同的文件中计算匹配行的数目。

  13. 正则表达式

    常用特殊符号 含义
    ^ 指向一行的开头
    $ 指向一行的结尾
    . 任意单个字符
    [] 方括号内包含一个字符范围,其中任何一个字符都可以被匹配。例如自负范围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
  1. 算数扩展

    #!/bin/sh
    
    x=0
    while [ "$x" -ne 10 ]; do
    echo $x
    x=$(($x+1))
    done exit 0
  2. 参数扩展

    #!/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程序设计的更多相关文章

  1. Linux学习笔记(二) 文件管理

    了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...

  2. Linux 的使用基础---Shell程序设计

    Shell是Linux系统中的一个重要的层次,它是用户与系统交互作用的界面.Shell除了作为命令解释程序以外,还是一种高级程序设计语言.利用Shell程序设计语言可以编写出功能很强.但代码简单的程序 ...

  3. Linux学习笔记 -- 初识 Shell

    Shell 是什么 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell既是 ...

  4. Linux分享笔记:shell终端的介绍

    [1] Linux中 “shell终端” 和 “bash解释器” 的区别 shell终端是通过基于系统调用接口开发出的程序,用来让用户与系统进行对话,管理计Linux系统.它是一个命令行工具,操作类似 ...

  5. linux 学习笔记二

    笔记二 命令行格式 command [-options] parameter1 parameter2 ... 命令 选项 参数(1) 参数(2) options 和 参数 不是必须的 帮助命令 man ...

  6. Linux学习笔记二:Ubuntu安装SSH(Secure Shell)服务

    Ubuntu默认是没有安装SSH(Secure Shell)服务,如果想要通过ssh链接到Ubuntu,我们需要手动安装ssh-server. SSH分客户端ssh-client,服务端ssh-ser ...

  7. Linux 读书笔记 二

    一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 若不小心登出后,直接刷新页面即可 2. 环境使用 完成实验后可以点击桌面上方的“实验截图”保存并分 ...

  8. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  9. Linux学习笔记(17) Shell编程之基础

    1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...

  10. #Linux学习笔记# 自定义shell终端提示符

    我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...

随机推荐

  1. 第八节:numpy之四则运算与逻辑运算

  2. Java基础学习总结(72)——提升 java 代码的运行效率

    前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...

  3. ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听

    对于ActiveMQ消息的发送,原声的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了.那么,Spring提供了一个很方便的去收发消息的框架,spring jms.整合 ...

  4. mybatis源码阅读-执行器StatementHandle和ParameterHandler(五)

    StatementHandle 类图 各个实现类的作用 SimpleStatementHandler 用于使用Statement操作数据库(不会使用参数化查询?) PreparedStatementH ...

  5. libcloud代码研究(一)——基本架构

    libcloud是apache下整合多种云服务接口的项目.最近,在研究libcloud代码的同时,将阿里云存储(Ali OSS)和百度云存储用libcloud storage driver规范进行封装 ...

  6. [TS-A1488][2013中国国家集训队第二次作业]魔法波[高斯消元]

    暴力直接解异或方程组,O(n^6)无法接受,那么我们考虑把格子分块,横着和竖着分别分为互不影响的块,这样因为障碍物最多不超过200个,那么块的个数最多为2*(800+200)=2000个,最后用bit ...

  7. redis 初学

    1.网站:http://redis.cn/ 2.下载安装和配置 http://www.tuicool.com/articles/aQbQ3u 3.简述redis http://www.jb51.net ...

  8. JS 缓冲运动 带运动的留言本 小案例

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  9. 卸载了 TortoiseGit,问题太多

    电脑里面同一时候安装TortoiseGit 和 TortoiseSVN,使用tortoiseGIT来跟踪git项目,有一个非常无语的问题,git status显示都是clean的.可是目录图标却始终显 ...

  10. Codesys——常用快捷键列表

    F1——打开Help文档: F2——打开Input Assistant: F5——执行程序(Start): F9——添加或取消断点(Toggle Breakpoint): F8——单步进入(Step ...