文章目录
-
- 1. 脚本默认格式
- 2. 运行脚本
- 3. 局部变量提升为全局变量(不仅在当前)
- 4. 特殊参数
- 5. 数值运算
- 6. 命令替换(将运算的结果赋值给另外的参数)
- 7. 条件判断
- 9. case
- 10. for循环
- 11. for in循环
- 12. while循环
- 13. 读取控制台输入
- 14. 函数
- 15. crontab 定时任务处理
- 16. cut \awk文件内容处理
1. 脚本默认格式
#!/bin/bash
...
2. 运行脚本
chmod +x filename,./filename
bash +filename|sh +filename
--------以下命令不会开辟子shell,若对环境变量有改变,会直接影响当前shell-------
source +filename
. +filename
3. 局部变量提升为全局变量(不仅在当前) 【linux|Linux Shell编程】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列数
推荐阅读
- Vulnhub|vulnhub之darkhole_2
- go语言的学习|go语言常用命令和包管理
- linux|zabbix server 6.0安装(rancher+kubernetes部署)
- Linux|搭建Prometheus+Grafana的云平台监控系统
- BUG|vim 出现 Another program may be editing the same file. If this is the case 的解决方法
- Bash终端快捷键
- linux|NoSQL值Redis配置与优化
- Linux学习|Linux学习笔记——Shell编程概述
- 服务器|JetBrains全家桶(PyCharm/WebStorm/IntelliJIDEA) Deployment一键部署