变量
一、变量定义
name="fallen_leaves"
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字
- 变量名与等号之间不能有空格
使用变量时,要在变量名前加上 $
echo $name
echo ${name}
二、只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
readonly name # 只读变量
三、删除变量
变量被删除后不能再次使用。unset 命令不能删除只读变量
unset name # 删除变量
四、字符串
字符串可以用单引号,也可以用双引号,也可以不用引号,但是单引号里的任何字符都会原样输出,而且单引号字符串中的变量是无效的,同时单引号字串中不能出现单引号。双引号里不仅可以有变量而且可以出现转义字符
name="fallen_leaves"
greeting="hello, ${name} !"
echo $greeting
echo ${#name} # 获取字符串长度
五、数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小
name=(name0 name1 name2) # 数组定义
people=${name[0]} # 获取一个元素
echo ${name[@]} # 获取所有元素
lengh=${#name[@]} # 获取数组长度
参数传递
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n为执行脚本的第一个参数,2为执行脚本的第二n个参数
example.sh
#echo "参数传递"
#echo "文件名:$0"
#echo "第一参:$1"
#echo "第二参:$2"
[john@localhost Shell]$ sh example.sh 1 2
参数传递
文件名:example.sh
第一参:1
第二参:2
运算符
一、算数运算符
#! /bin/bash
a=5
b=3
val=`expr $a + $b` # +
echo "$val"
val=`expr $a - $b` # -
echo "$val"
val=`expr $a \* $b` # *
echo "$val"
val=`expr $a / $b` # /
echo "$val"
if [ $a == $b ] # ==
then
echo "a等于b"
elif [ $a != $b ] # !=
then
echo "a不等于b"
fi
[john@localhost Shell]$ sh test.sh
8
2
15
1
a不等于b
二、关系运算符
#! /bin/bash
a=5
b=3
if [ $a -eq $b ] # a=b? 相等返回 true
then
echo "a 等于 b"
else
echo "a 不等于 b"
fi
if [ $a -ne $b ] # a=b? 不相等返回 true
then
echo "a 不等于 b"
else
echo "a 等于 b"
fi
if [ $a -gt $b ] # a>b? 是则返回 true
then
echo "a 大于 b"
else
echo "a 不大于 b"
fi
if [ $a -lt $b ] # a<b? 是则返回 true
then
echo "a 小于 b"
else
echo "a 不小于 b"
fi
if [ $a -ge $b ] # a>=b? 是则返回 true
then
echo "a 大于或等于 b"
else
echo "a 小于 b"
fi
if [ $a -le $b ] # a<=b? 是则返回 true
then
echo "a 小于或等于 b"
else
echo "a 大于 b"
fi
[john@localhost Shell]$ sh test.sh
a 不等于 b
a 不等于 b
a 大于 b
a 不小于 b
a 大于或等于 b
a 大于 b
三、BOOL运算符
! 非运算,表达式为 true 则返回 false,否则返回 true
[[ ! false ]]
-o 或运算,有一个表达式为 true 则返回 true
[[ $a -lt 20 -o $b -gt 100 ]]
-a 与运算,两个表达式都为 true 才返回 true
[[ $a -lt 20 -a $b -gt 100 ]]
四、逻辑运算符
&& 逻辑的 AND
[[ $a -lt 100 && $b -gt 100 ]]
|| 逻辑的 OR
[[ $a -lt 100 || $b -gt 100 ]]
五、字符串运算符
= 检测两个字符串是否相等,相等返回 true。
[ $a = $b ]
!= 检测两个字符串是否相等,不相等返回 true
[ $a != $b ]
-z 检测字符串长度是否为0,为0返回 true
[ -z $a ]
-n 检测字符串长度是否为0,不为0返回 true
[ -n $a ]
str 检测字符串是否为空,不为空返回 true
[ $a ]
逻辑控制
一、if条件判断:
if [ 条件语句1 ]
then
逻辑语句1
elif [ 条件语句2 ]
then
逻辑语句2
else
逻辑语句3
fi
二、for循环:
for var in item1 item2..
do
逻辑语句
done
三、while循环
while (( 条件语句 ))
do
逻辑语句
done
四、until条件循环
until 条件语句
do
逻辑语句
done
五、case选择
case var in
模式1)
逻辑语句
;;
模式2)
逻辑语句
;;
esac
函数
shell中函数可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。回可以加return 返回,如果不加,将以最后一条命令运行结果,作为返回值
demo(){
echo "Hello world"
}
echo "函数开始"
demo
echo "函数结束"
max(){
echo "输入第一个数:"
read a;
echo "输入第二个数:"
read b;
echo "两个数分别为$a、$b"
if [ $a -gt $b ]
then
return $a
else
return $b
fi
}
max
echo "最大的数为:$?"
[john@localhost Shell]$ sh test.sh
函数开始
Hello world
函数结束
输入第一个数:
1
输入第二个数:
2
两个数分别为1、2
最大的数为:2
函数传参
#! /bin/bash
show(){
echo "第一个参数:$1"
echo "第一个参数:$2"
echo "第一个参数:$3"
echo "参数数量:$#"
echo "所有参数:$*"
}
show hello fallen leaves
[john@localhost Shell]$ sh test.sh
第一个参数:hello
第一个参数:fallen
第一个参数:leaves
参数数量:3
所有参数:hello fallen leaves
输入/输出重定向
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果
command > file 2>&1:这里的&没有固定的意思,放在>后面,表示重定向的目标不是一个文件,而是一个文件描述符:
1 => stdout
2 => stderr
0 => stdin
文件包含
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell 文件包含的语法格式如下:
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
test1.sh
#! /bin/bash
name="fallen_leaves"
test2.sh
#! /bin/bash
. ./test1.sh
# source ./test1.sh
echo "姓名: $name"
[john@localhost Shell]$ ./test2.sh
姓名: fallen_leaves