Shell笔记
变量的使用
定义变量
定义变量直接 变量名=值
注意
- =号左右不能有空格,不然认为变量名为shell命令
- 值可以为任意类型,想写什么就写什么,而且在后面可以随意更改类型
使用变量
使用变量需要用$标识
name="corbin"
echo $name
也可以使用{}包围(推荐)
name="corbin"
echo ${name}
只读变量
只读变量 使用readonly定义变量即可
name="jay"
readonly name
删除变量
删除变量 使用unset定义变量即可
name="jay"
unset name
Shell中的变量
字符串
字符串 单引号标识
str='this is a string'
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
字符串 双引号标识
str=“this is a string”
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
字符串的操作
-
获取字符串的长度
str="abce"
echo ${#str}
-
提取子字符串
str="this is a string"
echo ${str:1:4}
上面demo从第二个字符开始截取一共4个字符
数组
使用()括号来标识数组,数组元素使用"空格"分割开。只支持一维数组,不支持多维数组,类似于C语言,数组元素的下标由0开始
array_name=(value0 value1 value2)
也可以使用回车
aray_name=(
value0
value1
value2
)
还可以单独定义每一个分量
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用连续的下标,而且下边没有范围限制
数组的操作
-
读取数组
${array_name[n]}
-
读取所有元素
${array_name[@]}
-
获取数组长度
echo ${#array_name[*]} or echo ${#array_name[@]}
-
获取数组的子串
echo ${array_name:1:4}
类似于获取字符串的字串,上面的demo获取从第二个开始的一共4个元素
其他变量
Shell中还有整数,浮点数等,但是没有其他语言里面的布尔值
使用注释
shell中的注释为# Shell中没有多行注释
Shell 传递参数
我们在执行Shell脚本的时候,往往会传递一些参数,获取这些参数的和使用变量的方式类似,使用$n,n=1,2,3...代表第一二三个参数,$0 代表执行的文件名
t.sh文件
echo "文件名为:${0}"
echo $1
echo ${2}
echo ${3}
传递参数的方法为,执行
sh ./t.sh value1 value2
上面demo没有第三个参数,会打印空
一些额外的参数
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
Shell脚本运行需要可执行权限,所以要使用chmod命令来给予可执行权限
chomd u+x t.sh
Shell 基本运算符
不支持简单的数学运算,需要使用命令来计算,eg:awk和expr.
两个数相加(使用的是反引号`)
val=`expr 2 + 2`
echo "2+2=${val}"
注意
表达式和运算符之间需要空格,比如2+2是不对的,必须为2 + 2
-
表达式需要被``(反引号)包含
运算符 说明 举例
+ 加法
expr $a + $b
- 减法
expr $a - $b
* 乘法
expr $a \* $b
/ 除法
expr $b / $a
% 取余
expr $b % $a
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个变量,相同则返回 true。如[ $a == $b ]
!= 不相等。用于比较两个变量,不相同则返回 true。如[ $a != $b ]
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
a=1
b='1'
if [ $a == $b ]
then
echo "a = b"
else
echo "a != b"
fi
输出为:a = b
[]与[[]]的区别
[]实际上是bash 中 test 命令的简写。即所有的 [ expr ] 等于 test expr
对 test 命令来说, 用 -eq 要进行数字比较.
[[ expr ]] 是bash中真正的条件判断语句,其语法更符合编程习惯 (比如 &&, || 的用法),在 [[ ]] 中的,任何需要整数,但是提供的确又是其他不能转换成整数的字符串,都变成了0。 所以应该保证自己代码中的需要用到整数的时候,总是提供整数。
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
字符运算符
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
流程控制
if elseif else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
while循环
while condition
do
command
done
while无限循环
while :
do
command
done
while true
do
command
done
until 循环
until condition
do
command
done
case语句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
*)
;;
esac
跳出循环
break
break命令
break命令允许跳出所有循环(终止执行后面的所有循环)。
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
Shell 函数
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
定义一个带有return语句的函数:
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
带参数的函数示例
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73