bash 是解释器 编辑器 #!/bin/bash 类似于 #!/usr/bin/python 指出解释器的位置 #!/bin/awk -f 解释awk语句可以
重定向 IO
程序都有io 0 标准输入 1 正确输出 2 错误输出
ls / /hello 1>right.log 2>err.log ls命令的正确输出 输出到right.log下 错误输出到err.log下
ls / /hello &>log.log 正确错误全部输出到log.log下 ls / /hello 1>log.log 2>&1
将用户控制台的输入赋值给a变量 read a 控制台输入字符串 echo $a 获取到控制台输入
read a 0<<<"hello" 将hello重定向到字符串 read a 0<<MYEOF 重新定向到多行文本
0<将标准输入重新定向到文本文件 cat 0</etc/passwd
$# 参数个数 $@参数列表“a” “b” “c” "d" $*参数列表"a b c d "
echo $1 echo ${11} $表示指向
数组
arr=(a b c) echo ${arr[1]} echo ${arr[*]} echo ${arr[@]}
`` 反引号 提升反引号内的优先级 ""弱引用,会先算出""内的 ''单引号 强引用 直接输出
echo "\"a\""
echo $? 判断上一步的退出状态 0是对 其他错
a&&b a对的情况下执行b
a||b a错的情况下执行b
算术表达式((a++))
案例 1 :
- 添加用户 useradd <username>
- 用户密码同用户名 passwd --stdin <username> 0<<<"username"
- 静默运行脚本
- 避免捕获用户接口
- 程序自定义输出
#!/bin/bash
if [ $# -ne 1 ] && echo "args wrong!" && exit 2 参数个数不是1个 参数错误 退出名字2 因为2退出的 标记作用
id $1 &>/dev/null && echo "user exists!" && exit 3 id 是否已经存在 输出信息到黑洞文件
useradd $1
passwd --stdin $1 0<<<$1 &>/dev/null 获取重定向输入
echo "user added"
案例 2 :
- 用户给定路径
- 输出文件大小最大的文件 du -a /etc | sort -nr
- 递归子目录
#!/bin/bash
oldIFS = $IFS 修改分隔符 默认是空格 \t \n 将for循环能获得一行数据
IFS=$'\n'
for item in `du -a $1 |sort -nr `; do
fileName = `echo $item |awk '{print $2}'`
if [ -f $fileName ]; then
echo $fileName
flag=1
break
fi
done
IFS=$oldIFS #用完后重置IFS变量的值。
案例3
循环遍历文件每一行:流程控制语句 IFS
- 定义一个计数器
- 打印num正好是文件行数
#!/bin/bash
num=0
oldIFS = $IFS
IFS = $'\n'
for iten in `cat $1`;do 遍历每一行
echo $item
((num++))
done
echo "line number is :$num"
IFS=$oldIFS
方法二 通过read标准输入重定向
#!/bin/bash
num=0
while read line; do read读取按行分割
echo $line 打印一行
((num++)) 计数器+1行
done < $1 将文件重定向输入到 while里去
echo "line number is :$num"