最近把Linux Bash编程的知识复习了一遍,大概梳理了一下,做个记录。
第一个Bash-Script
LINUX shell的种类非常之多,但是目前用得最为广泛的还是Bash,本文也是基于Bash的Shell环境。
下面是一个简单的示例:
1 |
|
这就是一个最简单的shell脚本了。
第一行的#!
用来告诉系统,这个脚本用什么解释器来执行(说明:sh和bash本身是不同的Shell,但是在我目前用得CentOS7版本sh和bash是等价的,sh是一个指向bash的符号链接)。echo
命令输出文本到屏幕
如何运行脚本
一种方式就是将脚本作为解释器的参数,如:
1 | sh test.sh |
第二种方式就是授予文件可执行权限
1 | chmod +x test.sh |
变量与参数
变量
Bash是一种弱类型的语言,你只需要直接定义变量名=value
即可。当需要引用这个变量的时候使用$var_name
或者${var_name}
即可。$var_name
是${var_name}
的一种简写形式,但是在某些情况下只能使用${var_name}
,例如:
1 | # 当需要连接两个变量 |
所以建议在写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 |
|
数组
目前只支持一维数组!!!!!!!!!!
可以通过以下两种方式来为数组赋值:
1 |
|
通过${my_array[idx]}
来读取数组中的值,也可以通过${my_array[*]}
或${my_array[@]}
来一次性读取数组中的所有元素。通过`$