bash学习

学习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
2
3
4
5
6
#!/bin/bash
echo "Argument one is $1"
echo "Argument two is $2"
echo "Argument three is $3"
# excute
./arguments.sh dog cat bird

也可以很方便的用 $@ 来引用所有的外部参数.

$0表示脚本文件名,一个用处就是在执行完脚本之后,可以用$0获取脚本名,然后做自删除.

1
2
3
4
#!/bin/bash
echo "The name of the file is: $0 and it is going to be self-
deleted."
rm -f $0

数组

语法:my_array=("value 1" "value 2" "value 3" "value 4") 元素之间用空格隔开

数组引用类似C, echo ${my_array[1]} 元素起始下标为0

数组长度获取

1
2
list=(1 2 3 4)
echo ${#list[@]} #输出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
2
3
4
5
if [[ some_test ]]
then
<commands>
else <commands>
fi

swith 语句

1
2
3
4
5
6
7
8
9
10
11
case $some_variable in
pattern_1)
commands
;;
pattern_2| pattern_3)
commands
;;
*)
default commands
;;
esac

注意点

  1. case 语句用关键字case开始,引用变量,然后加关键字in
  2. 匹配模式用) 结束
  3. All clauses have to be terminated by adding ;; at the end
  4. 默认模式用*匹配
  5. case 语句结束用esac关键字

循环

while

1
2
3
4
while [ your_condition ]
do
your_conditions
done

条件表达式都用[] 或者[[]]括起来, 区别

until

含义是当条件不为真时候一直运行

1
2
3
4
until [ your_condition ]
do
your_commands
done