您的位置:首页 > 运维架构 > Shell

shell学习数组、基本运算符

2017-11-02 00:31 253 查看

数组

语法

数组名=(值1 值2 值3…)

初始化数组

有两种方法

1. 方式一

name=("李明" "Andy" "李磊" "james")
echo $name


打印第一个元素

2. 方式二

name=()
name[0]="404"
name[1]="Andy"
name[2]="柚芒子"
name[3]="全班最菜"
echo ${name[0]}  ${name[1]}


读取数组

语法结构:${数组名[下标]}

name=("404" "Andy" "柚芒子" "全班最菜")
#输出一个元素
echo ${name[0]}
#输出所有->"@"表示输出所有的数据
echo ${name[@]}
#输出所有->"*"表示输出所有的数据
echo ${name[*]}


数组里面的长度

1.数组长度

语法:${#数组名[@]}

或者: ${#数组名[*]}

name=("404" "Andy" "柚芒子" "全班最菜")
echo ${#name[@]}
echo ${#name[*]}


结果 4

2.数组元素长度

语法:${#数组名[下标]}

name=("404" "Andy" "柚芒子" "全班最菜")
echo ${#name[2]}


结果 3

传递参数

语法定义

./文件名称.sh 参数1 参数2 参数3…

##${0}->表示文件名称
###${1}->表示参数1
###${2}->表示参数2
echo ${0} ${1}  ${2}
# 执行脚本代码:
./hello.sh "合理" "哈哈"


结果 ./hello.sh 合理 哈哈

$#:获得脚本输入参数个数

# 脚本内容如下:
echo ${#}
# 执行脚本代码:
./hello.sh "逗你玩" "饿到爆"


结果 2

${*} 显示整个脚本输入参数列表

# 脚本内容如下:
echo ${*}
# 执行脚本代码:
# ./hello.sh "逗你玩" "饿到爆"


结果: 逗你玩 饿到爆

基本运算符

算数运算符

注意:”expr”规定命令

加法

a=8388
b=9688
c=`expr $a + $b`
echo "c的值:$c"


结果:c的值:18076

注意 “是键盘左上角 $a + $b之间要有空格

减法

a=8388
b=9688
c=`expr $a - $b`
echo "c的值:$c"


结果:c的值:-1300

乘法

a=8388
b=9688
c=`expr $a \* $b`
echo "c的值:$c"


结果:c的值:81262944

注意 *要转义一下写成 \*

除法

a=8388
b=9688
c=`expr $b / $a`
echo "c的值:$c"


结果:c的值:1

注意 结果是向下取整

求余

a=8388
b=9688
c=`expr $b % $a`
echo "c的值:$c"


结果:c的值:1300

关系运算符

“-eq”

“-eq”:检测两个数是否相等,当等返回true

eq 就是equal的缩写

a=32
b=34

if [ $a -eq $b ]
then
echo "a等于b"
else
echo "a不等于b"
fi


输出:a不等于b

注意:[ $a -eq $b ] 括号和代码直接有空格

“-ne”

“-ne”:检测两个数是否不相等,不相等返回true

ne 就是not equal的缩写

a=32
b=34

if [ $a -ne $b ]
then
echo "a不等于b"
else
echo "a等于b"
fi


输出:a不等于b

“-gt”

“-gt”:检测左边数是否大于右边数,如果是,返回true

gt 就是greater than的缩写

a=32
b=32

if [ $a -gt $b ]
then
echo "a大于b"
else
echo "a小于等于b"
fi


输出:a小于等于b

“-lt”

“-lt”:检测左边数是否小于右边数,如果是,返回true

lt 就是less than的缩写

a=32
b=32

if [ $a -lt $b ]
then
echo "a小于b"
else
echo "a大于等于b"
fi


输出:a大于等于b

“-ge”

“-ge”:检测左边数是否(大于+等于)右边数,如果是,返回true

ge 就是greater or equal的缩写

a=33
b=32

if [ $a -ge $b ]
then
echo " a大于等于b"
else
echo "a小于b"
fi


输出:a大于等于b

“-le”

“-ne”:检测左边数是否(小于+等于)右边数,如果是,返回true

le 就是less or equal的缩写

a=33
b=32

if [ $a -le $b ]
then
echo " a小于等于b"
else
echo "a大于b"
fi


输出:a大于b

布尔值运算符

“!”:非运算,表达式为true,返回true,否则返回false

a=100
b=200
if [ $a != $b ]
then
echo "a不等于b"
fi


输出:a不等于b

“-o”:或运算,有一个表达式为true,则返回true

o or的缩写

a=100
b=200
if [  $a -lt 200  -o  $b -gt 200  ]
then
echo "成立"
fi


输出:成立

注意:中括号的个数和运算符直接的空格

“-a”:与运算,两个表达式为true,则返回true

a and的缩写

a=100
b=200
if [ $a -lt 200 -a $b -gt 200 ]
then
echo "成立"
else
echo "不成立"
fi


输出:不成立

注意:中括号的个数和运算符直接的空格

逻辑运算符

“&&”:逻辑且->and

a=100
b=200
if [ $a -lt 200 ] && [ $b -gt 200 ]
then
echo "成立"
else
echo "不成立"
fi


输出:不成立

注意:中括号的个数和运算符直接的空格

“||”:逻辑 OR

a=100
b=200
if [ $a -lt 200 ] || [ $b -gt 200 ]
then
echo "成立"
else
echo "不成立"
fi


输出:成立

注意:中括号的个数和运算符直接的空格

字符运算符

“=”

检测两个字符串(也可以数字)是否相等,如果相等返回true

a="JAR"
b="逗你玩"
if [ $a = $b ]
then
echo "字符串a等于字符串b"
else
echo "字符串a不等于字符串b"
fi


输出:字符串a不等于字符串b

“!=”

检测两个字符串是否相等,如果不相等返回true

a="JAR"
b="逗你玩"
if [ $a != $b ]
then
echo "字符串a不等于字符串b"
else
echo "字符串a等于字符串b"
fi


输出:字符串a不等于字符串b

“-z”

检测字符串长度是否为0,如果是返回true

z 是zero的缩写

a="JAR"
if [ -z $a ]
then
echo "a为空"
else
echo "a不为空"
fi


输出:a不为空

“-n”

检测字符串长度是否为0,如果不是0 返回true

a="JAR"
if [ -n "$a" ]
then
echo "a不为空"
else
echo "a为空"
fi


输出:a不为空

“”

检测字符串是否为空,不为空返回true

a="JAR"
if [ -n  ]
then
echo "a不为空"
else
echo "a为空"
fi


输出:a不为空

文件测试运算符

“-d file”

检测文件是不是一个目录,如果是,那么返回true

d是directory的缩写

file="/Users/liyanjun/shell/hello.sh"
if [ -d $file ]
then
echo "是一个目录"
else
echo "不是一个目录"
fi


输出:不是一个目录

“-r file”

检测文件是否可读,如果是,那么返回true

file="/Users/liyanjun/shell/hello.sh"
if [ -r $file ]
then
echo "可读"
else
echo "不可读"
fi


输出:可读

“-w file”

检测文件是否可写,如果是,那么返回true

file="/Users/liyanjun/shell/hello.sh"
if [ -d $file ]
then
echo "可写"
else
echo "不可写"
fi


输出:不是一个目录

“-x file”

检测文件是否是可执行文件,如果是,那么返回true

file="/Users/liyanjun/shell/hello.sh"
if [ -x file ]
then
echo "可执行"
else
echo "不可执行"
fi


输出:可执行

“-x file”

检测文件是否是可执行文件,如果是,那么返回true

file="/Users/liyanjun/shell/hello.sh"
if [ -x file ]
then
echo "可执行"
else
echo "不可执行"
fi


输出:可执行

“-f file”

检测文件是否是一个普通文件(既不是目录,也不是设备文件),如果是,那么返回true

f

file="/Users/liyanjun/shell/hello.sh"
if [ -f file ]
then
echo "普通文件"
else
echo "不是普通文件"
fi


输出:普通文件

“-e file”

检测文件是否存在(包含了:目录和文件),如果是,那么返回true

e exist的缩写

file="/Users/liyanjun/shell/hello.sh"
if [ -e file ]
then
echo "存在"
else
echo "不存在"
fi


输出:存在

流程控制

if

代码结构
a="JAR"
b="逗你玩"
if [ $a = $b ]
then
echo "字符串a等于字符串b"
fi


“if else”语句

a="JAR"
b="逗你玩"
if [ $a = $b ]
then
echo "字符串a等于字符串b"
else
echo "字符串a不等于字符串b"
fi


if-else-if-else”

a="JAR"
b="逗你玩"
if [ $a = $b ]
then
echo "字符串a等于字符串b"
elif [ $a ]
then
echo "字符串a不为空"
else
echo "字符串a不等于字符串b"
fi


“for”循环语句

1.

for name in "JAR" "小白菜" "Andy" "雪夜"
do
echo ${name}
done


2.

names=("JAR" "小白菜" "Andy" "雪夜");
for name in ${names[*]};
do
echo ${name} 是一个;
done


3.读取文件列表

file="/Users/liyanjun/Desktop/*"
for filename in $file
do
echo $filename
done


输出文件下的列表文件

4.嵌套循环

for ((a=1;a<5;a++))
do

echo  a = $a
for (( i = 0; i < 10; i++ ));
do
echo i = $i
done

done


“while”循环

1.普通

while(($a<10))
do
echo ${a}
a=`expr $a + 1`
done


2.无限循环

while :
do
echo "1"    #statements
done


或者

while true
do
echo "1"    #statements
done


case语句

语法结构

语法结构

case 值 in

模式1)

代码

;;

模式2)

代码

;;

模式3)

代码

;;

sac

案例

umber=1
case $number in
1) echo "等于1"
;;
2) echo "等于2"
;;
3) echo "等于3"
;;
esac


for循环 跳出单个循环

for (( i = 0; i < 10; i++ ));
do
if [ $i == 5 ]
then
echo "退出循环"
break;
fi
done


for循环 跳出内部循环

for (( i = 0; i < 5; i++ ));
do
echo "外层循环的值是 ${i} "
for (( j = 0; j < 5; j++ )); do
echo "内层循环的值是 ${j}"
if [ ${j} == 2 ]
then
echo "退出内部循环"
break;
fi
done

done


for循环 跳出外部部循环

# for循环 跳出外部部循环

for (( i = 0; i < 5; i++ ));
do
echo "外层循环的值是 ${i} "
for (( j = 0; j < 5; j++ )); do
echo "内层循环的值是 ${j}"
if [ ${j} == 2 ]
then
echo "退出内部循环"
break 2 #退出的层数 2表示退出2层
fi
done

done
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell