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\"
结果示例: