shell脚本
shell脚本执行
- chmod +x xx.sh ;./xx.sh
- 注意点:最好使用第一种
注释
:代表单行注释
shell脚本是一个弱类型的语言
- 不需要指定数据类型
- 如果变量没有定义,那么这变量默认为空
- 如果shell脚本文件某一行出错,不会影响我整个程序的运行
标识符的命名规范
- 硬件规范
- 不能数字开头
- 只能由字母,下划线,数字构成
- 不能与shell脚本的关键字相同if printf echo case等
- 建议:
- 不准用拼音,多查字典
- 建议使用驼峰命名规范numOfStudent
- 见名知义
变量的定义
- 变量=值
- 注意点:变量一定义出来,就必须给他一个值,否则语法错误
- =号左右两边不能有空格
- 如果右边是字符串,用""括起来
- 变量的使用
- 以$符号开头
echo简单用法
- echo:表明输出命令,输出echo后面的内容,会自动换行
- echo后面是否加"",'',不加;
- 加''里面写什么输出什么;例如value="hello"
echo '$value';输出结果是$value- 不加;降低程的可读性
- 加"";能避免上面两个缺点
- value="hello"
echo "{$value}1"
加{},不是(),为了分清变量
shell转义字符
- \n:代表换行
- \t:相当于敲了一个tab键的宽度
echo -e开启转义
- 如果是./xx.sh运行shell脚本,必须开启转义; value="hello"
echo "$value\n"是不会换行- 开启转义对特殊字符进行处理
echo -e "${value}\n"- 如果是sh xx.sh运行shell脚本,不需要开启转义
value="hello"
echo "${value}\n"是会换行的
变量的删除
- unset:unset 删除变量,不需要加$例如
value=9
echo "$value1"
unset value1
echo "value1"
输出为:9空
unset删除变量,删除的变量默认为空
只读变量
- readonly value=7,表明这个变量将来不能被重新赋值
- readonly修饰的变量不能被unset删除
字符串相关处理方法
- 计算字符串长度
value="hello"
length=${#value}
echo "${length}"
- 字符串拼接
value1="hello"
value2="world"
value3="${value1} ${value2}"
echo "${value3}"
3.字符串截取
value1="hello world"
value2=${value1:6:5}
#字符串从0开始,:6代表从0开始数到第6位开始裁,:5为截取的长度
printf
value="hello"
printf "value=%s\n"
"${value}"
- 用法:printf是输出""里面的内容;
%s:是一个占位符,严格意义上来说是输出字符串类型的- %f:是一个占位符,后面必须是小数类型的数值占位
- %d:是一个占位符,后面必须是整数类型的数值占位
- %c:是一个占位符,后面必须是字符类型的数值占位
- \n:转义字符
- 如果想用printf同时输出多个变量的值
value="hello"
value1=8
printf "value=%s\nvalue1=%d\n" "${value}" "${value1}"
- %.3f:表明小数点后面保留3位
- %6.3f:6表明整个数据所占宽度为6个字
- %m.nf:右对齐
- 如果m<=n+1+整数实际所占个数,m无效
- 如果m>n+1+整数实际所占个数,m才会出现一定的效果
- %-m.nf:左对齐
- %md:
- %ms:
- %mc:
read
printf "请输入一个值"
read value
printf "这个值为%s\n" "${value}"
- 用法:键读入一个值,赋给read
- 注意:read尽量不要使用同时输入多个值,比如read value1 value2
运算符
- 算数运算+ - * / %
- 注意点:expr是计算整数类型行的数据
- 运算符左右两边都必须要有空格
- ``和$()都是取结果集
- 注意乘法*必须要通过转义*,不然出错
num1=1
num2=2
num3=`expr $num1 \* $num2`
echo "${num3}"
num1=1
num2=2
num3=`expr $num1 + $num2`
echo "${num3}"
- `` 和$()不但可以取整数运算的结果集,还可以去shell命令结果集,比如:result=$(ls),但是两者后都要有expr
- num1%num2求num1/num2=商……余
num1=1
num2=2
num3=$(expr $num1 % $num2)
echo "${num3}"
- !:表示取反
echo "请输入一个数:"
read num
if [ ! $num -gt 8 ]
then
echo "<=8"
else
echo ">8"
fi
- &&:表示并且
- 第一种写法
echo "请输入一个数:\n"
read num
if [ `expr $num % 5` == 0 ]&&[ `expr $num % 3`==0 ]
then
echo "这是3,5的倍数"
else
echo "这不是3,5的倍数"
fi
- 用法:事件1&&事件2:事件1成立并且事件2成立,整个事件才成立,否则整个事件不成立
- 事件1||事件2:两个事件只要有一个事件成立,整个事件就成立
- 第二种写法
echo "请输入一个数:\n"
read num
if [[ `expr $num % 5` == 0 && `expr $num % 3`==0 ]]
then
echo "这是3,5的倍数"
else
echo "这不是3,5的倍数"
fi
- 第三种用法
printf "请输入一个年份:\n"
read year
if [ `expr $year % 4` == 0 -a `expr $year % 100` != 0 ] || [ `expr $year % 400` == 0 ]
then
echo "是闰年"
else
echo "不是闰年"
fi
- ||:表示或者
printf "请输入一个年份:\n"
read year
if [[ `expr $year % 4` == 0 && `expr $year % 100` != 0 ]] || [ `expr $year % 400` == 0 ]
then
echo "是闰年"
else
echo "不是闰年"
fi
let关键字
- 注意点:用了let之后 , let num3=$num1+$num2是错误的,let num3=num1+num2才是正确的
num1=1
num2=2
let num3=num1+num2
echo "${num3}"
用在哪些的运算符:
- 算数运算符:+ - * / % ++ --
- 赋值运算符:+= -= *= /= %=
- 后缀++
num1=1
let num3=num1++
echo "${num3}"
echo "${num1}"
- 结果为:1 2
- 前缀++
num1=1
let num3=++num1
echo "${num3}"
echo "${num1}"
- 结果为:2 2
- 后缀--
num1=1
let num3=num1--
echo "${num3}"
echo "${num1}"
- 结果为:1 0
- 前缀--
num1=1
let num3=--num1
echo "${num3}"
echo "${num1}"
- 结果为: 0 0
整数之间的关系运算符
- < > >= <= != ==
- 在关系运算符中,运算的结果是一个逻辑值,如果关系表达式成立,逻辑值为1;否则为0
- <, > ,>= ,<=都必要用\进行转义
- !=可以用\进行转义,也可不用\转义
num1=1
num2=2
num3=`expr $num1 != $num2`
echo "${num3}"
- 结果为1
- = ,\ =,\ ==, ==(根据编译器决定)maco0s支持=,\ =
条件语句
- 如果一个数大于5,然后输出这个数,否则 如果这个数小于五,然后说明这个数小5
if[]
then
语句体;
fi
- 注意点:[]左右两边都要有空格
- 关系运算符用-gt...表示
printf "请输入一个数"
read num
if [ $num -gt 5 ]
then
echo "${num}"
fi
- -gt:>
- -ge:>=
- -lt:<
- -le:<=
- -eq:==
- -ne:!=
- 字母含义
- g:greater
- t:then
- e:equal
- n:not
if []
then
语句体1
elif []
then
语句体
fi
if []
then
语句体1
elif []
then
语句体2
else
语句3
fi
- 注意点:else可以没有,如果有else,必须放在最后面,else下是没有then
- elif可以没有,必须放在if else中间任何位置
- if语句只能执行一个分支
- if的结束标志fi
字符串运算符
- =判断字符串是否相等
- !=判断字符串是否不相等
- -z:zero,判断字符串是否为空(没有字符)或着是不存在或者字符都是空格
printf "请输入两个整数:"
read num1
read num2
if [ $num1 -gt $num2 ]
then
printf "最大值为%s\n" "${num1}"
else
printf "最大值为%s\n" "${num2}"
fi
string1="hello"
if [ -z $string1 ]
then
echo "字符串为空"
else
echo "字符串不为空"
fi
- 结果为不为空
文件运算符
- -d:表示判断是否是目录文件
- -f:表示判断是否是普通文件
- -r:判断文件是否可读
- -w:判断文件是否可写
- -x:判断文件是否可执行
- -e:判断文件是否存在
file="1.sh"
if [ -d $file ]
then
echo "目录文件"
else
echo "不是目录文件"
fi
结果是:不是目录文件
file="1.sh"
if [ -f $file ]
then
echo "是普通文件"
else
echo "不是普通文件"
fi
- 结果为普通文件
file="11"
if [ -f $file ]
then
echo "是普通文件"
else
echo "不是普通文件"
fi
- 结果为不是普通文件
file="1.sh"
if [ -e $file ]
then
echo "存在"
else
echo "不存在"
fi
- 结果为存在
file="share"
if [ -e $file ]
then
echo "已存在这个目录文件"
else
cd
mkdir "share"
fi
case
case 变量 in
值1))
语句体
;;
值2))
语句体
;;
esac
echo "请输入一个值"
read num
case $num in
1)
echo "1"
;;
2)
echo "2"
;;
*)
echo "其他"
esac
- 注意点:结束标志必须是esac
- 值1)和值2)可以相同
- 如果值1)和值2)条件都不满足,这是会来到*)
- *) 你可以不写,但是如果要写就写在最后
- 没一个分支结束之后都有一个 ;;
数组
- 数组初始化:一个变量一个变进行初始化
array1[0]=8
array1[1]=9
- 注意点:一个一个变量进行初始化,可以间隔赋值还可以不从位置0开始.比如
array1[1]=7
array1[5]=8
- 整体数组赋值
- array={1 2 3 4 hello}
- 数组元素访问
- ${数组名[下标]}
- 遍历数组名里面所有的元素
- ${数组命[*]
- ${数组名[@]}
while循环
while []
do
语句体
done
sum=0
i=1
while [ $i -le 100 ]
do
let sum=sum+i
let i++
done
echo "sum=${sum}"
- sum为5050,i为101
- 求1~100的偶数和
sum=0
i=1
while [ $i -le 100 ]
do
if [ `expr $i % 2` -eq 0 ]
then
let sum=sum+i
fi
let i++
done
echo "sum=${sum}"
- 结果为sum=2550
- 练习2:9x9乘法表
i=1
j=1
while [ $i -lt 10 ]
do
j=1
while [ $j -le $i ]
do
let k=i*j
printf "%d*%d=%2d " "${i}" "${j}" "${k}"
let j++
done
printf "\n"
let i++
done
- 练习3:输入两个整数和一个运算符,根据运算符计算结果
printf "请输入两个整数:"
printf "请输入运算符:"
read num1
read num2
read ch
case $ch in
"*")
printf "%d*%d=%d" "${num1}" "${num2}" "$((num1*num2))"
;;
"/")
printf "%d/%d=%d" "${num1}" "${num2}" "$((num1/num2))"
;;
"+")
printf "%d+%d=%d" "${num1}" "${num2}" "$((num1+num2))"
;;
"-")
printf "%d-%d=%d" "${num1}" "${num2}" "$((num1-num2))"
;;
*)
printf "其他字符\n"
esac
参数
- ./xx.sh
- $0:代表执行的文件./xx.sh
- $1:代表执行的第一个参数
- $2:代表执行的第二参数
- $n:代表执行的第二个参数
- $#:代表执行参数个数,不包括命令本身
- 判断是否有参数,参数是否为1
- 判断文件是否存在
- 如果存在,判断文件是否是普通文件
- 改权限
4.运行- 让这个命令在全局有效
for循环
- 格式
for 变量 in 参数列表
do
done
- 用法解释:参数列表为变量一次一次的赋值
value=`ls`
for file in $value
do
echo "${file}"
done
for value in 1 2 3 4 5
do
echo "${value}"
done
break
- break:是跳出整个循环
i=1
sum=0
while [ $i -le 100 ]
do
if [ $sum -gt 55 ]
then
break
fi
let sum+=i
let i++
done
echo "sum=${sum}"
echo "i=${i}"
- 结果为:sum=66,i=12
- 分析:当i=11,sum>55,不成立sum=55
sum=sum+i,sum=55+11 ,i=12
- 用法:当碰到break时,直接跳出循环,break下面的语句不会被执行
- break只跳出最近的一循环
- break只能用在循环中
count=0
while [ $count -le 1 ]
do
i=1
sum=0
while [ $i -le 100 ]
do
if [ $sum -gt 55 ]
then
break
fi
let sum+=i
let i++
done
let count++
echo "sum=${sum}"
echo "i=${i}"
done
- 结果为 sum=66,i=12;sum=66,i=12
continue
i=1
sum=0
while [ $i -le 20 ]
do
if [ `expr $i % 10 ` == 3 ]
then
let i++
continue
fi
let sum+=i
let i++
done
echo "sum=${sum}"
- 分析:i=3时,i条件成立,执行continue,那么continue以下的语句就不被执行,继续返回到while判断的语句看条件是否成立,如果成立继续执行
- 用法:当碰到continue时,跳出本层循环的当前一次循环continue以下面的语句不会被执行
- continue只能用循环中