• 脚本开头

    1
    #!/bin/bash

    脚本开头,符号#!用来告诉系统它后面的参数是用来执行该文件的程序。本例子中我们使用/bin/sh来执行程序。

  • 执行sh脚本

    当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 即赋予sh脚本权限

    1
    2
    #bash
    chmod +x filename

    或者

    1
    2
    #bash
    sudo chmod 777 filename
  • 执行脚本

    ./filename或者source filename

  • 输出信息到控制台

    1
    echo "hello sh"
  • 退出当前shell

    1
    2
    exit 1
    exit 0
  • 注释

    在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。

    1
    #print debug info

    多行注释

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    :<<EOF
    语句1
    语句2
    语句3
    语句4
    EOF
    ##也可以用其他符号,如下:
    :<<'
    注释内容...
    注释内容...
    注释内容...
    '

    :<<!
    注释内容...
    注释内容...
    注释内容...
    !

    但是貌似多行注释有一些问题,多行注释可以多行#来操作

    1
    2
    # Note: on windows/cygwin, ANDROID_BUILD_PATHS will contain spaces                     
    # due to "C:\Program Files" being in the path.
  • 特殊符号

    1
    2
    3
    4
    5
    #用来替换命令	
    $()
    ``
    #当前目录路径
    `pwd`
  • 变量

    shell中,所有的变量都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,您可以这样写:

    1
    2
    3
    4
    5
    6
    #变量名=值 注意变量名和等号之间不能有空格
    #命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
    #中间不能有空格,可以使用下划线(_)
    #不能使用标点符号
    #不能使用bash中的关键字
    your_test="test"

    除了显式地直接赋值,还可以用语句给变量赋值,如:

    1
    2
    3
    4
    #讲 /etc 下的目录文件名循环取出
    for file in `ls /etc`

    for file in $(ls /etc)

    使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

    1
    2
    3
    4
    #变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
    your_test="test"
    echo $your_test
    echo ${your_test}
    • 只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。改变了会报错

      1
      2
      3
      #!/bin/bash
      myUrl="http://www.google.com"
      readonly myUrl
    • 删除变量:使用 unset 命令可以删除变量。unset 命令不能删除只读变量。

      1
      unset variable_test
    • example:

      1
      2
      3
      4
      #!/bin/sh
      myUrl="https://skyxin888.github.io"
      unset myUrl
      echo $myUrl

      以上没有任何输出。

    • 变量类型

      • 局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
      • 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
      • shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
  • 字符串

    • shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      #单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
      #单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
      str='this is a string'

      #双引号里可以有变量
      #双引号里可以出现转义字符
      your_name='Golden'
      str="Hello, I know you are \"$your_name\"! \n"
      echo -e $str #输出结果为:Hello, I know you are "Golden"!
    • 拼接字符串

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      your_name="Golden"
      # 使用双引号拼接
      greeting="hello, "$your_name" !"
      greeting_1="hello, ${your_name} !"
      echo $greeting $greeting_1
      # 使用单引号拼接
      greeting_2='hello, '$your_name' !'
      greeting_3='hello, ${your_name} !'
      echo $greeting_2 $greeting_3

      #输出结果
      hello, Golden ! hello, Golden !
      hello, Golden ! hello, ${your_name} !
    • 获取字符串长度

      1
      2
      string="abcd"
      echo ${#string} #输出 4
    • 提取子字符串

      1
      2
      3
      #以下实例从字符串第 2 个字符开始截取 4 个字符
      string="Golden is a great site"
      echo ${string:1:4} # 输出 olde
    • 查找子字符串

      1
      2
      3
      #查找字符 i 或 o 的位置(哪个字母先出现就计算哪个)
      string="Golden is a great site"
      echo `expr index "${string}" io` # 输出 2
    • 字符串操作

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      # # 是去掉左边(在键盘上 # 在 $ 之左边)
      # % 是去掉右边(在键盘上 % 在 $ 之右边)
      # 单一符号是最小匹配;两个符号是最大匹配
      # *是用来匹配不要的字符,也就是想要去掉的那部分
      # 还有指定字符分隔号,与*配合,决定取哪部分
      file='/dir1/dir2/dir3/my.file.txt'
      echo ${file#*/} # 去除第一个/以及左边的字符串 , 输出dir1/dir2/dir3/my.file.txt

      echo ${file##*/}# 去除最后一个/以及左边的字符串,输出 my.file.txt

      echo ${file#*.} # 去除第一个.以及左边的字符串 ,输出file.txt

      echo ${file##*.}# 去除最后个.以及左边的字符串 ,输出txt

      echo ${file%/*} # 去除最后/以及右边的字符串,输出 /dir1/dir2/dir3

      echo ${file%%/*}# 去除第一个/以及右边的字符串,输出 空

      echo ${file%.*}# 去除最后.以及右边的字符串,输出 /dir1/dir2/dir3/my.file

      echo ${file%%.*}# 去除第一个。以及右边的字符串,输出/dir1/dir2/dir3/my

根据状态为变量赋值

  • unset 例子. unset a
  • 空字符串, null 例子. a=''
  • 非空,即不是unset,并且不是空字符串 例子: a=1 or a=b
  • 冒号情况:
1
2
3
4
5
6
7
8
9
10
11
#:=
var=${str:="default"}
#str 非空, var=$str; 否则var=default; str=default

#:-
var=${str:-"default"}
#str为unset或者空字符串,var=default,否则var=$str;
#这种一般是shell中设置默认值
#:+
var=${str:+"default"}
#str 非空,var=default,否则var和str都为空字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# = 号 测试代码
var=before
unset un_set
null_str=""
str="abc"

var=${un_set="default"};
echo 'var=${un_set="default"};' "var=$var" " un_set=${un_set}"
#输出 var=${un_set="default"};var=default un_set=default

var=${null_str="default"};
echo 'var=${null_str="default"};' "var=$var" " null_str=${null_str}"
#输出 var=${null_str="default"}; var= null_str=

var=${str="default"};
echo 'var=${str="default"};' "var=$var" " null_str=${null_str}"
#输出 var=${str="default"}; var=abc null_str=abc
####以上说明 = 在unset的情况下 会讲输入值赋值给前面的变量 var再取出变量的值

var=${un_set:="default"};
echo 'var=${un_set:="default"};' "var=$var" " un_set=${un_set}"
#输出 var=${un_set:="default"}; var=default unset=default

var=${null_str:="default"};
echo 'var=${null_str:="default"};' "var=$var" " null_str=${null_str}"
#输出 var=${null_str:="default"}; var=default null_str=default

var=${str:="default"};
echo 'var=${str:="default"};' "var=$var" " str=${str}"
#输出 var=${str:="default"}; var=abc str=abc
###以上说明 := 处理unset 和空字符串的状况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# - 号测试代码
var=before
unset un_set
null_str=
str=1

var=${un_set-"default"};
echo 'var=${un_set-"default"};' "var=$var" " un_set=${un_set}"
#输出 var=${un_set-"default"}; var=default unset=

var=${null_str-"default"};
echo 'var=${null_str-"default"};' "var=$var" " null_str=${null_str}"
#输出 var=${null_str-"default"}; var= null_str=

var=${str-"default"};
echo 'var=${str-"default"};' "var=$var" " str=${str}"
#输出 var=${str-"default"}; var=1 str=1
### 以上 只在unset 情况下 将输入的值 返回给var 不会有 unset null_str str 的赋值操作

var=${un_set:-"default"};
echo 'var=${un_set:-"default"};' "var=$var" " un_set=${un_set}"
#输出 var=${un_set:-"default"}; var=default un_set=

var=${null_str:-"default"};
echo 'var=${null_str:-"default"};' "var=$var" " null_str=${null_str}"
#输出 var=${null_str:-"default"}; var=default null_str=

var=${str:-"default"};
echo 'var=${str:-"default"};' "var=$var" " str=${str}"
#输出 var=${str:-"default"}; var=1 str=1
### 个人理解 - 是判断 str==unset (伪代码) true的情况 返回default
### :- 判断 str==unset || str=="" (伪代码) 返回default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# + 号测试代码
var=before
unset un_set
null_str=
str=1

var=${un_set+"default"};
echo 'var=${un_set+"default"};' "var=$var" " un_set=${un_set}"
#输出 var=${un_set+"default"}; var= un_set=

var=${null_str+"default"};
echo 'var=${null_str+"default"};' "var=$var" " null_str=${null_str}"
#输出 var=${null_str+"default"}; var=default null_str=

var=${str+"default"};
echo 'var=${str+"default"};' "var=$var" " str=${str}"
#输出 var=${str+"default"}; var=default str=1
### 个人理解 + 判断 str!= unset (伪代码)true 返回default

var=${un_set:+"default"};
echo 'var=${un_set:+"default"};' "var=$var" " un_set=${un_set}"
#输出 var=${un_set:+"default"}; var= unset=

var=${null_str:+"default"};
echo 'var=${null_str:+"default"};' "var=$var" " null_str=${null_str}"
#输出 var=${null_str:+"default"}; var= null_str=

var=${str:+"default"};
echo 'var=${str:+"default"};' "var=$var" " str=${str}"
#输出 var=${str:+"default"}; var=default str=1
#### :+ 判断 str!= unset && str!= "" (伪代码) true 返回default