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脚本编程大全