当前位置: 首页 > news >正文

shell:基础

        本文主要探讨shell相关知识。

变量
$? 上一次执行命令返回状态
$$ 当前进程进程号
$! 后台运行的最后一个进程的进程号
$# 位置参数的数量
$* 参数内容
$@ 参数内容
$@和$*解析"hello word"为"hello" "word"
"$@"解析"hello word"为"hello word"
"$*"解析"hello word"为"hello" "word"
RANDOM随机数
常用环境变量(env):USER UID HOME HOSTNAME PWD PS1 PATH 
${#var}        返回var字符串长度
${var:n-m}     返回截取的var
${var:index:n}    返回从index开始的n个长度的字符
${var#str}    返回从左边删除str后的字符串(短匹配)(var=http://127.0.0.1/index.html,${var#*/} => /127.0.0.1/index.html)
${var##str}    返回从左边删除str后的字符串(长匹配)(var=http://127.0.0.1/index.html,${var##*/} => index.html)
${var%str}     返回从右边删除str后的字符串(短匹配)(var=http://127.0.0.1/index.html,${var%/*} => http://127.0.0.1)
${var%%str} 返回从右边删除str后的字符串(长匹配)(var=http://127.0.0.1/index.html,${var%%/*} => http:)
${var:-str} var为空或未设置返回str,var不为空返回var 
${var:=str} var为空或未设置返回str且var=str,var不为空返回var
${var:+str} var为空返回空,var不为空返回str
${var:?str} var为空或未设置str写入STDERR,var不为空返回var
${var/str/new} 返回第一个str替换为new_str的var 
${var//str/new} 返回第str全替换为new_str的var

运算
$(()) echo $(( 5+2-(3*2)/5 )) 
$[]   echo $[ 5 + 2 - (3*2)/5 ]
echo "2*4" | bc
echo "2^4" | bc
echo "scale=2;6/4" | bc
scale: 精度

输入
read -p "提示" -s "加密信息不输出" -t 超时时间 var

cat >> file.txt <<EOF
...
...
...
EOF

运行
./scripts         当前shell执行
source scripts  当前shell执行
bash scripts     子shell执行
sh –x script     执行该脚本并显示所有变量
sh –n script     检查语法模式
sh –v script     执行并容显示脚本内容

basename & dirname
basename 保留文件名
dirname  保留文件路径

流控
-n STRING 字符串长度不为0
-z STRING 字符串长度为0
STRING1 = STRING2 字符串是否相同
STRING1 != STRING2 字符串是否不同
-f 存在且是普通文件
-d 存在且是目录
-h 存在且是符号链接 
-a &&  逻辑与
-o ||  逻辑或

shift    位置参数左移(shift 3表示$1的值变为$4的值,默认左移1)
break    跳出本次循环
continue 进入下一轮循环
exit     退出脚本

if [ ... ]
then...    
elif [ ... ]
then...
else...
fi
case $var inpattern1)...;; pattern2)...;; *)...;; 
esac
for i in {list}
do                    ...
done    
for (( i=1;i <= 5;i++ ))
do...
done

while [ condation ]
do...
done
until [ condation ] #为假进行循环
do..
done

函数
function func() {}        函数声明
func 1 2 3             传参调用
unset func             取消函数

数组
os=(linux windows harmoneys) 定义数组 
os=(${list} ...)             定义数组(可追加元素)
os [0]=linux; os [1]=windows;定义数组(可追加元素)
declare -a num=(5 6 7 8)     定义数组
${os[0]}                    引用数组
${os[@]} == ${aa[*]}        数组所有内容(区别同$@和$*)
${#os[@]}                   元素个数
${!aa[@]}                   显示下标
${arry[@]/str/new}            临时替换
arry=(${arry[*]/str/new})   永久替换

正则表达式
^ 行首定位符 ^cxb => 以cxb开头行
$ 行尾定位符 cxb$ => 以cxb结束行
. 匹配单字符 c.b  => 匹配c某b  
* 匹配字符0到n次 c*b  => 匹配cb,c某某某...b
[] 匹配任一字符  c[xX]b => 匹配cxb,cXb
[ - ]  匹配范围内任一字符 c[a-z]b => cab...czb             
[^]    匹配非范围字符        c[^a-z]b => c1b...
\<     词首定位(由数组或字母组成) \<[cC]xb => cxb,Cxb
\>     词尾定位符号                cx[bB]\> => cxb,cxB
+      匹配一或多个字符
?      匹配零或一个字符 
()     匹配括号中全部字符
{m}    字符重复m次     cx{2}b => cxxb
{,m}   字符重复最多m次 cx{,2}b => cb,cxb,cxxb
{m,}   字符重复至少m次 cx{2,}b => cxxb,cxxxb...
{m,n}  字符重复m到n次  cx{1,2}b => cxb,cxxb

sed 
-f 编辑脚本
sed 's/str/new/ ; s/string/new/' file
sed -f sc file
sc == s/str/new/ \n s/string/new/

删除第n-m行
sed 'n,md' file 

删除第n行到最后一行
sed 'n,$d' file  

 删除匹配cxb
sed '/cxb/d' file  

删除匹配到cxb行到m行
sed '/cxb/,md' file  

删除奇数行
sed '1~2d' file

删除偶数行
sed '0~2d' file

i匹配忽略大小写
匹配n次的str被替换
sed 's/str/new/ngi' file  

匹配前加行
sed '/cxb/a\hello/' file

匹配后加行
sed '/cxb/i\hello /' file

awk
awk工作原理
awk -F ":" 'BEGIN{echo "start"}{print $1,$3}END{echo "end"}' file 
-F输入分隔符
OFS输出分隔符,默认为空格 
NR行号 
NF列号

打印指定行列字符
awk -F":" 'NR==3{ print $7 }' file

expect
set timeout n 设置超时时间ns 
spawn          传递交互命令
send          执行交互动作
expect eof       交互结束
interact       保持交互状态,否则交互完退出
exp_continue 继续执行

demo:

        exprct,正则

test.sh

#!/bin/bashexpect_test()
{/usr/bin/expect <<EOFset user [ lindex $argv 0 ]set pass [ lindex $argv 1 ]set ip [ lindex $argv 2 ]set timeout 3spawn ssh -l kaxi 192.168.200.183 expect {"yes/no" { send "yes";exp_continue }"password:" { send "123456\r" }}expect  "$"send "echo \"cxb\" \r"send "exit\r"expect eof 
EOF
}expect_test ${1} ${2} ${3}num=27.27 && [[ $num =~ ^[0-9]+\.[0-9]+$ || $num =~ ^[0-9]+$ ]] && echo \"yes\" || echo \"no\"

结果示例:

http://www.xdnf.cn/news/870553.html

相关文章:

  • 磐云P10 P057-综合渗透测试-使用反弹木马进行提权获取主机Shell
  • STM32学习之看门狗(理论篇)
  • 10.MySQL索引特性
  • dify中解决docx上传文件报错问题
  • 泰迪杯特等奖案例深度解析:基于量子启发优化与多尺度时空建模的港口物流智能调度系统
  • 如何应对敏捷转型中的团队阻力
  • 【位运算】丢失的数字(easy)
  • Linux进程调度:从时间片到实时任务的交响乐
  • C++——智能指针 unique_ptr
  • 【leetcode】9. 回文数
  • Hadoop大数据集群深度实践:源码分析、参数调优与自动化运维平台选型全解
  • 知识宇宙-学习篇:程序员调试思维
  • PyTest框架学习
  • docker镜像下载到本地,并导入服务器
  • spring4第6课-bean之间的关系+bean的作用范围
  • [C]extern声明变量报错:undefined reference终极解决方案
  • 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- 第一篇:MIPI CSI-2基础入门
  • 【AAOS】【源码分析】用户管理(二)-- 用户启动
  • APx500录制波形
  • Qt Creator工具编译器配置
  • Oj系统测试报告
  • 第3章(新)Day3-Python逻辑语句
  • Java 创建线程池的几种方式
  • Python基础:文件简单操作
  • OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()
  • 使用 useSearchParams 的一个没有触发控制台报错的错误用法
  • STL 库基础概念与示例
  • 洛谷每日1题-------Day39__P1697 [USACO18JAN] Lifeguards B
  • Vue 生命周期全解析:从创建到销毁的完整旅程
  • Redisson - 实现延迟队列