[语言] Bash shell 用法及其总结笔记

写在前面

做Linux系统开发相关工作免不了与shell打交道,另外用好shell并不是熟知shell语法就可以了,还需要对相关的Linux命令非常熟,才能写出功能强大的shell脚本,本篇文章并不会详细地讲解shell的语法知识,但是会推荐一些有价值的资料,本文的主要目的是,记录shell关键的知识点、需要注意的坑点、一些常见场景下的shell脚本。

对shell的学习可以参考的资料如下(下面笔记大部分来自参考资料):

shell教程

Linux命令大全

Bash shell

shell严格意义上讲是用户与内核交互的工具,由系统调用实现,shell script是指用shell写的脚本程序,但是往往我们简单的说,把shell与shell script等同了,shell有很多种,Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)等等,但是最常用的是bin/bash

1)变量

  • 使用变量:${variable_name}
  • 只读变量:readonly varable_name
  • 删除变量:unset variable_name,unset不能删除只读变量

2)字符串
单引号与双引号的区别与PHP中相同,单引号不会对字符串内做解析和转义,而双引号会对字符串中的变量进行解析或者转义字符进行转义

  • 拼接字符串:${variable_name1}${variable_name2}
  • 获取字符串长度:${#varable_name}
  • 提取子字符串:expr index $string char_name

3)数组

  • 定义:arr_name=(val1 val2)
  • 使用:$arr_name[$index]
  • 获取数组所有元素:${arr_name[@]}
  • 获取数组长度:
length=${#arr_name[@]}
or:
length=${#arr_name[*]}
  • 获取数组某个元素长度:length=${#arr_name[$index]}

4)传递参数

用户可以通过命令向脚本传递参数,函数调用也可以向函数体内传递参数,两者是相同的。

$n表示脚本的第n个参数(n>=1),比如$1是第1个参数,而$0表示脚本的名字或者函数的名字,以下是几个特殊字符:

参数 说明
$# 传递到脚本参数个数
$* 以单字符串显示脚本传递的参数
$$ 脚本运行的当前进程ID
$! 后台运行的最后一个进程ID
$@ 与$*同
$? 显示最后命令退出状态,0表示success

5)流程控制
if:

if condition
then
...
fi

if-else:

if condition
then
...
else
...
fi

if else-if else:

if condition1
then
...
elif condition2
then
...
else
...
fi

for:

for var in val1 val2
do

done 

while:

while condition
do
...
done

case: 类似C语言中的switch case


casein
模式1)
...
;;
模式2)
...
;;
esac

6)函数
形式如下:

function func_name(...)
{
	...
	return $res
}

调用:

func_name $val1 $val2

7)条件测试

  • 数值测试:-eq等于,-ne不等于,-gt大于,-ge大于等于,-lt小于,-le小于等于
  • 字符串测试:=等于,!=不等于,-z $string字符串长度为0,-n $string字符串长度不为0
  • 文件测试:
参数 说明
-e $filename 文件存在
-r $filename 文件存在且可读
-w $filename 文件存在且可写
-x $filename 文件存在且可执行
-s $filename 文件存在且非空
-d $filename 文件存在且为目录
-f $filename 文件存在且为普通文件,i.e., regular files
-c $filename 文件存在且为字符设备文件
-b $filename 文件存在且为块设备文件

常见场景需求

1)当需要遍历命令参数数组时候,参数字符串有空格
这里参考了这篇博客

for ((i = 0; i < ${#ARGS[@]}; i++))
do
    echo "${ARGS[$i]}"
done

——————————

写在后面

对bash shell的一些命令或者细节用法记得不清楚没关系,用的时候查即可,写多了就熟练了,但是对基础的流程必须熟练。

你可能感兴趣的:(语言,Linux)