变量
定义变量时,变量名不加美元符号
name="akina" # 直接复制
echo ${name} # [$name] # 使用变量
myObj="path"
readOnly myObj # 只读变量
for file in `ls /etc`; # 反引号
do
done
echo `ls /etc`
# 删除变量
unset myObj # 不能删除只读变量
your_name="coonote"
# 使用双引号拼接
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
# 获取字符串的长度
string="abcd"
echo ${#string} #输出 4
# 查找字符串
string="coonote is a great site"
echo `expr index "$string" io` # 输出 4
数组
数组名=(val1 val2 val3) ,元素之间空格隔开
list=(value1 value2)
echo &{list[0]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
# 获取数组全部元素
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"
参数的传递
我们可以在执行 shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
参数处理 | 说明 |
---|---|
$# | 参数个数 |
$* | 所有参数 |
基本运算符
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。注意 expr 使用反引号
val=`expr 2 + 2`
echo "两数之和为 : $val"
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
加法 expr $a + $b
结果为 30。
减法 expr $a - $b
结果为 -10。
乘法 expr $a \* $b
结果为 200。# 乘号需要反斜杠转义
除法 expr $b / $a
结果为 2。
取余 expr $b % $a
结果为 0。
赋值 a=$b
把变量 b 的值赋给 a。
相等。相同则返回 true。[ $a == $b ]
返回 false。
不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ]
返回 true。
注意:条件表达式要放在方括号之间,
并且要有空格
,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
关系运算符
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ]
返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ]
返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ]
返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ]
返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ]
返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ]
返回 true。
布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ]
返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ]
返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ]
返回 false。
字符串运算符
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ]
返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ]
返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ]
返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ]
返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ]
返回 true。
文件测试运算符
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ]
返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ]
返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $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 condition
then
command1
command2
...
commandN
fi
if [ $val1 -gt $val2 ] then
echo "akina"
fi
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
- 循环控制
# for 循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
for item in 100 300 200
do
echo $item
done
for str in This is a string
do
echo $str
done
for item in ${list[*]}
do
echo $item
done
for (( ; ; ))
# while 循环
while condition
do
command
done
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
while :
do
command
done
while true
do
command
done
# break continue
# case 语句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case $1 in
1)
echo "akina"
;;
2)
echo "中森明菜"
;;
esac
函数定义
[ function ] funname [()]
{
action;
[return int;]
}
# 示例
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
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