输入输出
echo
表示打印字符串;read
表示获取用户输入;$
用于引用变量。
# test1.sh bash中用#进行单行注释
echo "input your name:"
read user_name
echo "hello $user_name"
其运行结果为
$ bash test1.sh
input your name: #为echo打印
laser #为用户输入
hello laser
赋值和计算
bash
中的运算符并没有什么特殊的,
运算符 | 说明 |
---|---|
+ ,- ,× ,/ ,%
|
加减乘除,求余;支持+= 形式 |
** , && , ||
|
乘方、关系与、或 |
但是,与常见编程语言不同的是,bash
中的赋值和数学计算需要在(())
中进行。且在双括号内,不必使用$
来引用变量。但在双括号外,在将数值赋给变量时需要使用$
$ ((a=5+3))
$ b = $((a+3)) #双括号内是数值,需要用$
#一般在C语言中合法的表达式均可用于双括号内
$ echo $((a>b ? a:b))
11
条件判断
bash
中,条件判断通过[[]]
来实现。例如
$ [[ 3 -eq 5 ]] #3是否等于5
$ echo $? #$? 表示上次计算的结果
1 #在bash中,0表示真,其他表示假
需要注意,在bash中,0
表示真。其支持的条件判断运算符如下
整数比较 | -eq | -ne | -gt | -lt | -ge | -le |
---|---|---|---|---|---|---|
true 条件 |
相等 | 不等 | 左>右 | 左<右 | 左>=右 | 左<=右 |
字符串比较 | > | < | == | !=, <> | =~ |
---|---|---|---|---|---|
true 条件 |
左>右 | 左<右 | 相等 | 不等 | 左匹配右(正则表达式) |
其中,字符串比较的是字典顺序。
文件比较 | -nt | -ot | -ef |
---|---|---|---|
true 条件 |
左比右新 | 左比右旧 | 左右相同 |
true 条件2 |
左存在,右不存在 | 左不存在,右存在 |
此外,bash还支持文件属性的判断,就操作系统而言,这是必须的。但就编程语言而言,这种针对文件交互的功能属于进阶内容,故而放在后面。
现在关键是学会条件判断的控制结构,bash
和其他语言一样,采用了if
作为关键字,同时采用fi
作为条件结构结束的关键字。距离如下
$ ((a=15))
$ ((b=20))
$ if [[ a -le b ]]; then
> echo $a #如果a<b则打印a
> else
> echo $b #否则打印b
> fi
15
除了使用[[]]
之外,还可通过test
或者[]
,但适用范围有限,初学者只需掌握[[]]
。
函数
在编程语言中,函数的重要性是不言而喻的。在bash
中,创建函数也十分简单,基本格式为
func(){
# 传入参数用$1...$9表示
return ... #如果无返回值则不用return
}
其中func
可换成函数的名称。在bash
中,提供了一些有关函数的内置$
参量,$1
~$9
可表示传入的参数,当参数位置大于10的时候,需写成类似${10}
的形式。
由于已经讲解了判断表达式,故而下面就可以实现一个递归的阶乘函数了
#!/bin/bash
fac(){
x=$1
if [[ ${x} -eq 1 ]];then
echo "1"
else
echo "$[$x * $(fac $[$x-1])]"
fi
}
res=$(fac $1)
echo "$1的阶乘是:${res}"
$
表达式还有如下用法
$# | 参数个数 |
$* | 显示所有参数 |
$@ | 显示所有参数,但使用时加引号,并在引号中返回每个参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 最后命令的退出状态,0表示无错误。 |
for 循环
在bash中,除了if else
之外,还有case
可用于条件选择。但对初学者而言,不必贪多,故而将学习case
的优先级下调。
循环也是一样,尽管支持for、while、until等结构,但暂且放在后面,在此只需讲解最易理解的C语言风格的for循环。
其完整的结构是for do done
for ((i = 0 ; i <= 1000 ; i++)); do
echo "Counter: $i"
done
其中,(())
也可以理解为此前提到过的赋值与数学计算。而且不出意外地,bash
中也同样支持continue
和break
,前者可跳过当前的循环,后者可跳出循环。
在bash
中,其他循环结构同样是用do...done
来规定循环区域。且当do
和for
等关键字在同一行时,需要用;
隔开,如果另起一行,则不必写分号。
数组及其遍历
在bash
中,圆括号除了可以用于创建局部的shell,还可以用于构建数组。
$ arr=(A B "C" D)
$ echo $arr
A
$ echo ${arr[1]}
B
$ echo ${arr[*]} #获取全部数组元素
A B C D
通过for…in语句,可以遍历数组,但需要注意,数组在被遍历时要通过@所以。
$ for var in "${arr[@]}"
> do
> echo $var
> done
A
B
C
D
此外,for循环还有更加便捷的遍历方案
$ for i in 1 2 3 4 5
> do
> echo $i
> done
1
2
3
4
5
其他控制语句
while
和until
在语法规则上是完全相同的,而在语义上则是完全相反的。前者执行到条件为false
为止,后者则执行到条件为true
为止。
a=0
# 下面的例子将打印从0到10的自然数
until [[ $a -gt 10 ]]
do
echo $a
a=$((a+1))
done
最后,bash还提供了多选语句,case…esac,其应用逻辑与switch case相同,具体示例如下
echo 'input a number:'
read num
case $num in
1) echo 'you input 1'
;;
2) echo 'you input 2'
;;
*) echo 'you input others'
;;
esac
其中,1), 2)表示出现的情况,;;
相当于break
,用以跳出case
。文章来源:https://www.toymoban.com/news/detail-735937.html
至此便掌握了bash
作为一门语言的基本语法。文章来源地址https://www.toymoban.com/news/detail-735937.html
到了这里,关于Linux中阶教程:bash shell基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!