shell学习积累,循环,运算,判断
需要经常注意的问题
赋值不需要$,但读值必须不能忘了在变量前加上$
shift可以跳过参数,如shift 2,命令行输入aaa.sh a b c d 相当于命令行输入就变成aaa.sh c d
Shell 运算(+、-、\*、/)
expr 只对整数进行运算,且中间每一段都必须要用空格隔开
语法`expr integer1 + integer2`或者$(expr integer1 + integer2) 两个反引号``相当于$()
let 数学运算
语法let “ckx=5+2”
(())同let运算
语法 ((ckx=5+2))
$[] 运算
语法 ckx=$[1+1]
bc浮点数运算
[[email protected] ~]# ckx=$(echo 5.5+2|bc)
[[email protected] ~]# echo $ckx
7.5
[[email protected] ~]# echo $(echo "scale=2; 5.5 / 2"|bc)
2.75
scale=x;代表保留几位小数
awk浮点数运算
[[email protected] ~]# awk 'BEGIN{printf "%f\n",('$ckx' / 2)}'
2.750000
[[email protected] ~]# awk 'BEGIN{printf "%f\n",(5.5 / 2)}'
2.750000
Shell 流程控制(+、-、\*、/)
If语句
注意if后有空格,[ ]里每段都要有空格
test判断语句
语法 test expression 或者 [ expression ]
常用判断
-d 是否为目录 -e 是否为文件 -f 是否为普通文件 -r 是否可读 -w 是否可写 -x 是否可执行 -z 是否为空 -n 是否不为空
注:经常看到类似 if [[ $ckx = $ckx2 ]]双中括号语句,是为了防止没有值的情况程序不能继续运行,如果没有赋值,这个语句为假,程序会继续往下运行。
case语句
语法
case word in
模式) 声明;;
esac
while循环语句
语法:
while [ test ] ;do
.....
done
注:循环语句中使用timeout命令可以防止死循环,用法 timeout 秒数 命令
for 循环语句
语法:
for 变量 in ... ;do
...
done
能够遍历in后面的所有数据
自定义函数
语法
函数名()
{
...
}
注:[email protected]是列出所有输入参数 $#是代表参数个数
两种按行读取文本的方法
printf格式化输出
小技巧:
1、sh -x 文件名可以看到每个命令的运行步骤和结果
2、包含其他shell文本或其他文件,在#!/bin/sh下面用 . 文件路径 或者 source 文件路径即可包含进来