函数
格式
函数格式一:
function 函数名 {
命令序列
}
函数格式二:
函数名() {
命令序列
}
调用函数格式一:直接调用
函数名
调用函数格式一:赋值再输出
result=`函数名`
echo "想要输出的结果"
返回值
- return表示退出函数并返回一个退出值,脚本中可以用 $ ? 变量显示该值
传参
#!/bin/bash
sum() {
s=$[$1 + $2]
echo $s
}
read -p "请输入第一个参数:" first
read -p "请输入第二个参数:" second
sum $first $second
变量作用范围
库
单引号与双引号
(1)单引号不取变量值
(2)双引号取变量值
(3)反引号,执行引号中命令
(4)双引号内部嵌套单引号,取出变量值
(5)单引号内部嵌套双引号,不取出变量值
IF
常见逻辑运算符
-f 判断文件是否存在 eg: if [ -f filename ];
-d 判断目录是否存在 eg: if [ -d dir ];
-eq 等于,应用于整型比较 equal;
-ne 不等于,应用于整型比较 not equal;
-lt 小于,应用于整型比较 letter;
-gt 大于,应用于整型比较 greater;
-le 小于或等于,应用于整型比较;
-ge 大于或等于,应用于整型比较;
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z 空字符串;
-x 是否具有可执行权限
|| 单方成立;
&& 双方都成立表达式。
For 循环
默认循环列表使用空格划分
使用 IFS 来指定循环列表的分割符
IFS=,
for item in value1,value2,value3
do
echo $item
done
案例
案例一:从其中一个文件读取内容,然后复制另一个文件到新文件,根据读取的内容修改新文件的内容
#!/bin/bash
while IFS= read -r line;
do
if [[ ! $line == "20."* ]]; then
mkdir "${line}"
else
cp 1.json "${line}.json"
sed -i "s/host/${line}/g" "${line}.json"
fi
done < 2.txt
案例二:获取Yarn单个任务的容器数量
#!/bin/bash
app_id=$(yarn app -list | egrep "${job_name}_[0-9]{4}-[0-9]{2}-[0-9]{2}" | awk '{print $1}')
attempt_id=$(yarn applicationattempt -list ${app_id} | tail -n 1 | awk '{print $1}')
core_size=$(yarn container -list ${attempt_id} |grep "number" |cut -d ":" -f 2)
EOF
[root@node1 ~]# cat >> /etc/hosts << EOF
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
EOF
[root@node1 ~]# for i in {12..13}
do
scp /etc/hosts 192.168.1.$i:/etc/hosts
done
Sed
- 在行首添加注释
sed 's/^/#/g ' 文件
- 替换多个内容
sed 's/a/b/g ; s/c/d/g' 文件
- 删除多行
sed -i -e 'n1d ; n2d' 文件