网站首页 文章专栏 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 |
注:
大于号使用了转义,防止解释为重定向符号而出错。
if语句的判断条件为命令的退出码,为0执行then
,否则执行else
,这点与其他编程语言不同。测试退出码有三种方法,分别是
if command
if test command
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 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 test command
# do
# other commands
# done
var1=2
while [ $var1 -gt 0 ]
do
echo $var1
var1=$[ $var1 - 1 ]
done
输出
2
1
循环语句都接受break
与continue
。
until命令要求你指定一个通常返回非零退出状态码的测试命令。
# util语句的一般格式
# until test commands
# do
# other commands
# done
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
脚本是面向过程的,暂时没发现面向对象的写法。