0%

Bash-Script的复习与梳理

最近把Linux Bash编程的知识复习了一遍,大概梳理了一下,做个记录。

第一个Bash-Script

LINUX shell的种类非常之多,但是目前用得最为广泛的还是Bash,本文也是基于Bash的Shell环境。
下面是一个简单的示例:

1
2
3
#! /bin/sh

echo 'hello world!'

这就是一个最简单的shell脚本了。
第一行的#!用来告诉系统,这个脚本用什么解释器来执行(说明:sh和bash本身是不同的Shell,但是在我目前用得CentOS7版本sh和bash是等价的,sh是一个指向bash的符号链接)。
echo命令输出文本到屏幕

如何运行脚本

一种方式就是将脚本作为解释器的参数,如:

1
sh test.sh

第二种方式就是授予文件可执行权限

1
2
3
4
5
6
chmod +x test.sh
或者
chmod 755 test.sh

执行脚本
./test.sh

变量与参数

变量

Bash是一种弱类型的语言,你只需要直接定义变量名=value即可。当需要引用这个变量的时候使用$var_name或者${var_name}即可。
$var_name${var_name}的一种简写形式,但是在某些情况下只能使用${var_name},例如:

1
2
3
4
5
# 当需要连接两个变量
your_id=${USER}-on-${HOSTNAME}

# 或者会与其他字符串写在一起的时候
echo '${num}instance running!'

所以建议在写shell的时候统一使用${var_name}的风格。
bash中变量是弱类型的,那么不管你传给他的是字符串、数字或者数组他都统统会接收,有时候这就会导致一些问题,比如你想做个计算器,这时候传给了变量一个’ABCDEFG’,那么这时候我们就想这个变量只能接收数字。又或者你想定义一个常量,不想用户修改。那么以上这些我们可以使用declare来声明变量的一些属性。
declare常用参数如下:

-r 定义一个只读变量,也可以使用”readonly var_name”将变量定义为只读变量
-i 定义变量类型为整型
-a 定义变量类型为数组
-f 定义一个函数
-x 定义一个全局变量

当想删除一个变量的时候直接使用unset var_name即可,注意这个命令不能删除只读变量。

参数

那么如何向一个脚本传递参数呢?
当我们想向一个脚本传递参数的时候,直接在执行脚本的命令后面跟参数即可:

1
sh ./test.sh parm1 parm2 parm3

在脚本中使用$n(n是一个数字,如:$1获取第一个参数)来接收传入的参数即可。下面是可能经常用到的参数变量:

$0 当前脚本的文件名。
$n 传递给脚本或函数的参数。n是一个数字。例如,第一个参数是 $1 。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号 (“ “)包含时与$*不同。
$? 上个命令的退出状态,或函数的返回值。
$_ 上一个命令的最后一个参数

我们经常用到的Linux命令中有一种叫option的东西,基本模式-optionname或者--longoptionname。如果在我们编写脚本的时候需要option的话,简单的脚本直接把他当普通参数手工处理即可,面对比较复杂的可以使用getopt或者getopt
这里感觉有必要提一下set这个命令,我觉得很牛逼、很厉害、很有用但是我从来没在脚本中使用过的命令。
set命令用来改变内部脚本的变量或者选项。一种应用就是来改变options来影响脚本的行为。另一种应用就是利用set `commond` 的输出来重置位置参数。

Example
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
#!/bin/bash

echo "Command-line argument #1 = $1"
echo "Command-line argument #2 = $2"
echo "Command-line argument #3 = $3"


echo "--------------------------------------"
echo "利用`uname -a`的输出来重置位置参数"
set `uname -a`

echo "Field #1 of 'uname -a' = $1"
echo "Field #2 of 'uname -a' = $2"
echo "Field #3 of 'uname -a' = $3"

exit 0



output:
[root@localhost study]# sh test_set.sh one two three
Command-line argument #1 = one
Command-line argument #2 = two
Command-line argument #3 = three
--------------------------------------
Sets the positional parameters to the output of the commond `uname -a`
Field #1 of 'uname -a' = Linux
Field #2 of 'uname -a' = localhost.localdomain
Field #3 of 'uname -a' = 3.10.0-514.el7.x86_64

数组

目前只支持一维数组!!!!!!!!!!
可以通过以下两种方式来为数组赋值:

1
2
3
4
5
6
#!/bin/bash

my_array=(A B C "D")

my_array[4]=F
my_array[5]="G"

通过${my_array[idx]}来读取数组中的值,也可以通过${my_array[*]}${my_array[@]}来一次性读取数组中的所有元素。通过`$