Bash基本语法介绍(下)

Bash基本语法介绍(下)

0X00 前言

上次我们讲到了bash的数学运算,今天都是就把剩下的全搬出来。
都是些基本的东西,希望大家能多多支持
还是老规则,先把上篇给挂出来:
Bash基本语法介绍(上)

0X10 Bash语言之参数

我们知道,在运行一些C++或者java代码时,有些需要输入一些参数。

那么我们的Bash有没有参数的设置呢?

答案是:有

我们可以这样调用我们的脚本文件:

./variable.sh 参数1 参数2 参数3 …

那么问题是我们怎么在代码里面进行接受呢?

简单的出乎你的意料,哈哈

  • $# :包含参数的数目。
  • $0 :包含被运行的脚本的名称 (我们的示例中就是 variable.sh )。
  • $1:包含第一个参数。
  • $2:包含第二个参数。
  • $8 :包含第八个参数。

    以此类推。

来个例子:

#! /bin/bash
echo -e "There are $# students.\n"
echo "They are $1,$2 and $3."

在这里插入图片描述

0X20 Bash语言之数组

Bash也支持数组

我们可以声明以下数组

array=('value0' 'value1' 'value2')

要想访问其中的内容也是直接下标访问就好:

${array[2]}

但是需要注意:

和大多数编程语言一样,Shell 中的数组的下标(index)也基本是从 0 开始的,而不是从 1 开始。> 因此,第一个元素的编号(下标)就是 0,第二个元素的下标就是 1,以此类推。
不过,也不是所有 Shell 语言的数组下标都是从 0 开始,不少 Shell 语言(例如 Csh,Tcsh,Zsh,等等)的数组下标是从 1 开始的。

 也可以单独给数组的元素赋值,例如:
array[3]='value3'

举例举例:

#!/bin/bash

array=('value0' 'value1' 'value2')
array[5]='value5'
echo ${array[1]}

结果:
在这里插入图片描述
可以看到有一点与我们平时不太一样:
数组的元素编号不需要是连续的

我们可以直接跳过一些序号

也可以一次性显示数组中所有的元素值,需要用到通配符 *(星号)

#!/bin/bash

array=('value0' 'value1' 'value2')
array[5]='value5'
echo ${array[*]}

在这里插入图片描述

0X30 Bash语言之条件语句

好了好了,我们终于来到了条件语句了

话不多说,直接开说

1、if:最简单的条件

在Bash中,if语句的格式是这样的:

if [ 条件测试 ]
then

fi

以 if 的倒装 fi 作为结束,Bash果然特立独行

**注意!!!**

方括号 [] 中的 条件测试两边必须要空一格。不能写成 [test],而要写成 [ test ]

我们还有另外的一种写法:

if [ 条件测试 ] ; then

fi

来看一个例子:
#!/bin/bash
# condition.sh
name="Enming"

if [ $name = "Enming" ]
then
   echo "Hello $name !"
fi

在这里插入图片描述

从以上例子可以看出,我们的if条件还是比较容易理解的,但是也应该注意到:

在 Shell 语言中,“等于”是用一个等号( = )来表示的

2、if else:条件分支

if 和 else 两者配合的逻辑是这样的:

if [ 条件测试 ]
then
做这个
else
做那个
fi

还是直接来例子,比较容易理解:

#!/bin/bash

name1="Enming"
name2="Oscar"

if [ $name1 = $name2 ]
then
    echo "You two have the same name !"
else
    echo "You two have different names !"
fi

结果就不贴了,大家可以自己试一试

当然也有 elif 的使用

使用是这样的:

if [ 条件测试 1 ]
then
做事情 1
elif [ 条件测试 2 ]
then
做事情 2
elif [ 条件测试 3 ]
then
做事情 3
else
做其他事情
fi

这使用还是简单的,只要稍微有一点编程基础

3、case 条件选择

Bash也支持case选择
这个也不必多说,直接来个例子就什么就懂了

#!/bin/bash

case $1 in
    "Matthew")
        echo "Hello Matthew !"
        ;;
    "Mark")
        echo "Hello Mark !"
        ;;
    "Luke")
        echo "Hello Luke !"
        ;;
    "John")
        echo "Hello John !"
        ;;
    *)
        echo "Sorry, I do not know you."
        ;;
esac

结束也是 esac ,哈哈哈神奇
还有就是 可以看到;; 符号,其实相当于C语言的 break

0X40 Bash语言之循环语句

条件之后便是循环,学习一般语言的基本套路

1、while 循环

while 的循环判断逻辑是这样的:

while [ 条件测试 ]
do
做某些事
done

终于不是倒装结尾了!大概是 elihw 看起来太奇怪了2333

当然,依旧可以将 do 提上去

while [ 条件测试 ]; do
做某些事
done

来看一个例子:

#!/bin/bash

while [ -z $response ] || [ $response != 'yes' ]
do
    read -p 'Say yes : ' response
done

执行结果:
在这里插入图片描述
while 的判断条件是

  • response 是否为空 :-z $response
  • response 是否不等于 ‘yes’ :$response != 'yes'

关于bash中有哪些判断条件,我会进行整理,再最后放上链接,有兴趣的同学可以去看一看

2、until 循环

我们知道一般程序语言中,有循环 while ,就会有对应的 do…while

bash也少不了,但是关键词是——until

表示先执行语句,再进行判断

举例:

#!/bin/bash

until [ "$response" = 'yes' ]
do
    read -p 'Say yes : ' response
done

效果和前面是一样的

3、for 循环
说道循环,当然少不了 for 循环

bash的for循环和C,C++等有点不一样,但是和python倒是有点相似

基本逻辑如下:

for 变量 in ‘值1’ ‘值2’ ‘值3’ … ‘值n’
do
做某些事
done

来给个例子:

#!/bin/bash

for animal in 'dog' 'cat' 'pig'
do
    echo "Animal being analyzed : $animal" 
done

结果如下:
在这里插入图片描述
看到循环的遍历上面的变量

for 循环的取值列表不一定要在代码中定义好,我们也可以用一个变量,如下:

#!/bin/bash

listfile=`ls`

for file in $listfile
do
    echo "File found : $file" 
done

这里用到了反引号,上面的循环会打印出当前目录下的文件

或者是直接不用变量:

#!/bin/bash

for file in `ls`
do
    echo "File found : $file"
done

好了,现在又有人要问题,要是想像一般for循环一样,规定循环次数,怎么做呢?
好,请看下面:

#!/bin/bash

for i in `seq 1 10`
do
    echo $i
done

在这里插入图片描述
循环打印1到10

现在心满意足了吧

要是还不满足,再看

如果我要跳着循环,比如1 3 5这样有间隔的呢?
也是可以的!

#!/bin/bash

for i in `seq 1 2 10`
do
    echo $i
done

成,完美了

0X40 Bash语言之函数

终于,终于来到最后一部分——函数了。
相信大家也已经看累了,我也是码累了,最后一点,大家坚持!我们直接开门见山

1、函数的定义

Bash的函数定义为:

函数名 () {
函数体
}

或者:

function 函数名 {
函数体
}

需要注意:

函数名后面跟着的圆括号里不加任何参数,这和其他编程语言是很不一样的

我们还是需要例子来理解一下:

#!/bin/bash

print_something () {
    
    
    echo "Hello, I am a function"
}

print_something
print_something

在这里插入图片描述

2、参数传递

既然函数括号里面不能写参数,那么我们怎么样才能传递参数呢?

其实只要你能联想一下之前的参数传递,大概知道了

没错,函数的参数传递也是 $1$2$3

来个例子:

#!/bin/bash

print_something () {
    
    
    echo Hello $1
}

print_something Matthew
print_something Mark
print_something Luke
print_something John

结果如下:
在这里插入图片描述

看了这个大家应该就明白啦,和之前讲的一模一样嘛

3、返回值
Shell 的函数可以返回一个状态,有点类似一个程序或命令退出时会有一个退出状态,表明是否成功

Shell 函数要返回状态,也用 return 这个关键字

例子:

#!/bin/bash

print_something () {
    
    
    echo Hello $1
    return 1
}

print_something Luke
print_something John
echo Return value of previous function is $?
  • 第 5 行:返回的状态不一定要是被硬编码的(比如上例中的 1 ),也可以是一个变量。
  • 第 10 行:变量 $? 包含前一次被运行的命令或函数的返回状态。

在这里插入图片描述

如果你实在想要函数返回一个数值(比如说一个计算的值),那么你也可以用命令的执行结果。

如下:

#!/bin/bash

lines_in_file () {
    
    
    cat $1 | wc -l
}

line_num=$(lines_in_file $1)

echo The file $1 has $line_num lines

假设这里有一个 test_file文件,可以统计其中的行数并且返回
在这里插入图片描述

0X50 后言

好啦,好啦,终于码完了!
只是一些基础的东西,没想到水了这么多。
当然我也是参照 Oscar 大佬的专栏,真的写的很好!等一下给出链接,大家可以去看看~

后面还给出了 shell常用的条件测试指令与参数 ,有兴趣的同学可以去看看~

那么,大家再见啦~

相关:
Bash基本语法介绍(上)
shell常用的条件测试指令与参数
————————————————————————————————————————————————————
参考:Linux命令行与Shell脚本编程大全

猜你喜欢

转载自blog.csdn.net/rjszz1314/article/details/104481628