文章目录
1. 脚本默认格式
#!/bin/bash
...
2. 运行脚本
chmod +x filename , ./filename
bash +filename | sh +filename
--------以下命令不会开辟子shell,若对环境变量有改变,会直接影响当前shell-------
source +filename
. +filename
3. 局部变量提升为全局变量(不仅在当前)
export var_name
在父shell中声明的全局变量可以被子shell查看,而子shell中对全局变量的修改只能由其子shell所见(父shell不可见)。
4. 特殊参数
$0 脚本名称
$1~$9:第1个参数至第9个参数
$#:当前输入参数的个数
∗
将
参
数
当
做
字
符
串
,
* 将参数当做字符串,
∗将参数当做字符串,@将参数当成数组
$? 获取最后一次脚本执行结果(0成功,127未找到命令)
∗
与
*与
∗与?需要被“”包围不然没有区别
5. 数值运算
$[3*2]
6. 命令替换(将运算的结果赋值给另外的参数)
a=$(expr 5 *2)
a=`expr 5 *2`
7. 条件判断
字符串比较 [ $a=apple ] 若执行成功返回0,失败返回1
数字比较 [ 2 -et 3 ] [ 2 -lt 3 ] [ 2 -lt 3 ]
判断是否有权限 [ -r filename ] [ -w filename ] [ -x… ]
文件类型判断 是否存在:-e 存在且是普通文件:-f 是目录:-d
if [ condition ]
then ...
elif [ condition ]
then ...
else ...
fi
字符串判断技巧(防止输入的字符串为空,拼接一个x)
if [ "$1"x="target"x]; then …
9. case
case $1 in
"result1")
...
;;
"result2")
...
;;
"*")
...
;;
esac
10. for循环
for (( i=0;i<10;i++ ))
do ...
done
11. for in循环
for i in {1..100} #1~100的序列
do ...
done
12. while循环
while [ condition ]
do let a+=1 #let a+=1 等价于 a=$[$a+1]
done
13. 读取控制台输入
read -t 7 -p “Enter your name in 7 seconds:” Name
echo $name
14. 函数
- basename [filepath] [suffix]: 得到filepath的最终文件名,并去除suffix后缀
basename /etc/file.sh .sh
file
脚本中调用: $(basename $1 .sh)
- dirname [filepath] :获取相对路径
#获取绝对路径
cd $(dirname $0)
pwd
- 自定义函数:
[function] funcname [()]
{
action;
[return int;] #只能返回数字(0-255) 由$?获取
}
举例:
function add(){
echo $[$1+$2]
}
add 1 2 #调用
sum=$(add 1 2) #用命令替换配合echo可以完成255以上的返回值
15. crontab 定时任务处理
crontab -l 查询定时任务
crontab -e 设立定时任务
16. cut \awk文件内容处理
cut -d " " -f 1 aa.txt #从aa.txt中以' '为分隔符提取第一列
cut -d " " -f 2,3 aa.txt #提起第2,3列
#awk -v 可以引入自定义变量
awk -F " " -v i=1 '/Pattern/{action}' 以' '分割,以Pattern正则表达式进行匹配之后,做action操作。
例如要提取以下的用户名.家目录.bash所在地址
cat /etc/passwd | grep bash | cut -d ":" -f 1,6,7
#awk实现 (awk可以同时分割行与列,cut只能分割列)
#结果以,进行分割 cut做不到
cat /etc/passwd | awk -F ":" '/bash$/{print $1 "," $6 "," $7}'
#在之前打印a,最后打印b
cat /etc/passwd | awk -F ":" 'BEGIN{print a} {print $1 $6 $7} END{print b}'
awk内置变量: FILENAME文件名 NR行号 NF列数