三.shell脚本语言
2019-12-21 本文已影响0人
木子心语
命令状态
命令状态.pngshell脚本语言-echo命令?
- 显示普通字符串
echo "iPhoneX 标配 8388"
- 显示转义字符
echo "iPhoneX 顶配 9688"
- 显示变量
iphone="iPhoneX"
echo "${iphone}9688"
- 显示换行
错误写法
echo "iPhoneX\nhello 未来"
正确写法(-e:表示开启转义功能)
echo -e "iPhoneX\nhello未来"
*不换行
#换行
#echo "iPhoneX hello未来"
#echo "科技"
#不换行
#echo -e "iPhoneX hello未来 \c"
#echo "科技"
- 显示一个执行命令
#要求:输出当前时间
#echo `date`
- 退出命令
#语法:exit状态
#写法一
#iphone="404报错,买了一台iPhoneX,非常不好,出bug"
#echo ${iphone}
#exit
#echo "哈哈"
#写法二
#iphone="404找不到错误"
#echo ${iphone}
#exit 0
Shell脚本语言-数组?
1.语法
数组名=(值1 值2 值3 ...)
2.初始化数组
#方式一
#name=("404" "hello" "hi" "lk")
#输出
#echo $name
方式二
#name=()
#name[0]="404"
#name[1]="hello"
#name[2]="hi"
#name[4]="lk"
#echo ${name[0]} ${name[1]}
3.读取数组
#语法结构:${数组名[下标]}
#name=("404" "hello" "hi" "lk")
#输出一个元素
#echo ${name[0]}
#输出所有->"@"和"*"表示输出所有的数据
#总结:"@"和"*"区别
#"@"->输出结果:"404" "hello" "hi" "lk"
#"*"->输出结果:"404 hello hi lk"
#echo ${name[*]}
#echo ${name[@]}
4.数组长度
#方式一:获取数组元素个数
#@语法:${#数组名[@]}
#代码:
#name=("404" "hello" "hi" "lk")
#echo ${#name[@]}
#结果:4
#方式二:获取数组元素个数
#语法:${#数组名[*]}
#代码:
#name=("404" "hello" "hi" "lk")
#echo ${#name[*]}
#结果: 4
#方式三:获取单个元素->字符长度
#语法:${#数组名[下标]}
#代码:
#name=("404" "hello" "hi" "lk")
#echo ${#name[2]}
#结果:2
Shell脚本语言-传递参数?
1.语法定义?
./文件名称.sh 参数1 参数2 参数3...
2.案例
#脚本内容如下:
#${0}->表示文件名称
#${1}->表示参数1
#${2}->表示参数2
#echo ${0} ${1} ${2}
#执行脚本代码
#./hello.sh "hello" "hi"
3.特殊字符
#3.1 $#:获得脚本输入参数个数
#脚本内容如下:
#echo ${#}
#执行脚本代码:
#./hello.sh "hello""hi"
#执行脚本结果: 2
3.2 "$*"和"$@":显示整个脚本输入参数列表
#脚本内容如下:
#echo ${*}
#./hello.sh "hello" "hi" "你好"
#执行脚本结果: "hello hi 你好"
Shell脚本语言-基本运算符?
- 算数运算符
1.1 "+"运算
#注意:"expr"规定命令
#a=8388
#b=9688
#c=`expr $a + $b`
#echo "c的值: $c"
#结果->c的值: 18076
1.2 "-"运算
#注意: "expr"规定命令
#a=8388
#b=9688
#c=`expr $a - $b`
#echo "c的值: $c"
1.3 "*"运算
#注意: "expr"规定命令
#注意: 乘法运算记得加一个"\*"转义字符
#a=8388
#b=9688
#c=`expr $a \* $b`
#echo "c的值: $c"
1.4 "/"运算
#注意: "expr"规定命令
#a=8388
#b=9688
#c=`expr $a / $b`
#echo "c的值:$c"
1.5 "%"运算
#注意: "expr"规定命令
#a=9688
#b=8388
#c=`expr $a % $b`
#echo "c的值: $c"
1.6 "="运算
#注意: "expr"规定命令
#a=8388
#b=$a
#echo "b的值: $b"
1.7 "=="运算
#注意: "expr"规定命令
#a=8388
#b=9688
#if [ $a == $b ]
#then
#echo "a等于b"
#else
#echo "a不等于b"
#fi
- 关系运算符
2.1 "-eq":检测两个数是否相等,相等返回true
#a=100
#b=200
#if [ $a -eq $b ]
#then
#echo "a等于b"
#else
#echo "a不等于b"
#fi
2.2 "-ne":检测两个数是否相等,不相等返回true
#a=100
#b=200
#if [ $a -ne $b ]
#then
#echo "a不等于b"
#else
#echo "a等于b"
#fi
2.3 "-gt":检测左边数是否大于右边数,如果是,返回ture
#a=100
#b=200
#if [ $a -gt $b ]
#then
#echo "a大于b"
#else
#echo "a小于b"
#fi
2.4 "-lt":检测左边数是否大于右边数,如果是,返回true
#a=100
#b=200
#if [ $a -lt $b ]
#then
#echo "a小于b"
#else
#echo "a大于b"
#fi
2.5 "-ge":检测左边数是否(大于+等于)右边数,如果是,返回true
#a=200
#b=200
#if [ $a -ge $b ]
#then
#echo "a大于等于b"
#else
#echo "a小于b"
#fi
2.6 "-le":检测左边数是否(小于+等于)右边数,如果是,返回true
#a=100
#b=200
#if [ $a -le $b ]
#then
#echo "a小于等于b"
#else
#echo "a大于b"
#fi
- 布尔值运算符
3.1 "!":非运算,表达式为true,返回true,否则返回false
#a=100
#b=200
#if [ $a != $b ]
#then
#echo "a不等于b"
#fi
3.2 "-o":或运算,有一个表达式为true,则返回true
#a=100
#b=200
#if [ $a -lt 200 -o $b -gt 200 ]
#then
#echo "成立"
#fi
3.3 "-a":与运算,两个表达式为true,则返回true
#a=100
#b=200
#if [ $a -lt 200 -a $b -gt 200 ]
#then
#echo "成立"
#else
#echo "不成立"
#fi
- 逻辑运算符
4.1 "&&":逻辑且->and
#a=100
#b=200
#if [ $a -lt 200 ] && [ $b -gt 200 ]
#then
#echo "成立"
#else
#echo "不成立"
#fi
4.2 "||":逻辑 OR
#a=100
#b=200
#if [ $a -lt 200 ] || [ $b -gt 200 ]
#then
#echo "成立"
#else
#echo "不成立"
#fi
- 字符串运算
5.1 "=":检测两个字符串是否相等,如果相等返回true
#a="JAR"
#b="JAR"
#if [ $a = $b ]
#then
#echo "字符串a等于字符串b"
#else
#echo "字符串a不等于字符串b"
#fi
5.2 "!=": 检测两个字符串是否相等,如果不相等返回true
#a="JAR"
#b="JAR1"
#if [ $a != $b ]
#then
#echo "字符串a不等于字符串b"
#else
#echo "字符串a等于字符串b"
#fi
5.3 "-z":检测字符串长度是否为0,如果是返回true
#a="JAR"
#if [ -z $a ]
#then
#echo "a为空,不存在"
#else
#echo "a存在值"
#fi
5.4 "-n":检测字符串长度是否为0,如果不是0,返回true
a="JAR"
if [ -n $a ]
then
echo "a存在"
else
echo "a不存在值"
fi
5.5 "字符串": 检测字符串是否为空,不为空返回true
#a=""
#if [ $a ]
#then
#echo "a不为空"
#else
#echo "a为空"
#fi
- 文件测试运算符
file="/Users/mac/Desktop/hello.sh"
##6.1 "-d file":检测文件是不是一个目录,如果是,那么返回true
#if [ -d $file ]
#then
#echo "是一个目录"
#else
#echo "不是一个目录"
#fi
6.2 "-r file": 检测文件是否可读,如果是,那么返回true
#if [ -r $file ]
#then
#echo "可读"
#else
#echo "不可读"
#fi
6.3 "-w file": 检测文件是否可写,如果是,那么返回true
#if [ -w $file ]
#then
#echo "可写"
#else
#echo "不可写"
#fi
6.4 "-x file": 检测文件是否是可执行文件,如果是,那么返回true
#if [ -x $file ]
#then
#echo "可执行"
#else
#echo "不可执行"
#fi
6.5 "-f file":检测文件是否是一个普通文件(既不是目录,也不是设备文件),如果是,那么返回true
#if [ -f $file ]
#then
#echo "文件为普通文件"
#else
#echo "文件为特殊文件"
#fi
6.6 "-s file":检测文件是否为空(文件有内容),如果是,那么返回true
#if [ -s $file ]
#then
#echo "文件有内容"
#else
#echo "文件没有内容"
#fi
6.7 "-e file": 检测文件是否存在(包含了:目录和文件),如果是,那么返回true
#if [ -e $file ]
#then
#echo "存在"
#else
#echo "不存在"
#fi
Shell脚本语言-流程控制
- for循环语句
#语法结构
#for 变量名 in item1 item2 item3 ...
#do
#代码
#done
#代码案例一:读取简单的值
#for name in "hello" "hi" "nihao" "lk"
#do
#echo ${name}
#done
#代码案例二:读取列表复杂值(特殊字符)
#错误代码
#for name in "I don`t know"
#do
#echo ${name}
#done
#正确代码
#for name in I don\`t know
#do
#echo ${name}
#done
#代码案例三:从变量读取列表
#val="I don\`t know"
#for name in ${val}
#do
#echo ${name}
#done
#代码案例四: 读取目录->通配符
#file="/Users/daichichinpou/Desktop/*"
#for name in ${file}
#do
# echo $name
#done
#代码案例五2:嵌套循环(类似于C语言写法)
#for ((a=1;a<5;a++))
#do
#echo ${a}
#done
#for (( a=1; a<5;a++))
#do
# echo ${a}
# for ((b=1;b<5;b++))
# do
# echo ${b}
# done
#done
- while循环
#语法结构
#while(条件)
#do
# 代码
#done
#代码案例一:基本循环
#a=1
#while(($a<10))
#do
# echo ${a}
# a=`expr $a + 1`
#done
#代码案例二:无限循环
#while :
#do
#echo "Hello"
#done
#while true
#do
#echo "Hello"
#done
#for((;;))
#do
# echo "Hello"
#done
- case语句
#语法结构
#case 值 in
#模式1)
#代码
#;;
#模式2)
#代码
#;;
#模式3)
#代码
#;;
#esac
#代码案例一
number=1
case $number in
1)
echo "等于1"
;;
2)
echo "等于2"
;;
3)
echo "等于3"
;;
esac
- until循环
#语法结构
until 条件
do
逻辑代码
done
#脚本代码
i=1
until (( $i > 1 ))
do
echo "i小于等于1"
done
until循环.png
跳出循环
- 跳出单个循环
for(( i=0; i < 10;i++ ))
do
echo "当前i的值:${i}"
if [ $i -eq 5 ]
then
echo "退出循环"
break
fi
done
跳出单个循环.png
*跳出内部循环
for (( i=0;i<5;i++))
do
echo "外层循环值:${i}"
for (( j=0; j< 5;j++))
do
echo "内层循环j值:${j}"
if [ $[j] -eq 2]
then
echo "退出内层循环,执行下一个操作"
break
fi
done
done
跳出内部循环.png
- 跳出外部循环
for (( i= 0;i<5:i++))
do
echo "外层循环i值:${i}"
for (( j=0 : j < 5: j++))
do
echo "内层循环j值:${j}"
if [ ${j} -eq 2 ]
then
echo "退出内层循环,执行下一个循环"
break 2
fi
done
done
break.png
在这里值得注意的是:当break 0 的时候,会报如下错误.循环超出了范围.
break_0.png
因为我们这里的循环有两处.所以至少break 1 ,跳出1次循环,当大于循环的次数(比如: break 100),仍然只跳出本身循环地最高次数(2次).
跳出外部循环.png- 跳出循环->continue
for (( i=0;i<5;i++))
do
if [ ${i} -eq 2 ]
then
echo "下一个"
continue
else
echo "外层循环i值:${i}"
fi
done
跳出循环->continue.png