Shell编程笔记

基本介绍

shell分为shell控制台中使用的语句和shell脚本语法。

shell脚本编程本身语法和使用并不复杂,记不清楚也可以随时google,关键是熟练使用shell命令,只有熟练使用shell命令,组合出来的shell脚本才会更有效强大。。

  • shell第一行要加

    1
    #!/bin/bash

    不加会调默认的解析器。

  • chmod +x ./test.sh

    • 添加权限
  • shell命令有两种之分

    • 一种是内建命令,不需要bash也能执行的,例如cd
    • 另一种需要bash去查找的应用程序,如ls
  • bash的配置文件

    • 用户家目录下的.bashrc
    • 使之生效
      • source .bashrc
      • . .bashrc
  • 如果将命令行下输入的命令用()括号括起来,那么也会fork出一个子Shell执行小括号中的命令,一行中可以输入由分号;隔开的多个命令,比如:

    $ (cd ..;ls -l)

    和上面两种方法执行Shell脚本的效果是相同的,cd ..命令改变的是子Shell的PWD,而不会影响到交互式Shell。然而命令

    $ cd ..;ls -l

    则有不同的效果,cd ..命令是直接在交互式Shell下执行的,改变交互式Shell的PWD,然而这种方式相当于这样执行Shell脚本:

    $ source ./test.sh

    或者

    $ . ./test.sh

    source或者.命令是Shell的内建命令,这种方式也不会创建子Shell,而是直接在交互式Shell下逐行执行脚本中的命令。

  • alias

    • 命令取别名
    • alias pg='ps aux | grep'

基本语法

变量

学习一门语言最重要的是先掌握其 数据类型和变量

  • shell里就一种数据类型

    • string
  • 两种变量

    • 环境变量
      • 定义:export VAR=hello
      • 取变量:$VAR
    • 本地变量
      • 定义:VAR=hello
      • 取变量:$VAR
    • unset 可以将变量删除

    通配符

    • ​ * 匹配0个或多个任意字符

      ​ ? 匹配一个任意字符

      ​ [若干字符] 匹配方括号中任意一个字符的一次出现

    • 正则表达式

命令代换

  • 由“`”反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。例如定义一个变量存放date命令的输出:

    1
    2
    3
    $ DATE=`date`
    $ echo $DATE

    命令代换也可以用$()表示:

    1
    $ DATE=$(date)

算术代换

使用$(()),用于算术计算,(())中的Shell变量取值将转换成整数,同样含义的$[ ]等价例如:

1
2
3
4
5
6
7
8
9
$ VAR=45
$ echo $(($VAR+3)) 等价于 echo $[VAR+3]或 $[$VAR+3]
$(())中只能用+-*/和()运算符,并且只能做整数运算。
$[base#n],其中base表示进制,n按照base进制解释,后面再有运算数,按十进制解释。
echo $[2#10+11] #表示2进制的10和十进制的11相加

转义字符

和C语言类似,\在Shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值。例如:

1
2
3
4
5
6
$ echo $SHELL
/bin/bash
$ echo \$SHELL
$SHELL
$ echo \\
\

shell 脚本语法

  • 把一个变量当命令操作加上$()

    • 直接取值不加()
    • 例:
    • $(ls):执行命令
    • $ls:取ls命名的变量名称
  • 命令test或 [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与C语言的逻辑表示正好相反)。例如测试两个数的大小关系:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ubuntu:~$ var=2
    ubuntu:~$ test $var -gt 1
    ubuntu:~$ echo $?
    0
    ubuntu:~$ test $var -gt 3
    ubuntu:~$ echo $?
    1
    ubuntu:~$ [ $var -gt 3 ]
    ubuntu:~$ echo $?
    1

    虽然看起来很奇怪,但左方括号 [ 确实是一个命令的名字,传给命令的各参数之间应该用空格隔开,比如:$VAR、-gt、3、] 是 [ 命令的四个参数,它们之间必须用空格隔开。命令test或 [ 的参数形式是相同的,只不过test命令不需要 ] 参数。以 [ 命令为例,常见的测试命令如下表所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [ -d DIR ] 如果DIR存在并且是一个目录则为真
    [ -f FILE ] 如果FILE存在且是一个普通文件则为真
    [ -z STRING ] 如果STRING的长度为零则为真
    [ -n STRING ] 如果STRING的长度非零则为真
    [ STRING1 = STRING2 ] 如果两个字符串相同则为真
    [ STRING1 != STRING2 ] 如果字符串不相同则为真
    [ ARG1 OP ARG2 ] ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)之中的一个

    和C语言类似,测试条件之间还可以做与、或、非逻辑运算:

    1
    2
    3
    4
    5
    [ ! EXPR ] EXPR可以是上表中的任意一种测试条件,!表示“逻辑反(非)”
    [ EXPR1 -a EXPR2 ] EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示“逻辑与”
    [ EXPR1 -o EXPR2 ] EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示“逻辑或”

    例如:

    1
    2
    3
    4
    $ VAR=abc
    $ [ -d Desktop -a $VAR = 'abc' ]
    $ echo $?
    0

    注意,如果上例中的$VAR变量事先没有定义,则被Shell展开为空字符串,会造成测试条件的语法错误(展开为[ -d Desktop -a = ‘abc’ ]),作为一种好的Shell编程习惯,应该总是把变量取值放在双引号之中(展开为[ -d Desktop -a “” = ‘abc’ ]):

    1
    2
    3
    4
    5
    6
    7
    $ unset VAR
    $ [ -d Desktop -a $VAR = 'abc' ]
    bash: [: too many arguments
    $ [ -d Desktop -a "$VAR" = 'abc' ]
    $ echo $?
    1

分支

在Shell中用if、then、elif、else、fi这几条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell命令组成的,例如

1
2
3
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

当then换行时,可以不加;号:

1
2
3
4
if [ -f ~/.bashrc ]
then
. ~/.bashrc
fi

本文标题:Shell编程笔记

文章作者:Yang Shuai

发布时间:2019年06月03日 - 13:06

最后更新:2019年06月03日 - 16:06

原始链接:https://ysbbswork.github.io/2019/06/03/Shell编程笔记/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!