网站首页 文章专栏 shell基本语法
shell基本语法
创建于:2020-10-22 15:47:40 更新于:2024-03-19 05:38:54 羽瀚尘 1726
未分类 shell,语法

所有的脚本都要在文件开头加上这样一句话,表明使用bash来解释处理。

#!/bin/bash

变量

使用变量时,只需用美元符号$+变量名。

环境变量

环境变量是操作系统预设的值。

echo  "Home path is $HOME"

输出

Home path is /home/wenfeng

用户变量

用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个,区分大小写。
注意定义变量时等号前后不可以有空格。

var="hello world"
echo "My var is $var"

输出

My var is hello world

命令替换

脚本可以像使用子函数那样调用命令,然后使用命令返回的结果。有两种形式,分别是$()和`反引号```。

mydate=$(date)
echo "My date is $mydate"
echo "My date2 is `date`"

输出

My date is 2020年 09月 28日 星期一 20:43:15 CST
My date2 is 2020年 09月 28日 星期一 20:43:15 CST

常量

目前没发现shell的常量。

逻辑运算

存在逻辑运算的地方,都需要使用双圆括号(( expression ))或者美元符中括号$[ expression ]。可用的逻辑运算如下:

逻辑求反
- 位求反
& 按位与
按位或
&& 逻辑与
逻辑或
((var=1 || 0))
var2=$[ 1 && 0]
echo $var
echo $var2

输出

1
0

使用美元符中括号似乎更符合一般编程语言。

算术运算

简单计算

使用双圆括号(( expression ))或者美元符中括号$[ expression ]

var1=8
((var2=$var1 + 8))
var3=$[var1 + 9]
echo $var2
echo $var3

输出

16
17

复杂计算

使用bash计算器,本质就是借用bc计算,所以使用到了命令替换。其中,scale=4是指定保留四位小数。

var1=100
var2=45
var3=$(echo "scale=4; $var1 / $var2" | bc)
echo The answer for this is $var3

输出

The answer for this is 2.2222

todo: bc所有支持的算术运算

流程控制

数字比较

n1 -eq n2 检查n1是否与n2相等
n1 -ge n2 检查n1是否大于或等于n2
n1 -gt n2 检查n1是否大于n2
n1 -le n2 检查n1是否小于或等于n2
n1 -lt n2 检查n1是否小于n2
n1 -ne n2 检查n1是否不等于n2

字符串比较

str1 == str2 检查str1是否和str2相同
str1 != str2 检查str1是否和str2不同
str1 < str2 检查str1是否比str2小
str1 > str2 检查str1是否比str2大
-n str1 检查str1的长度是否非0
-z str1 检查str1的长度是否为0

注:

  1. 字符串相等用单个等号就可以,这里是为了与其他编程语言尽可能保持一致。
  2. 大于号使用了转义,防止解释为重定向符号而出错。

    if

    if语句的判断条件为命令的退出码,为0执行then,否则执行else,这点与其他编程语言不同。测试退出码有三种方法,分别是

  3. if command

  4. if test command
  5. if [ expression ]

支持多重if嵌套,还可以用elif.

value1=10
if [ $value1 -gt 5 ]
then
echo "The test value $value1 is greater than 5"
else
echo "Else"
fi

输出

The test value 10 is greater than 5

for

for test in Beijing Shanghai
do
echo The next city is $test
done

for test in Beijing Shanghai
do
echo The next city is $test
done

输出

The next city is Beijing
The next city is Shanghai

while

# while 语句格式
# while test command
# do
# other commands
# done
var1=2
while [ $var1 -gt 0 ]
do
echo $var1
var1=$[ $var1 - 1 ]
done

输出

2
1

循环语句都接受breakcontinue

util

until命令要求你指定一个通常返回非零退出状态码的测试命令。

# util语句的一般格式
# until test commands
# do
# other commands
# done

case

case语句用来判断多种条件,基本结构如下:

case $USER in
rich | barbara)
echo "Welcome, $USER"
echo "Please enjoy your visit";;
testing)
echo "Special testing account";;
jessica)
echo "Do not forget to log off when you're done";;
*)
echo "Sorry, you are not allowed here";;
esac

输出

Sorry, you are not allowed here

函数

定义函数时使用function关键字,使用时只要像调用普通shell命令一样调用函数名就可以。

# 函数的基本形式
# 注意name后括号前要有空格
# function name {
# commands
# }
function func1 {
echo "function input $1"
}
var=$(func1 10)
echo "func1 10 return $var"

输出

func1 10 return function input 10

参数
参数与shell相同,都是通过$1,$2等传递,函数相当于脚本中的脚本。

返回值
默认返回值为最后一条命令的退出码,还可以用return命令返回指定退出码(0-255),也可以在函数中使用echo命令输出返回值,在调用函数时赋给某个变量。

作用域

分为全局变量与局部变量,在函数中可以用local显式定义一个局部变量,以防止对全局变量造成影响。
shell函数仅在定义它的shell会话内有效。

多文件

source命令会在当前shell上下文中执行命令,而不是创建一个新shell

# file: myfuns
function myfun1{
    echo "hello myfun1"
}

# file: main
source ./myfuns
# 或者 . ./myfuns
myfun1

面向对象

shell脚本是面向过程的,暂时没发现面向对象的写法。