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 ] 文件测试
img

[ "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 :

  1. $ sudo apt-get install openssh-server 虚拟机安装 ssh服务, vscode连接虚拟机方便记笔记
  2. $ sudo apt install expect 免交互软件
posted @ 2025-07-26 00:39  Uoyue  阅读(26)  评论(0)    收藏  举报