Shell 基本语法
变量命名
定义变量时,变量名不加美元符号($)
注意,变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可
a=10
echo "a=$a"
返回结果:
a=10
只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
#!/bin/bash
myUrl="https://cnblogs.com/tenic"
readonly myUrl
myUrl="https://www.google.com"
返回结果
myUrl: readonly variable
删除变量
使用unset命令可以删除变量,删除后不能再次使用
unset myUrl
shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
- 单引号
str='this is a string'
echo $str
返回结果:
this is a string
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
- 双引号
your_name='tenic'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
输出结果为:
Hello, I know you are "tenic"!
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
- 拼接字符串
your_name="tenic"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
输出结果为:
hello, tenic ! hello, tenic !
hello, tenic ! hello, ${your_name} !
- 获取字符串长度
string="abcd"
echo ${#string} #输出 4
- 提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="cnblogs is a great site"
echo ${string:1:4} # 输出 nblo
注意:第一个字符的索引值为 0。
- 查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="cnblogs is a great site"
echo `expr index "$string" io` # 输出 4
注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。
Shell 注释
-
单行注释
以 # 开头的行就是注释,会被解释器忽略。
通过每一行加一个 # 号设置多行注释, -
多行注释
当需要注释多行代码时,可以使用:<<EOF... EOF格式
EOF可以使用其他符号,比如!或者'
:<<!
注释内容。。。
注释内容。。。
注释内容。。。
!
传输参数
我们在执行shell脚本的时候,可以向shell脚本中传递参数,在shell脚本中使用这些传入的参数
在脚本中使用 $N,N代表数字,1,2,3
echo "接收的第一个参数是:$1"
echo "接收的第二个参数是:$2"
使用特殊字符来处理参数接收
echo '测试$*'
for i in "$*";do
echo i;
done
echo '测试$@'
for i in "$@";do
echo i
done
返回结果
./demo1.sh a b c
测试$*
a b c
测试$@
a
b
c
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
默认是只有9个参数,那如果我们要取第10个参数要怎么取呢?
echo "第10个参数${10}"
算术运算符
shell和其他编程一样,支持包括:算术,关系,布尔,字符串等运算符。
原生bash不支持简单的数学运算,单是可以通过其他命令来实现,例如expr
expr是一款表达式计算工具,使用它能完成表达式求值操作。
使用expr表达式时要注意:
操作数和运算符之间要有空格,eg:2 + 2
,而不能写成2+2
完整的表达是要被`包含
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20
布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg"
程序流程
1.条件分支结构
1.1 if条件分支
常用的判定条件运算符:
只支持数字,不支持字符串,除非字符串的值是数字
#! /bin/bash
a=20
b=10
#单if模式
if [ $a -gt $b ];then
echo "a大于b"
fi
#双分支模式
scores=66
if [ $scores -gt 60 ];then
echo "成绩合格"
else
echo "成绩不合格"
fi
#多分支结构
scores02=95
if [ $scores02 -gt 90 ];then
echo "成绩优秀"
elif [ $scores02 -gt 80 ];then
echo "成绩良好"
elif [ $scores02 -gt 70 ];then
echo "成绩中等"
elif [ $scores02 -gt 60 ];then
echo "成绩及格"
else
echo "成绩不及格"
fi
1.2 case条件分支
用case语句匹配一个值于一个模式,如果匹配成功,执行匹配的命令
取值后面必须位单词 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;(类似java中的break)。
取值将检测匹配每一个模式,一旦匹配,则执行完匹配模式相应命令后,不在继续其他模式。如果无一匹配模式,使用* (类似java中的default)捕获该值,在执行后面的命令。
#!/bin/bash
a=20
case $a in
10) echo "a的值是10"
;;
20)echo "a的值是20"
;;
*) echo "a的值不是10也不是20"
;;
esac
循环结构
1.for循环
使用循环遍历1-5
#! /bin/bash
echo "第一种方式"
for i in 1 2 3 4 5; do
echo $i
done
echo "第二种方式"
for i in (1..5); do
echo $i
done
echo "使用循环遍历1-5中的奇数,1-5,步长是2"
for i in (1..5..2);do
echo $i
done
echo "使用遍历访问目录下的内容"
for i in 'ls /';do
echo $i
done
2.while循环
计算1加到10的值
#!/bin/bash
sum=0
i=1
while [ $i -ge 10 ];do
sum=$[sum + i]
i=$[i + 1]
done
echo $sum
每个1秒打印一次系统时间
#!/bin/bash
while true;do
date
sleep 1
done
break和continue
break是结束所有循环
#!/bin/bash
i=1
while true; do
if [ $i -gt 10 ];then
break;
fi
echo $i
date
sleep1
i=$[i + 1]
done
continue是结束本次,进入下次循环
#!/bin/bash
for i in (1..20);do
if test $[ i % 3] -eq 0;then
continue
fi
echo $i
done
3 util 循环
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
until condition
do
command
done
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环
函数
#!/bin/bash
print(){
echo "this is my first function"
}
echo "调用函数print开始"
print
echo "调用函数print结束"
- 函数传参
调用函数时可以向其传递参数,在函数体内部,通过$n的形式来获取参数的值,注意:$10不能获取到第10个参数,要使用${10}来获取
#!/bin/bash
print(){
echo "第一个参数是:$1"
echo "第10个参数是:${10}"
}
print 1 2 3 4 5 6 7 8 9 10 11
- 返回值
add(){
return $[ $1 + $2 ]
}
add 1 2
echo $? # $?可以获取最后命令执行的结果作为返回值使用
数组
特点
bash中的数组只支持一维数组
初始化时不需要定义数组大小
数组元素的下标由0开始
用括号表示,元素用空格符号分隔开
- 读取数组
#!/bin/bash
arr01=(1 3 "a" "abc")
echo "数组第一个元素${arr01[0]}"
echo "数组最后一个元素${arr01[10]}"
echo "读取数组全部数据${arr01[*]}"
echo "读取数组的长度:${#arr01[*]}"
arr01[3]="dff"
echo "修改后的数组全部数据为${arr01[*]}"
- 遍历数组
for i in ${arr01[*]};do
echo $i
done
函数引用
使用source 来加载另外一个shell脚本
或者使用 .来加载
#! /bin/bash
source ./demo11.sh
for i in ${arr01[*]};do
echo $i
done