变量
shell变量定义的严格语法限制:
1. 变量名和等号之间不能有空格。
2. 变量名收个字符必须为英文父母。
3. 不能包含标点符号但能够使用下划线"_"。
4. 不能使用空格。
5. 不能使用bash里的关键字。
引用变量
对于定义过的变量只要在变量名之前加一个$即可。
重新定义变量
已经定义的变量,可以被重新定义。
荔汁
name="rookiezhao"
echo=${name}
name="rookie"
echo${name}
只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
荔汁
name="rookiezhao"
readonly name
name="tiechui"
参数传递
在执行shell脚本时,可以向脚本传递参数。脚本内获取参数的格式为:$n。n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,一次类推…
- 修改helloworld.sh为
#!/bin/bash
echo $1
echo $2
echo $3
- 执行携带参数
[rookiezhoa@dev64]./helloworld.sh haha wowow nini
haha
wowo
nini
特殊字符
字符 | 意义 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
$和 @ 区 别 : 相 同 点 : 都 表 示 传 递 给 脚 本 的 所 有 参 数 。 不 同 点 : 不 被 " " 包 含 时 , " @区别: 相同点:都表示传递给脚本的所有参数。 不同点:不被 " " 包含时, " @区别:相同点:都表示传递给脚本的所有参数。不同点:不被""包含时,""会将所有的参数作为一个整体,以" $1 $2 … $n"的形式组成一个整串;"$@“会将各个参数分开,以”$1" " 2 " . . . " 2" ... " 2"..."n"的形式组成一个参数列表。
shell字符串
单引号
name=‘my name is rookiezhao’
1. 单引号字符串不支持引用变量,任何字符都会原样输出
2. 单引号字符串中不能出现单引号(对单引号使用转移符后也不行)
双引号
name=‘my name is rookiezhao’
name_again=""$[name}""
1. 双引号里可以引有变量
2. 双引号里支持转义字符
字符串长度
name=‘my name is rookiezhao’
echo ${#name}
截取字符串
name=‘my name is rookiezhao’
echo ${name❌y}//执行输出rookiezhao
这里的x,y代表从name字符串中的第x+1个字符串开始,向后y个字符。
shell数组
bash支持一位数组(不支持多维数组),并且没有限定数组的大小。在shell中,用括号来表示数组,数组袁术用"空格"符号分隔开。定义数组的一般形式为:
array_name=(value1 … valuen)
//第一个数组
rookiezhao@Dev_t64:~$usernames=(1 2 33 444 rookiezhao)
//默认读取第一个
rookiezhao@Dev_t64:~$echo ${usernames}
1
//读取下标为0的
rookiezhao@Dev_t64:~$echo ${usernames[0]}
1
//读取下表为1的
rookiezhao@Dev_t64:~$echo ${usernames[1]}
2
//读取所有
rookiezhao@Dev_t64:~$echo ${usernames[@]}
1 2 33 444 rookiezhao
rookiezhao@Dev_t64:~$echo ${usernames[*]}
1 2 33 444 rookiezhao
//获取数组长度
rookiezhao@Dev_t64:~$echo ${#usernames[@]}
1 2 33 444 rookiezhao
rookiezhao@Dev_t64:~$echo ${#usernames[*]}
1 2 33 444 rookiezhao
shell运算符
支持包括:算数、关系、布尔、字符串等运算符。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。expr是一款表达式计算工具,使用它能完成表达式的求值操作。
荔汁
#!/bin/bash
a=10
b=20
val=$(expr $a + $b) //$a 与 + 与 $b之间应该有两个空格
echo "a+b:$val"
val=$(expr $a - $b) //$a 与 - 与$b之间应该有两个空格
echo "a-b:$val"
val=$(expr $a \* $b) //转义*
echo "a*b:$val"
val=$(expr $b / $a)
echo "b/a:$val)
val=$(expr $b % $a)
echo "b%a:$val"
if [ $a == $b ] //if 与 [ 与 $a 与 == 与 $b 与 ] 之间应该有5个空格每个“与”是一个空格。
then
echo "a==b"
fi
if [ $a != $b ]
then
echo "a!=b"
fi
输出
rookiezhao@Dev_t64:~$./calculation.sh
a+b:30
a-b:-10
a*b:200
b/a:2
b%a:0
a!=b
注意
- 乘号*前面必须加反斜杠\
- 条件表达式要放在方括号之间,并且要有空格
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
运算符 | 意义 |
---|---|
-eq | EQUAL等于 |
-ne | NOT EQUAL不等于 |
-gt | GREATER THAN 大于 |
-lt | LESS THAN 小于 |
-ge | GREATER THAN EQUAL 大于等于 |
-le | LESS THAN OR EQUAL 小于等于 |
布尔运算符
运算符 | 意义 |
---|---|
&& | 与 |
荔汁
#!bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]] //[[之间是没有空格的。
then
echo "true"
else
echo "false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "true"
else
echo "false"
fi
执行
rookiezhao@Dev_t64:~/testofshell$./booloperator.sh
false
true
字符串运算符
操作符 | 意义 |
---|---|
-z | 字符串长度是否为0,为0返回true |
-n | 字符串长度是否为0,不为0返回true |
str | 字符串是否为空,不为空返回true |
文件测试运算符
操作符 | 意义 |
---|---|
-b file | 文件是否是块设备文件,如果是,则返回true |
-c file | 文件是否是字符设备文件,如果是,则返回true |
-d file | 文件是否为目录文件,如果是,则返回true |
-f file | 文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true |
-g file | 文件是否设置了SGID位,如果是,则返回true |
-k file | 文件是否设置了粘着位(Sticky Bit),如果是,则返回true |
-p file | 文件是否是有名管管道,如果是,则返回true |
-u file | 文件是否设置了SUID位,如果是,则返回true |
-r file | 文件是否可读,如果是,则返回true |
-w file | 文件是否科协,如果是,则返回true |
-x file | 文件是否可执行,如果是,则返回true |
-s file | 文件是否为空(文件大小是否大于0),不为空返回true |
-e file | 文件(包括目录)是否存在,如果是,则返回true |
荔汁
#!/bin/bash
file="/com/rookiezhao"
if [ -r $file ]
then
echo "can read"
else
echo "can not read"
fi
if [ -w $file ]
then
echo "can write"
else
echo "can not write"
fi
if [ -x $file ]
then
echo "can run"
else
echo "can not run"
fi
if [ -f $file ]
then
echo "common file"
else
echo "no common file"
fi
if [-s $file ]
then
echo "no empty file"
else
echo "empty file"
fi
if [ -e $file ]
then
echo "exist file"
else
echo "no exist"
fi
流程控制
1. if-else
if condition
then
//do
else
fi
if condition1
then
//do things
elif condition2
then
//do things
else
//do things
fi
2. case
case语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令
case 值 in
模式1)
//do things
;;
模式2)
//do things
;;
*)
//do things
;;
esac
取值后面必须为关键字in,每一模式必须以又括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。;;与其他语言中的break类似,意思是调到整个case语句的最后。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用型号*捕获该值,再执行后面的命令。
3. for
for 变量 in 列表
do
//do things
done
4.while
while command
do
//do things
done
5. until
until 循环执行一系列命令直至条件为true时停止。until循环与while循环在处理方式上刚好相反。一般while循环优先于until循环,但在某些时候,也只是极少数情况下,unitl循环更加有用。
until command
do
//do things
done
command一般为条件表达式,如果返回值为false,则继续执行循环体内的语句,否则跳出循环。
函数
功能:函数可以让我们讲一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,shell也支持函数。shell函数必须先定义后使用。
#!/bin/bash
demoFun(){
echo "this is a shell fun()"
}
echo " start demoFun"
demoFun
echo "end demoFun"
执行
[rookiezhao@dev_t64~]./demoFun.sh
start demoFun
this is a shell fun()
end demoFun
参考:
(https://blog.csdn.net/weixin_37490221/article/details/80869792)