Shell基础Demo 备忘录

工作中经常需要用Shell写一些脚本用于测试,但是每次写shell,我都痛苦不已,因为shell的语法形式太杂乱,各种括号,各种$XX,搞得我每次写完脚本,都得花大把时间解决语法格式错误。
为了解决这个问题,提高写shell的效率,我把一些shell常用的demo,总结出来,方便我以及各位读者查阅哈!

字符串连接

sh_strcat() {
    #method 1
    local str="strcat"
    local str2="helo"
    echo "strcat method1: ${str} ${str2}"

    #method 2
    echo "strcat method2:" ${str} ${str2}
}

获取字符串长度

sh_strlen() {
    local str="strlen"
    echo "strlen: ${#str}"
}

截取字符串

sh_substr() {
    local substr="hello Meizu!"
    echo -n "substr:"
    #起始下标:截取个数
    echo ${substr:0:5}
    echo ${substr:6:5}
}

if-else语句格式

sh_if_else() {
    local min=10
    local max=10
    
    # -gt -lt -le -ge

    #if [ ${min} -lt ${max} ]; then
    if ((${min} < ${max})); then
        echo "min < max"

    #elif [ ${min} -gt ${max} ]; then
    elif ((${min} > ${max})); then
        echo "min > max"

    else
        echo "min = max"
    fi
}

for语句格式

sh_for_ctrl_fmt() {
    echo "sh_for_ctrl_format:"
    #for((i=0; i<10; i++)); do
    for i in `seq 10`; do
        echo $i
    done
}

while语句格式

sh_while_fmt() {
    local var=10
    while ((${var} > 0)); do
        var=$((var-1))
        echo $var
    done
}

执行shell命令,并将结果赋给变量

sh_set_val_according2exec_res() {
    var=$(date)
    echo $var
}

echo -e 开启转义字符

sh_echo_e() {
    echo "echo -e:"
    echo -e "OK \\\\\\\\t END"         #horizonal tab
    echo -e "OK \\\\\\\\n END"         # 换行
    echo -e "OK ccc \\\\\\\\c ccc END" # 不再产生输出
    echo -e "OK \\\\\\\\b END"         #执行退格键
    echo -e "OK \\\\\\\\v END \\\\\\\\v eee"  #vertical tab
}

执行命令,抛弃所有输出

sh_exec_throw_output() {
    ls >/dev/null 2>&1
}

$各种符号意义*

sh_dollar_means() {
    echo "查看shell本身进程ID \\\\\\\\$\\\\\\\\$: $$"
    echo "最后运行的后台PID \\\\\\\\$!: $!"
    echo "最后运行命令的结束码 \\\\\\\\$?: $?"
    echo "所有参数列表1 \\\\\\\\$*: $*"
    echo "所有参数列表2 \\\\\\\\$@: $@"
    echo "参数个数 \\\\\\\\$\\\\\\\\#: $#"
    echo "当前脚本文件名 \\\\\\\\$0: $0"
}

四则运算

sh_operator() {
    echo "sh_operator:"
    local num1=10
    local num2=10

    #res=`expr 2 \\\\\\\\* ${num1}`
    #echo ${res}

    local result_add=$((${num1} + ${num2}))
    echo "add: "$result_add

    local result_minus=$((${num1} - ${num2}))
    echo "minus: "$result_minus

    local result_multi=$((${num1} * ${num2}))
    echo "multi: "$result_multi

    local result_divide=$((${num1} / ${num2}))
    echo "divide: "$result_divide

    local result_mod=$((${num1} % ${num2}))
    echo "mod: "$result_mod

    #######################################

    let result_add++
    echo "result_add++: "${result_add}

    let ++result_add
    echo "++result_add: "${result_add}

    let result_add+=5
    echo "result_add+=5: "${result_add}
    
    let result_add--
    echo "result_add--: "${result_add}

    let --result_add
    echo "--result_add: "${result_add}

    let result_add-=5
    echo "result_add-=5: "${result_add}
}

sh_random

sh_random() {
    local random_num=`awk 'BEGIN{srand();print int(rand()*1000)}'`
    echo "random num:  ${random_num}"
}

EOF INPUT

sh_EOF_INPUT() {
    ncat $ip 6600 << EOF
seekid $position $random_num
EOF
}

strcmp && ||

# -a  ==> 逻辑与
# -o  ==> 逻辑或
#    !  ==> 逻辑非
sh_strcmp() {
    echo "sh_strcmp:"
    local str1='y'
    local str2='z'
    #if (( "x${str1}" == "xy" && "x${str2}" == "xz" ));then
    #if [ "x${str1}" == "xy" -a "x${str2}" == "xz" ];then
    if [[ "x${str1}" == "xy" && "x${str2}" == "xz" ]];then
        echo "sh_strcmp: && success"
    else
        echo "sh_strcmp: && failed"
    fi

    local flag=0
    #if [ ! ${flag} == 0 ]; then
    if (( ! ${flag} == 0 )); then
        echo "! success"
    else
        echo "! failed"
    fi

    #if (( -d "/etc/zsh" && -e /etc/zsh/newuser.zshrc.recommended )); then
    if [ -d "/etc/zsh" -a -e /etc/zsh/newuser.zshrc.recommended ]; then
        echo "exist"
    else
        echo "not exist"
    fi
}

sh_switch_case

sh_switch_case() {
    echo "sh_switch_case:"

    case "$1" in
        start)          echo "case $1";;
        stop)           echo "case $1";;
        install)        echo "case $1";;
        remove)         echo "case $1";;
        upgrade)        echo "case $1";;
    esac
}

输出pwd

sh_print_pwd() {
    echo "sh_print_pwd:"
    dirname=$(cd "$(dirname "$0")";pwd)
    echo "dirname: "${dirname}
}

awk抓取html

sh_awk_spider_html() {
    echo "sh_awk_spider_html:"
    awk -F'<div class="content"|/ul>' '{for(i=1;i<=NF;i++){if($i~/class="play-img"/){print $i}}}' \\\\\\\\
        ${bt_spider_web_path}plug_xunbo.html|grep -a "h2"|grep -a "${bt_detail_url}" |tail -1 > ${bt_spider_log}xunbo_${kind}_classify.log

    awk -F'<a|/>' '{for(i=1;i<=NF;i++){if($i~/alt/){print $i}}}' ${bt_spider_log}xunbo_${kind}_classify.log  > ${bt_spider_log}classify_${kind}_info.log

    awk -F'[""]' '{print $4}'  ${bt_spider_log}classify_${kind}_info.log > ${bt_spider_log}bt_${kind}_detail_link.log 
    awk -F'[""]' '{print $6}'  ${bt_spider_log}classify_${kind}_info.log > ${bt_spider_log}bt_${kind}_name.log 
    awk -F'[""]' '{print $10}' ${bt_spider_log}classify_${kind}_info.log > ${bt_spider_log}bt_${kind}_pic.log 
}

sed基本使用


#查询hello关键字,打印相应行 
sed -n '/hello/p' cron.txt   

#删除含hello的行,输出到屏幕(原文件没删除)
sed  '/hello/d' cron.txt  

#跟上一句的区别:直接修改原文件
sed -i '/hello/d' cron.txt  

#移除空白行:
sed -i '/^$/d' file

#在包含hello关键字的指定行前加#号,注释该行:
sed -i '/hello/s/^/#/g' /etc/crontabs/root 

#取消#号,取消注释:
sed -i '/hello/s/^#//' /etc/crontabs/root

如果想了解更多awk和sed这两条命令,请参考陈皓大神写的相关文章~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容