1.变量
- 变量定义
yourname="zhangsan"
echo ${yourname}
不需要类型声明,赋值时等号中间不能有空格,使用时必须在前面加$,建议尽量将变量名用花括号包裹
- 将变量设置为只读
readonly yourname
- 删除变量
unset yourname
- shell三种类型变量
- 局部变量
脚本里定义的变量仅在当前脚本中有效。 - 环境变量
- shell变量
维持shell正常运行所设置的一些局部变量和环境变量
- 局部变量
2. 字符串
单引号和双引号的区别:
- 单引号任何字符原样输出,不存在引用变量,也不能在单引号内部出现任何其它单引号。
双引号可以有变量,可以有转义字符。
your_name='qinjx' str="Hello, I know your are \"$your_name\"! \n" echo ${str}
#
获取字符串长度echo ${#str}
子字符串
//从下标为1的地方开始截取4个字符 hang str='zhangsan' echo ${str:1:4}
3. 数组
array_name=(1 'zhangsan')
echo ${array_name[0]} #1
echo ${array_name[@]} #1 zhangsan
echo ${#array_name} #1
echo ${#array_name[@]} #2
${array_name}
等同于${array_name[0]}
- 数组使用小括号包裹,中间用空格或者回车间开,数组值可以混合定义
- 下标@代指数组全部
- 数组长度可以使用#取得
- shell只支持一维数组
4. shell注释
shell只有一种方式注释,就是使用#
,没有多行注释,如需注释代码块,可以使用{}
将其包裹成为一个函数,只要不被调用即相当于失效。
5. 变量传递
向脚本传递变量时,脚本内部使用$1
$2
...
去引用传入的第一个参数 第二个参数 …
$# //参数个数
$* //所有参数以空格间开并作为一个字符串整体返回
$@ //同$*
$*和$@的区别
只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 \$*
等价于 “1 2 3”(传递了一个参数),而 $@
等价于 “1” “2” “3”(传递了三个参数)。
6. 算术运算
shell原生不支持简单的算术运算,但可以使用表达式计算工具expr完成求值。
- 加
+
- 减
-
- 乘
\*
- 除
/
- 求余
%
- 赋值
=
使用方式:
a=10
b=20
val=`expr $a + $b`
echo val #30
expr表达式放置在反括号里,运算符前后必须用空格间开,乘法运算符为\*
7. 其它运算符
逻辑运算符 | 说明 |
---|---|
$eq | 等于 |
$ne | 不等于 |
$gt | 大于 |
$lt | 小于 |
$ge | 大于等于 |
$le | 小雨等于 |
布尔运算符 | 说明 |
---|---|
! | 非运算符 |
-o/|| | 或运算符 |
-a/&& | 与运算符 |
文件测试运算符 | 说明 |
---|---|
-d | 是否为文件夹 |
-f | 是否为文件 |
-r | 是否可读 |
-w | 是否可写 |
-x | 是否可执行 |
-s | 是否为空 |
-e | 是否存在 |
8. 分支语句
#if分支
if condition
then
command1
command2
...
elif condition
then
command1
command2
...
else
command1
...
fi
#case分支
read aNum
case $aNum in
1) echo '输入1'
;;
2) echo '输入2'
;;
*) echo '输入其它'
;;
esac
分支下没有任何执行语句不被允许,必须选择忽略该分支。
例如
a=10
b=20
if [ $a == $b ]
then
echo '两数相等'
elif [ $a -lt $b ]
then
else
echo '两数不等'
fi
其中elif
分支下没有执行语句,将报错。
case分支语句,必须使用in
,每个匹配模式添加)
,匹配执行语句完成添加;;
,匹配所有其它使用*
,最后使用esac
封尾。
通常条件表达式有以下几种用法:
if [ $a -lt $b ]
if test $a -lt $b
第一种 []
之间的任何一个空格不能少。更多的是采用test命令。
9. 循环语句
#输出 张三 李四
for name in '张三' '李四'
do
echo ${name}
done
#输出 1 2 3 4 5
index=1
while((${index} <= 5))
do
echo ${index}
let "index++"
done
#接受键盘输入 并输出
while read some
do
echo ${some}" is you say"
done
#无限循环1
while true
do
command
done
#无限循环2
for((;;))
do
command
done
#无限循环3
until false
do
command
done
注:for
while
until
跟条件语句,需使用(())
,支持break
跳出全部循环,continue
跳出当前循环。
10. 函数
#不带参带返回值
functionName() {
return `expr 5 + 5`
}
functionName
echo $? #10
#带参
functionName(){
if test ${1} -ge ${2}
then
return ${1}
else
return ${2}
fi
}
echo "-----函数开始执行-----"
functionName $1 $2
echo "-----较大值为---------"
echo $?