Linux系统介绍中,介绍了shell的多个版本,现在的Linux发行版基本都默认使用bash(Bourne Again shell),兼容Bourne shell (sh),本文将简要介绍Bash编程语法。

变量

命名规则

  • 只能使用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

定义与使用变量

定义变量

your_name="abc"
echo $your_name

拼接字符串

your_name="world"
your_name2="hello,$your_name!"
echo $your_name2

数组

array_name=(value0 value1 value2 value3)
valuen=${array_name[n]} # 数组取值
array_name[0]=value0 # 赋值

数组实例:

my_array=(A B "C" D)
echo "第一个元素为: ${my_array[0]}"
my_array[1]=b
echo "数组的元素为:${my_array[*]}" # 打印所有元素
echo "数组的元素为:${my_array[@]}"

输出:

第一个元素为: A
数组的元素为:A b C D
数组的元素为:A b C D

只读变量

a="123"
readonly a

删除变量

unset variable_name #不能删除只读变量

不能删除只读变量

# b=10
# readonly b
# echo $b
10
# unset b
-bash: unset: b: cannot unset: readonly variable
#

环境变量

显示所有环境变量

env
# 或者
printenv

显示环境变量值

printenv LANG
# 或者
echo $LANG

控制语句

条件分支:if

if定义

if condition
then
command1
command2
...
commandN
fi

if和then写在同一行时,用分号分隔。

if [ 2==2 ]; then
echo "true";
else
echo "false";
fi

判断条件写法

# 写法一
test expression
# 写法二
[ expression ]
# 写法三
[[ expression ]]
if test 2==2; then echo "true"; fi
if [ 2>1 ]; then echo "true"; fi if [[ 2>1 ]]; then echo "true"; fi

实例

比较两个变量的大小

a=10
b=20
if [ $a -eq $b ]; then
echo"equal";
elif [ $a -lt $b ]; then
echo "small";
elif [ $a -gt $b ]; then
echo "big";
fi

循环:for

for定义

for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

实例

for和do写在同一行时,用分号分隔。

for Ioop in 1 2 3 4 5
do
echo "hello"
done for Ioop in 1 2 3 4 5;do
echo "hello"
done

循环读取文件内容并输出

for i in $(cat test.txt); do echo $i; done

循环: while

while定义

while condition
do
command
done

实例

int=1
while(( $int<=5))
do
echo $int
let "int++"
done

循环读取文件内容并输出

while read line; do echo $line; done<test.txt

输出:

test1
test222
test3
test4
test5

read命令

  • read命令是用于从终端或者文件中读取输入的内部命令
  • 读取整行输入
  • 每行末尾的换行符不被读入

read命令使用

从标准输入读取输入并赋值给变量

read var

从标准输入读取多个内容

read varl var2 var3

不指定变量(默认赋值给 REPLY)

read

实例

# read a
123
# echo $a
123
# read a b c
1 2 3
# echo $a   
1
# echo $b
2
# echo $c
3
#

默认变量

# read
456
# echo $REPLY
456
#

注释

# 注释
# 多行注释
:<<EOF
内容
.......
EOF

脚本参数传递

  • $0 脚本名称
  • $1~$n 获取第n个参数:
  • $# 传递到脚本的参数个数
  • $$ 脚本运行的当前进程ID号
  • $* 以一个单字符串显示所有向脚本传递的参数
  • $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

vim param.sh:

#!/bin/bash
echo "脚本名称:$0"
echo "脚本运行的当前进程ID号:$$"
echo "参数个数:$#"
echo "所有参数:$*"
echo "第1个参数:$1"
echo "第10个参数:${10}"
echo "return "$?

执行:

# chmod +x param.sh
# ./param.sh 1 2 3 4 5 6 7 8 9 10 1
脚本名称:./param2.sh
脚本运行的当前进程ID号:21097
参数个数:11
所有参数:1 2 3 4 5 6 7 8 9 10 1
第1个参数:1
第10个参数:10
return 0
#

基本运算

bash会把反引号里面当作一条命令来执行

In:

# echo `date +%y/%m/%d`
20/12/27
# echo `expr 2 + 2`
4
# a=10
# b=20
# echo expr $a + $b
30
# echo $(($a+$b))
30
# echo expr $a - $b
-10
# echo expr $a \* $b
200
# echo expr $b / $a
2
#
  • % 取余
  • = 赋值 a=$b 将把变量b的值赋给a
  • == 相等 相同则返回true
  • != 不相等 不相同则返回true
# a=10
# b=20
# echo `expr $b % $a`
0
# echo $[$a == $b]
0
# echo $[$a != $b]
1
#
  • -eq 检测相等
  • -ne 检测不相等
  • -gt 检测左边是否大于右边
  • -lt 检测左边是否小于右边
  • -ge 检测左边是否大于等于右边
  • -le 检测左边是否小于等于右边

# vim test.sh  
# cat test.sh
#!/bin/bash
a=10
b=20
if [ $a -lt $b ]
then
echo "equal"
fi
# chmod +x test.sh
# ./test.sh
equal
#

其它实例

内存统计

#!/bin/bash
# 内存使用百分比
free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/' # 统计内存
for i in `ps aux | awk '{print $6}' | grep -v 'RSS'`; do
count=$[$count+$i]
done
echo "$count/kb"
# ./test.sh
16%
474608/kb

求阶乘

vim test.sh

read -p "Enter a number:"
factorial=1
for (( count=1; count<=$REPLY; count++))
do
factorial=$[ $factorial * $count ]
done
echo "The factorial of $REPLY is $factorial"
# chmod +x test.sh
# ./test.sh
Enter a number:6
The factorial of 6 is 720

--THE END--

文章标题:Linux Bash编程

本文作者:hiyo

本文链接:https://www.cnblogs.com/hiyong/p/14238495.html

欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

Linux Bash编程的更多相关文章

  1. linux bash编程之算数运算和测试类型(第二篇)

    写在最前边:在bash中数据类型有两种,分别是数值型和字符型.其中字符型是默认的. 1.算数运算 · 运算符 · 语法 1.1.运算符:+.-.*./.%.** 注意:有些时候 *(乘号)需要转义 1 ...

  2. linux bash编程之函数和循环控制

    函数:实现独立功能的代码段 函数只有在调用时才会执行 语法一: function F_NAME{ 函数体 } 语法二: F_NAME() { 函数体 } 函数的返回值: 默认函数返回值:函数执行状态返 ...

  3. Linux中bash编程

    bash编程也叫shell编程 预定义变量         $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...

  4. linux脚本编程(shell)浅介 (转载)

    linux脚本(shell)编程 啊,昨天上网看到一篇讲 linux/unix shell 的文章,想想自己最后写这东西也是一年前的事了,想想都快忘光了. 还是整理一下,做一次回顾,以后说不定还用得上 ...

  5. Linux Shell编程基础

    在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐 ...

  6. Linux Bash Shell 快速入门

    BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     ...

  7. [linux]BASH 的基本语法

    最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     最简单的例子 -- ...

  8. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  9. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

随机推荐

  1. Vue2+Koa2+Typescript前后端框架教程--05Sequelize的使用(ORM)

    本篇开始分享Node.js后端服务开发中对于数据结构ORM的实现,主要使用的技术栈是:Sequelize. 上一篇文章中讲到班级管理的数据结构:ID,班级名称,班级编码,班主任ID,使用的数据库是My ...

  2. 如何将项目推到github上面

    1.先查看是否安装git. 2.如果没有安装git ,下载之后别忘了配置环境变量.(右击此电脑 --属性--高级系统设置--环境变量--系统变量中的path) 3.推代码 查看状态(可查可不查) gi ...

  3. redis 6.0新特性

    防止忘记,记录一下 1.多线程IO Redis 6引入多线程IO,但多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程.之所以这么设计是不想因为多线程而变得复杂,需要去控制 key. ...

  4. oracle 19C 静默安装(单机版)

    一.前期环境准备 1.硬件信息 (1)主机版本 [root@localhost ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server ...

  5. C语言的类型大小

    C语言的类型大小 设计程序的时候我们一般会考虑的尽量的周全,尤其是像C这样的静态类型语言. 有一些溢出的问题就源于没有搞清楚变量的大小范围,所以我们编写的时候需要特别注意 C的整形(整数类型)大小 C ...

  6. 【Flutter】可滚动组件之CustomScrollView

    前言 CustomScrollView是可以使用Sliver来自定义滚动模型(效果)的组件.它可以包含多种滚动模型,举个例子,假设有一个页面,顶部需要一个GridView,底部需要一个ListView ...

  7. LeetCode993. 二叉树的堂兄弟节点

    题目 1 class Solution { 2 public: 3 TreeNode* r1;TreeNode* r2; 4 bool isCousins(TreeNode* root, int x, ...

  8. django使用缓存之drf-extensions

    使用方法:1.直接添加装饰器@cache_response该装饰器装饰的方法有两个要求: 它必须是继承了rest_framework.views.APIView的类的方法 它必须返回rest_fram ...

  9. Ubuntu安装Vivado

    Step1 安装必要的库文件: sudo apt install libncurses5 build-essential openjdk-11-jdk Step2 进入vivado的安装文件夹 sud ...

  10. Centos7.4 小白式安装(初学)

    虚拟机安装Centos7.4系统 适用人群(初学者) 下载Centos7.4镜像 https://pan.baidu.com/s/1NtjfdHV3OWAvfDj5vrR7HQ  提取码:hzzw 虚 ...