Shell
#!/usr/bin/bash 解释器
echo 输出
echo ${name :其实位置:步长}
read -p "提示" val 输入
var_Name = var_Value 定义变量
$var 使用变量
a=123,a="$a"456 必加"",append值
unset var 取消定义
""是强引用 , ''是弱应用 , ``是优先执行
chmod +x a.sh 赋予权限
expr 1 + 2 或 expr $n1 + $n2 或 $((表达式)) 或 $[表达式] 或 let i++ 整数运算
sudo apt install bc 计算器
echo scale=小数点个数;表达式 | bc 计算小数点
export 环境变量
pstree 进程树
env 查看环境变量
/etc/profile ~/.bash_profile 系统变量 与 用户变量
echo "ubuntu" | useradd --stdin 标准输入到第二个命令
${#val} 字符长度
位置变量
| 命令 | 参数 1 | 参数 2 | 参数 3 | 参数 4 |
|---|---|---|---|---|
| $0 | $1 | $2 | $3 | $4 |
预定义变量
| 变量 | 含义 |
|---|---|
| $0 | 程序名字 |
| $* | 所有参数 |
| $# | 参数个数 |
| $? | 上一个程序的返回值 |
| $$ | 程序PID |
[ num1 -gt/-lt/-eq/ne/-ge/le num2] 数值测试
[ -f filename ] 文件测试

[ "s1" =/!= "s2" ] / [ -z/-n "s"] 字符串比较 字符串长度
[ -a/-r ] [ ||/&& ] 多个条件and/or
# if用法
if [ 条件 ] / 命令 ;then
fi
if [ 条件 ] / 命令
then
符合执行
elif 条件测试1
then
符合条件测试1执行
elif 条件测试2
then
符合条件测试2执行
else
不符合执行
fi
# case用法
case val in
yes|YES|Yes) #模式一
# 命令一
;;
no|NO|No) #模式二
# 命令二
;;
*) # 无对应
# 无对应命令
;;
esac #结束
# 输出指定内容
cat <<-EOF # -支持tab键
文本内容
EOF
# for循环
for i in `seq 10`
for i in $(seq 1 10)
for i in {1..10}
do
命令
done
# 免密登录
ssh-keygen
ssh-copy-ip ip地址
# while循环
while 条件测试 :是true
do
命令
done
# until循环, 假时执行
until 条件测试
do
命令
done
expect 使用:
vim a.exp
#!/usr/bin/expect
spawn 命令
expect { # 出现的关键词
"yes/no" {send "yes\r"; expect_continue} # expect_continue 没出现就跳过 \r回车
"password" {send "666666\r"}
}
interact # 不退出
######
# 执行
expect a.exp
#######################################
vim a.sh
#!/usr/bin/bash
rpm -q expect &> /dev/null
if [ $? -ne 0 ]
then
sudo yum install -y expect
fi
set timeout 10
/usr/bin/expect <<-EOF
spawn 命令
expect {
"yes/no" {send "yes\r"; expect_continue}
"password" {send "666666\r"}
}
expect eof # 终止对话
<<EOF
######
# 执行
bash a.sh
sh -n 脚本 检查脚本语法
sh -vx 脚本 调试脚本
数组 :
array=(1 2 3 "允许 空格")
array=(`cat /etc/passwd`) # 每一行
array=(1 2 3 [20]=指定下标下一个是21)
array[小标]=value # 修改特定值
echo ${array[index]} # 访问
echo ${array[*]} # 全部访问 或者是@
echo ${#array[*]} # 统计个数
echo ${!array[*]} # 查看索引
echo ${array[*]:} # 起始位置
# for 循环输出数组
for i in ${!array[*]}
do
echo "array[$i] = ${array[$i]}"
done
关联数组(map) :
declare -A map
map[ind1]=val1
map[ind2]=val2
map[ind3]=val3
map=([ind1]=val [ind2]=val2 [ind3]=val3)
array[小标]=value # 修改特定值
echo ${array[index]} # 访问
echo ${array[*]} # 全部访问 或者是@
echo ${#array[*]} # 统计个数
echo ${!array[*]} # 查看索引
echo ${array[*]:} # 起始位置
# 读取文件
while read line # 读取每行
do
echo $line
done < filename # < filename 是给 while的
IFS=$'\n' 自定义分割符
函数:
name() {
}
function name {
}
正则表达式RE :
| 符合 | 意思 |
|---|---|
| ^ | 行首 |
| $ | 行尾 |
| . | 任意单字符 |
| * | 前导符0次到多次(abc* 可显示 ab) |
| .* | 任意多字符 |
| [] | 范围字符 [lL]ove |
| [^] | 反范围字符 [^lL]ove |
| [-] | 连续范围字符 [0-9]ove |
| \ | 转义符 |
| < | 词首定位符 |
| > | 词尾定位符 |
| () | 匹配稍后的数值标签 : % s/(.*)/# \1/ |
| x | x 重复 m 次 |
| x | x 重复 m 次 以上 |
| x | x 重复 m 到 n次 |
| + | 前导符出现1~n次 |
| ? | 前导符出现0~1次 |
| | | 多个匹配 a|b 找a或者b |
| () | 例子love(able|rc) |
| \d | 数字 [0-9] |
| \w | 单词字符[a-zA-Z0-9] |
egrep 支持正则表达式 \w 字符 \W 符号 \b词边界
fgrep 不支持正则
grep
| 参数 | 含义 |
|---|---|
| -q | 屏蔽输出 |
| -v | 取反 |
| -R | 目录下查找 |
| -o | 只显示查找内容 |
| -B2 | 前文的两行 + 关键字行 |
| -A2 | 后文的两行 + 关键字行 |
| -C2 | 前后文的两行 + 关键字行 |
| -l | 只文件名 |
| -n | 带函数 |
awk : 列截取
awk [op] 'commands' file
| 参数 | 含义 |
|---|---|
| -F | 分隔符默认是空格 |
示例:
awk -F: 'BEGIN{print "开始工作"} {print $0} END{print"结束工作"}' file
sed -r(可读) -i(写入) '命令' 文件
| 命令 | 意义 |
|---|---|
| d | 删除 |
| 1,$ | 范围 |
| s///(g) 或者是 s### | 替换 |
| r | 读入文件注意是逐行 |
| w | 文件另存为 |
| a | 之后增添内容 |
| i | 前面增添内容 |
| c | 替换内容 |
| 下一行 | |
| ! | 反向选择 |
| -e 或者是 ;隔开 | 多重编辑 |
| '' => "$a" | 使用变量 |
补充 : s/()/ \1/ \1替换第一个括号的内容
Tips :
$ sudo apt-get install openssh-server虚拟机安装 ssh服务, vscode连接虚拟机方便记笔记$ sudo apt install expect免交互软件
浙公网安备 33010602011771号