前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell编程基础

shell编程基础

作者头像
测试加
发布2022-03-24 16:11:03
3640
发布2022-03-24 16:11:03
举报
文章被收录于专栏:用户4624600的专栏

替换

代码语言:javascript
复制
sed 's/abc/efg/g'

变量

定义变量

代码语言:javascript
复制
var=123

var="abc"

var='efg'

双引号支持特殊字符转义,单引号则不支持转义

字符串开启转义
echo -e "abc\nd"
#abd
#d

字符串未开启转义
echo  "abc\nd"
#abc\nd

数字变量操作

代码语言:javascript
复制
数字变量计算

i=1

echo $((i+5))

#6

遍历i更新

((i=i+3))
echo $i

#9

浮点数字需要用

a=1
b=2.3

echo `awk "BEGIN{print ${a} /${b}}"`
#0.833333

定义数组

代码语言:javascript
复制
通过下角标取值

array=(a b c)

echo ${array[2]}

# c

数组越界以后取不到值

取数组里边所有值

echo ${array[*]}

echo ${array[@]}

#a b c

取数据的长度

echo ${#array[*]}
# 3

字符串整段截取

代码语言:javascript
复制
offset是索引,下角标第几个开始截取到最后,索引从0开始

${value:offset}

value=abcd

echo ${value:2}

# cd

字符串控制截取个数

代码语言:javascript
复制

${value:offset:length}

offset表示索引,从0开始
length表示截取个数,从1开始

value=abcd

echo ${value:2:1}

# c

字符串掐头去尾

掐头

代码语言:javascript
复制
${value#pattern}

pattern表示要去除的字符

value=abc

echo ${vaule#a}

# bc

patter必须是开头的字符,否则匹配不到

去尾

代码语言:javascript
复制
${value%pattern}

pattern表示要去除的字符

value=efg

echo ${value%g}

#ef

掐头全匹配

代码语言:javascript
复制
${value##*pattern}

var=attattttt

echo ${var##a}

#ttttt

截取到最后一个a位置

去尾不开始匹配截取

代码语言:javascript
复制
${value%%pattern*}

var=attattttt

echo ${var##t}

#a

截取到最后一个t位置

字符串内容替换

代码语言:javascript
复制
${var/oldstr/newstr}

var="testerhome"

echo ${var/home/myhome}

#testermyhone

判断的类型

算数判断

代码语言:javascript
复制
相等
[ 1 -eq 1 ]
echo $?
# 0 真

不相等
[ 1 -ne 2 ]
echo $?
# 0 真

大于
[ 2 -gt 1 ]
# 0 真

大于等于
[ 2 -ge 1 ]
# 0 真

小于
[ 1 -lt 2 ]
# 0 真

小于等于
[ 1 -le 2 ]
# 0 真

或者用(())比较

代码语言:javascript
复制
((10>8))

# 0 真

字符串判断

代码语言:javascript
复制
判断字符串相同

=号两边有空格

[ "abc" = "efg" ]

# 1 假

判断字符串不相等

[ "abc" != "efg" ]
# 0 真

判断某个字符不为空
var="test"
[ -n ${var} ]
# 0 真

判断某个字符为空
[ -z ${var1} ]
# 0 

判断某个字符是否以什么开头的
[[ "xxxx" = x* ]]
echo $?
# 0 真

[[ "xxxx" = z* ]]
echo $?
# 1 假

判断某个字符是否以什么结尾

[[ "xxxt" = *t ]]
echo $?
# 0 真

[[ "xxxt" = *x ]]
echo $?
# 1 假

??替代两个字符,是否等于x开始的三个字符
[[ "xxx" = x?? ]]
echo $?
# 0 真

[[ "xxxx" = x?? ]]
echo $?
# 1 假

逻辑判断

代码语言:javascript
复制
且
[ 2 -eq 2 -a 3 -eq 3 ]
echo $?
# 0 真

[[ 2 -eq 2 && 3 -eq 3 ]]
用&&必须是[[]]括起来
echo $?
# 0 真

或
[ 2 -eq 2 -o 1 -eq 3 ]
echo $?
# 0真

[[ 2 -eq 2 || 1 -eq 3 ]]
echo $?
# 0真

取反
[ ! 2 -ge 1 ]
echo $?

shell内置判断

代码语言:javascript
复制
判断文件是否存在
[ -e test.log ]

判断文件是否是文件夹
[ -d shelltest ]

判断文件是否为普通文件
[ -f test.log ]

判断文件是否可读
[ -r test.log ]

判读文件长度不为0
[ -s test.log ]

判断文件是否可写
[ -w test.log ]

判断文件是否可执行
[ -x test.log ]

ps:[[]]是[]的扩展,在老的sh里并不支持。推荐用[]

算数运算符

布尔运算符

$?表示上次获取的结果

代码语言:javascript
复制
0表示正确

$true

echo $?

代码语言:javascript
复制
非0表示错误

逻辑控制

if

if [ 2 -eq 2 ] then echo "pass" fi

if--else

代码语言:javascript
复制
if [ 2 -eq 1 ]
then
    echo "pass"
else
    echo "fail"
fi
# pass

if--elif

代码语言:javascript
复制
if [ 2 -eq 1 ]
then
    echo "pass"
elif [ 2 -eq 2 ]
then
    echo "fail"
fi
#fail

if--elif--else

代码语言:javascript
复制
if [ 2 -eq 1 ]
then
    echo "pass"
elif [ 2 -eq 3 ]
then
    echo "fail"
else
    echo "noting"
fi
# noting

case

代码语言:javascript
复制
|相当于或的关系
*)表示都不匹配,走这个条件

result="start"
case ${result} in
    s|start)echo "start"
    ;;
    stop)echo "stop"
    ;;
    *)echo "default"
    ;;
esac

for循环

代码语言:javascript
复制
**计数for循环**

for((i=0;i<10;i++));
do
    echo ${i}
done  

两个(())
i++表示步长
i=i+2,表示跨度两个步长

**使用for循环遍历数组**

array=(a b c)
for index in ${array[*]};
do
    echo ${index}
done  

array=(a b "c d")
for index in "${array[*]}";
do
    echo ${index}
done 


while循环

代码语言:javascript
复制
tmp_file=/Users/xinxi/Desktop/aliyun1.txt

lines=()

OPTS=""
cat /Users/xinxi/Desktop/aliyun.txt | while read line
do 
    echo $line >> $tmp_file
done

cat $tmp_file

shell自动登录脚本

代码语言:javascript
复制
# set user root
# set ipaddress 185135xxxx@shell.xxxx-studio.com
# set passwd xxxxx
# set timeout 30

# spawn ssh $ipaddress
# expect {
#     "*password:" { send "$passwd\r" }
#     "yes/no" { send "yes\r";exp_continue }
# }
# interact

cgi-bin

开启服务器

代码语言:javascript
复制
python -m CGIHTTPServer 8000

创建文件

代码语言:javascript
复制
cgi-bin/hello.py

权限

代码语言:javascript
复制
chmod 777 hello.py

浏览器访问

代码语言:javascript
复制
http://127.0.0.1:8000/cgi-bin/h.py

查询web页面死链

代码语言:javascript
复制
#!/bin/bash
#初始化变量
#定义蜘蛛UA信息(默认是百度蜘蛛)
UA='+http://www.baidu.com/search/spider.html'
#前一天的日期(apache日志)
DATE=`date +%Y%m%d -d "1 day ago"`
#定义日志路径
logfile=/data/wwwlogs/www.chanzhi.org_apache.log-${DATE}.log
#定义死链文件存放路径
deathfile=/data/wwwroot/www.chanzhi.org/deathlink.txt
#定义网站访问地址
website=http://www.chanzhi.org
#分析日志并保存死链数据
for url in `awk -v str="${UA}" '$9=="404" && $15~str {print $7}' ${logfile}`
do
  grep -q "$url" ${deathfile} || echo ${website}${url} >>${deathfile}
done

递归查询文件夹下文件

代码语言:javascript
复制
#!/bin/bash
read_dir(){
    for file in `ls -a $1`
    do
        if [ -d $1"/"$file ]
        then
            if [[ $file != '.' && $file != '..' ]]
            then
                read_dir $1"/"$file
            fi
        else
            #echo $1"/"$file
            time=1
        fi
    done
}
#测试目录 test
read_dir "/Users/xinxi/Desktop/mobileperf"

linux rename命令批量修改文件名

代码语言:javascript
复制
rename 's/image/test/' *

参考

代码语言:javascript
复制
https://mp.weixin.qq.com/s/-5Q-cT2lWI9OkDJc51fCOA
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试加 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 变量
    • 定义变量
      • 数字变量操作
        • 定义数组
          • 字符串整段截取
            • 字符串控制截取个数
              • 字符串掐头去尾
                • 掐头
                • 去尾
                • 掐头全匹配
                • 去尾不开始匹配截取
              • 字符串内容替换
              • 判断的类型
                • 算数判断
                  • 字符串判断
                    • 逻辑判断
                      • shell内置判断
                      • 算数运算符
                      • 布尔运算符
                      • 逻辑控制
                        • if
                          • if--else
                            • if--elif
                              • if--elif--else
                                • case
                                  • for循环
                                    • while循环
                                    • shell自动登录脚本
                                    • cgi-bin
                                    • 查询web页面死链
                                    • 递归查询文件夹下文件
                                    • linux rename命令批量修改文件名
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档