计算4×5÷6
方法一:
使用$(())
A=$(((4*5)/6))
echo A=$A
方法二:
使用$[]
B=$[(4*5)/6]
echo B=$B
方法三:
使用expr
中间需要使用空格隔开
赋值要使用反引号·
C=`expr 4 \* 5 / 6 `
echo C=$C
运行结果:
bash mathrl
A=3
B=3
C=3
创建,输出,删除变量
#!/bin/bash
#声明
#创建一个变量
#中间不能使用空格
A=100
#输出变量,使用$
echo $A
echo A=$A
echo "A=$A"
#删除变量
unset A
echo A
运行结果
100
A=100
A=100
静态变量
#创建静态变量
readonly B=2
#输出
echo $B
#删除变量
unset B
运行结果
2
bash: unset: B:无法取消设定: 只读 variable
静态变量不可被删除
系统变量
在系统中已经设置好的变量
echo $HOME
echo $USER
echo $HOME
#还有很多
可以使用set
查看系统变量
环境变量
在各个shell脚本中都能使用的变量(全局变量)
var1.sh
#定义一个环境变量
export EX_VAR=10
在另外一个脚本中使用
#加载变量
source var1.sh
#输出变量
echo $EX_VAR
运行
10
将命令赋值给变量
A=$(ls)
echo $A
运行结果
var1.sh var2.sh var.sh
位置参数变量
$*:输出所有参数(整体输出)
$@:输出所有参数(分别单独输出)
$#:输出参数个数
#!/bin/bash
#输出参数
echo 0=$0 1=$1 2=$2 3=$3
#输出所有参数 方法一
echo 所有参数为$*
#输出所有参数 方法二
echo 所有参数为$@
#输出参数个数
echo $#
运行
#传入参数运行,参数之间用空格分开
bash var2.sh 10 20 30
#结果
0=var2.sh 1=10 2=20 3=30
所有参数为10 20 30
所有参数为10 20 30
3
预定义变量
$$:当前进程PID
$!:输出当前最后一个后台的进程号
$?:输出最后一个执行命令的状态,为0正常
#!/bin/bash
#输出当前进程的PID
echo 当前进程的PID为$$
#后台运行程序
gedit var.sh &
#输出当前最后一个后台的进程号
echo 最后一个后台进程号$!
#输出最后一个执行命令的状态,为0正常
echo 状态为$?
运行结果
当前进程的PID为2119
最后一个后台进程号2705
状态为0
if [ 条件 ] #中括号里面一定要空格
then 命令
fi
if [ 条件 ] #中括号里面一定要空格
then 命令
elif [ 条件 ]
then 命令
...
else 命令
fi
[]测试条件参数:
整数判断
参数 | 功能 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-lt | 小于 |
–le | 小于等于 |
-gt | 大于 |
-ge | 大于等于 |
字符串判断
参数 | 功能 |
---|---|
= | 等于 |
!= | 不等于 |
str1 < str2 | 小于 |
str1 >str2 | 大于 |
str | 非空为真 |
-n str | 长度大于0为真 |
-z str | 长度等于0为真 |
大于小于是以字典顺序排序
文件判断
参数 | 功能 |
---|---|
-r | 可读 |
-w | 可写 |
-x | 可执行 |
-f | 文件存在且存在 |
-d | 文件为目录 |
逻辑运算
参数 | 功能 |
---|---|
! | 非 |
-a | 与 |
-o | 或 |
案例1:判断学生成绩,<60不及格,>60和<80及格,>80优秀,其他成绩错误。
#!/bin/bash
if [ $1 -lt 60 -a $1 -ge 0 ]
then
echo "不及格"
elif [ $1 -lt 80 ]
then
echo "及格"
elif [ $1 -le 100 ]
then
echo "优秀"
else
echo "成绩错误"
fi
运行结果
bash if1 0
不及格
bash if1 100
优秀
bash if1 120
成绩错误
案例2:判断文件权限,可写,可读,可执行,不存在输出文件不存在:
#!/bin/bash
if [ -f $1 ]
then
echo -n "$1文件"
if [ -r $1 ]
then
echo -n "可读"
fi
if [ -w $1 ]
then
echo -n "可写"
fi
if [ -x $1 ]
then
echo -n "可执行"
fi
else
echo "文件不存在"
fi
echo
运行结果
bash if2 txt #运行
文件不存在 #结果
touch txt #运行
bash if2 txt #运行
txt文件可读可写 #结果
case语句的格式:
case 字符串 in
模式字符串1) 命令 ;;
模式字符串2) 命令 ;;
模式字符串3) 命令 ;;
模式字符串4) 命令 ;;
*)命令 ;;
esac
如果字符串等于模式字符串1-4就执行,如果都不满足,就执行)的命令。*
案例:写一个shell来控制文件,输入1输出文件内容,输入2删除文件,输入3改变文件名称,其他输出错误。
程序如下:
#!/bin/bash
case $1 in
1) cat $2 ;;
2) rm $2 ;;
3) mv $2 $3 ;;
*) echo "指令错误"
esac
运行如下:
qx@qx-VirtualBox:~/桌面/Class/ifelse$ bash case 3 txt atxt
qx@qx-VirtualBox:~/桌面/Class/ifelse$ ls
atxt case if1 if2
qx@qx-VirtualBox:~/桌面/Class/ifelse$ bash case 1 atxt
abcdefg
qx@qx-VirtualBox:~/桌面/Class/ifelse$ bash case 2 atxt
qx@qx-VirtualBox:~/桌面/Class/ifelse$ ls
case if1 if2
qx@qx-VirtualBox:~/桌面/Class/ifelse$ bash case 4 atxt
指令错误
格式一:
for 变量 in "值表"
do
命令
done
格式二:
for (( e1;e2;e3 ))
do
命令
done
和C语言类似,比如for (( i=0; i<100; i++ ))
案例:将输入的所有数进行求和
使用方法一写:
#!/bin/bash
sum=0
for i in " $@ "
do
sum=$[$sum+$i]
done
echo $sum
运行结果:
bash -x for 1 2 3 4 5
+ sum=0
+ for i in " $@ "
+ sum=1
+ for i in " $@ "
+ sum=3
+ for i in " $@ "
+ sum=6
+ for i in " $@ "
+ sum=10
+ for i in " $@ "
+ sum=15
+ echo 15
15
使用方法二写:
#!/bin/bash
num=$#
sum=0
for(( i=1; i<=num; i++ ))
do
sum=$[$sum+$i]
done
echo $sum
运行结果:
bash -x for2 1 2 3 4 5
+ num=5
+ sum=0
+ (( i=1 ))
+ (( i<=num ))
+ sum=1
+ (( i++ ))
+ (( i<=num ))
+ sum=3
+ (( i++ ))
+ (( i<=num ))
+ sum=6
+ (( i++ ))
+ (( i<=num ))
+ sum=10
+ (( i++ ))
+ (( i<=num ))
+ sum=15
+ (( i++ ))
+ (( i<=num ))
+ echo 15
15
格式:
while [ 条件 ]
do
指令
done
注意:while与中括号需要有空格
案例:将输入的数据进行求和
程序如下:
#!/bin/bash
sum=0
num=0
while [ $# -ne 0 -a $num -lt $# ]
do
num=$[$num+1]
sum=$[$sum+$num]
done
echo sum=$sum
运行如下:
bash -x while 1 2 3 4 5
+ sum=0
+ num=0
+ '[' 5 -ne 0 -a 0 -lt 5 ']'
+ num=1
+ sum=1
+ '[' 5 -ne 0 -a 1 -lt 5 ']'
+ num=2
+ sum=3
+ '[' 5 -ne 0 -a 2 -lt 5 ']'
+ num=3
+ sum=6
+ '[' 5 -ne 0 -a 3 -lt 5 ']'
+ num=4
+ sum=10
+ '[' 5 -ne 0 -a 4 -lt 5 ']'
+ num=5
+ sum=15
+ '[' 5 -ne 0 -a 5 -lt 5 ']'
+ echo sum=15
sum=15