学习bash
introduction-to-bash-scripting的学习笔记 配合 线上bash解释器
bash 脚本开头一行 都有 #!/bin/bash
指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径, python脚本在开头也有类似的语句, #!/bin/python2
or #!/bin/python3
创建完一个bash脚本之后,需要通过chmod +x XXX.sh
赋予bash脚本执行权限, 文件的权限可以通过ls -l
查看详细, 用户组,其他,用户都具有自己对文件的权限。
bash 脚本执行可以 通过./XXX.sh
也可以直接指明bash xxx.sh
其中前者指定了sh 文件的路径,参考
变量
bash 变量不需要指定类型,直接赋值,解释器动态解释。
变量定义:
name="DevDojo"
note: 赋值号左右不能又空格,如果平时编码习惯和这个不一样,需要注意下。
变量使用
echo ${name}
括号增加可读性。同时变量也可以在表达式中使用,语法与直接使用一样。
bash 语句不像c++需要显式;
表示语句结束
用户输入
从命令行读取用户输入
read variable
外部参数
bash 脚本在运行时候,可以跟可变多的参数,在脚本内部用$1, $2来指代,如下面例子
1 |
|
也可以很方便的用 $@
来引用所有的外部参数.
$0表示脚本文件名,一个用处就是在执行完脚本之后,可以用$0获取脚本名,然后做自删除.
1 |
|
数组
语法:my_array=("value 1" "value 2" "value 3" "value 4")
元素之间用空格隔开
数组引用类似C, echo ${my_array[1]}
元素起始下标为0
数组长度获取
1 | list=(1 2 3 4) |
条件表达式
- 算数表达 语法类似, 用英文字母的缩写来表示比较属性, eg. lt(less than) ,eq(equal) …..
- [[ ${arg1} -eq ${arg2} ]] equal 如果两个变量相同返回true
- 字符串
- [[ -v ${varname} ]] 变量如果被赋值返回true
- [[ -z ${string} ]] 字符串长度为0 为true
- [[ -n ${string} ]] 字符串长度不为0
- 文件表达式 在linux 下面一切都是文件,文件具有不同的类型 比如块文件,字符设备,目录等
- [[ -d ${file} ]] 是否为目录
- [[ -x ${file} ]] 文件是否可执行
- [[ -L ${file} ]] 文件是否为符号链接
有了条件表达式,自然引出了条件语句
条件语句
if-else
1 | if [[ some_test ]] |
swith 语句
1 | case $some_variable in |
注意点
- case 语句用关键字case开始,引用变量,然后加关键字in
- 匹配模式用) 结束
- All clauses have to be terminated by adding ;; at the end
- 默认模式用*匹配
- case 语句结束用esac关键字
循环
while
1 | while [ your_condition ] |
条件表达式都用[] 或者[[]]括起来, 区别
until
含义是当条件不为真时候一直运行
1 | until [ your_condition ] |