文章目录
  1. 1. Shell简介
    1. 1.1. Shell中的变量
    2. 1.2. shell脚本
      1. 1.2.1. 定义变量
      2. 1.2.2. 变量的引用
    3. 1.3. SHell环境进阶
  2. 2. shell脚本编写

次世代飞行器


2016-05-03,周二(假期)

晴转雨

教材《Linux Shell命令行及脚本编程实例详解》


Shell简介

shell是Linux的外壳,是Linux的用户界面,可以为用户提供输入命令和参数,并可以得到命令执行结果的环境。用户、shell和操作系统之间的关系.
shell与linux关系图

Shell在Linux环境中扮演了非常重要的角色,包括读取命令行、解释它的含义并执行、通过输出返回执行结果等等。

Linux环境由以下几部分构成

  1. 内核———Linux操作系统的核心
  2. Shell——为用户和内核提供一个交互的接口
  3. 终端模拟器——它允许用户输入命令并在屏幕上回显命令的运行结果
  4. Linux桌面和窗口管理器——Linux桌面是各种软件应用程序的集合。它包括文件管理器、窗口管理器、终端模拟器等。

Bash简介

Bash是一种与Bourne Shell兼容的、执行从标准输入设备或文件读取的命令语言解释器。Bash是Bourne-Again Shell的缩写

Linux最常用的shell有Bourne Shell(sh)、C Shell(csh)、Korn Shell(ksh)

  • 查看系统可以用的shell
    1
    root@ubuntu:~# cat /etc/shells
  • 查看root用户默认使用哪种shell

    1
    root@ubuntu:~# grep root /etc/passwd
  • 查看当前用户使用的shell类型

    1
    root@ubuntu:~# echo $SHELL

或者

1
root@ubuntu:~# ps -p $$


shell常见快捷键

按键 说明
CTRL + W 删除光标为之前单词
CTRL + U 清空行
CTRL + r 搜索先前使用的命令
CTRL + C 终止当前的命令
CTRL + Dexit、logout 退出当前登入
ESC + T 调换光标前的2个单词

Shell中的变量

常用系统变量

系统变量 含义
BASH_VERSION 保存Bash实例的版本
DISPLAY 设置X display名字
EDITOR 设置默认的文本编辑器
HISTFILE 保存命令历史的文件名
HISTFILESIZE 命令历史文件所能包含的最大行数
HISTSIZE 记录命令历史中的命令数
IFS 定义Shell的内部字段分隔符,一般是空格符、制表符和换行符
PATH 搜索命令的路径。Linux下的标准命令之所以能在Shell命令下任何路径直接诶使用,就是因为标准命令所在目录的路径定义在PATH变量中。
PS1 你的提示符设定
SHELL 设置登入Shell的路径
TERM 设置你的登入终端类型

shell脚本

shell脚本就是将许多指令集汇整在一起,让用户更容易就能操作执行多个命令,主要方便管理员进行设置或管理使用。

shell提供数组、循环、条件以及逻辑覆盖判断等重要功能,让使用者可以直接以shell来写程序。

定义变量

  • Shell默认是字符串赋值,比如:
    1
    2
    3
    4
    $ let var=1
    $ var=$var+1
    $ echo $var
    1+1

如果要将算术表达式的数值给一个变量则应该使用let例如

1
2
3
4
5
# var=1
# var2=2
# let var=$var1+$var2
# echo $var
3

  • 将Linux命令赋值给变量

    1
    2
    3
    4
    5
    6
    7
    # var=`pwd`
    # echo $var
    /root
    或者也可以使用$(...)来实现同样的功能,该方法可以避免歧义:
    # var=$(pwd)
    # echo $var
    /root
  • echo输出的时候要注意歧义,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    # LOGDIR="/var/log"
    # echo "The log file is $LOGDIRmessages"
    //其输出结果是
    The log file is
    //bash将会查找一个叫LOGDIRmessages的变量,而不是$LOGDIR
    //避免歧义应该:
    $ echo "The log file is ${LOGDIR}messages"
    The log file is /var/log/messages

变量的引用

应用一个变量最好是用双引号将变量名括起来。例如:”$variable”

这样可以防止被引用的变量特殊字符(除$,’和)被解释为其他错误含义

使用双引号可以放置变量中由多个单词组成的字符串分离。

1
2
3
4
5
6
7
8
9
root@ubuntu:~# LIST="one two three 四"
root@ubuntu:~# for var in $LIST #将变量LIST的值分成若干个参数传递给for循环
> do
> echo "$var"
> done
one
two
three

1
2
3
4
5
6
root@ubuntu:~# for var in "$LIST"   #将LIST的值作为一个整体传入for循环
> do
> echo "$var"
> done
one two three 四
root@ubuntu:~#

多个变量实例:

1
2
3
root@ubuntu:~# var1="一 二 三 四 五 六 七"
root@ubuntu:~# echo This is $var1
This is 一 二 三 四 五 六 七

用echo输出一些奇怪变量:

输出变量:带双引号/不带双引号的区别

1
2
3
root@ubuntu:~# var="'(]\\{}\$\'"
root@ubuntu:~# echo $var
'(]\{}$\'

1
2
root@ubuntu:~# echo "$var"
'(]\{}$\'

这里输出变量带不带双引号均无区别

1
2
3
root@ubuntu:~# IFS='\'
root@ubuntu:~# echo $var
'(] {}$ '
1
2
3
4

root@ubuntu:~# var="'(]'\''\'{}'\'$'\'"
root@ubuntu:~# echo $var
'(]' '' '{}' '$' '

export

export命令可以用于传递一个或多个变量的值到任何后继脚本

  • 创建

    1
    export  [-fnp]   [变量或函数名称]=[变量设置值]
  • 删除

1
unset  [-fv]   [变量函数名称]
  • 检查变量是否存在
1
2
3
4
5
6
root@ubuntu:~# echo ${whatever:? ERROR: The variable is not defined}
-su: whatever: ERROR: The variable is not defined
root@ubuntu:~# whatever=sdflksjdf
root@ubuntu:~# echo ${whatever:? ERROR: The variable is not defined}
sdflksjdf
root@ubuntu:~

SHell环境进阶

!!重复上次执行过的命令

1
2
3
4
5
6
root@ubuntu:~# uptime
19:31:41 up 17 min, 1 user, load average: 0.03, 0.03, 0.05
root@ubuntu:~# !!
uptime
19:31:44 up 17 min, 1 user, load average: 0.03, 0.03, 0.05
root@ubuntu:~#

!COMMAND回调最近一次执行的以指定字符开头的命令

1
2
3
root@ubuntu:/home/takethat/scripts# !up
uptime
19:48:54 up 34 min, 1 user, load average: 0.00, 0.01, 0.05

使用history列出列表的行号来重新调用历史命令

1
2
3
4
5
6
7
8
9
 2030  ls
2031 cd ..
2032 ls
2033 history
root@ubuntu:/home/takethat# !2032
ls
1 arm code Documents end2 Installer one scripts shell temp test1 UDP-test
1.txt bash core Downloads gdb-simple Music Pictures server shell2 Templates two userdata
algorithm C Desktop end githublocal ncre2 Public server.c socket test UDP Videos

shell脚本编写

  1. shell脚本传参数
文章目录
  1. 1. Shell简介
    1. 1.1. Shell中的变量
    2. 1.2. shell脚本
      1. 1.2.1. 定义变量
      2. 1.2.2. 变量的引用
    3. 1.3. SHell环境进阶
  2. 2. shell脚本编写