shell语法

条件测试

shell 条件测试0为真,1为假

test

[ ] 

[[ ]]

参数之间使用空格隔开

测试命令

-d 存在且为目录

-f 存在且为普通文件

-z 字符串长度为0

-n 字符串长度非0

str1 = str2 字符串相同为真

str1 != str2 不相同为真

arg1 op arg2

-eq 相等
-ne 不等
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于

逻辑操作


-a and
-o or

两个好的习惯

X${str1} == X${str2} 字符串比较如果一个为空,那么会错误展开,可以增加前缀防止
变量取值放在""之间,理由同上

分支

if/then/elif/else/fi

#!/bin/bash
# ##################
echo "if..else if fi"
read num
if [[ $num -eq 100 ]]; then    #语句放在同一行时应当以分号隔开
    #statements
    echo "num=100"
elif [[ $num -lt 100 ]]; then
    #statements
    echo "num<100"
else
   # echo "num>100"
  : #空体应当是用冒号,,冒号作为一个命令,结果总是为真
fi

更好做法

[  ] && {}
或者[  ] || {}

case命令

case/esac

case $_op in
    "+" )
    (( sum=$num1+$num2 ))
    printf "$num1 $_op $num2 = %s\n" "$sum"
    ;;
  "+")
  :
  ;;
  *)
  ;;

循环语句

do/done用于标识一个语句块的开始和结束,可以放在for行用分号隔开

#!/bin/bash
for i in {a..z}
do
    echo "printf val is : $i"
done

一个例子:1+2+..+100=1050

#!/bin/bash
str=`seq 1 1 100 | tr '\n' '+' | sed 's/+$/\n/'`
printf ${str}=
echo `seq 1 1 100 | tr '\n' '+' | sed 's/+$/\n/' | bc `

执行结果

1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100=5050

另一种实现方式
sum=0
str=""
for (( i = 0; i < 101; i++ )); do
    #statements
    (( sum = $i + $sum))
    str=$str${i}
    if [[ $i -eq 100 ]]; then
        #statements 
        break
    fi
    str=$str'+'
done
echo ${str}=$sum

while [ : ];do :;done

位置参数和特殊变量

$0 位置参数0
$1 ...
$2 ...
...
$# 相当于参数个数argc-1
$@参数列表...  $1$2$3....
$* 同上
$?上一条命令的exitstatus
$$当前shell的进程号
位置参数可以使用shift命令左移(覆盖前边的n个参数)会改变$#  $@

函数

函数定义

FUNCNAME(){
}
function关键字可选
函数调用eg is_dir    #不需要参数,参数获取使用$@

#!/bin/bash
function is_dir(){
    local dir=$1
    if [[ -d $dir ]]; then
        #statements
        return 0
    else
        return 1
    fi
}

调试
-n 读一遍脚本中命令但不执行,用于检查脚本中的语法错误
-v
-x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来

三种方法使用

#/bin/bash -x
$ sh -x ./test.sh
在脚本中使用set -x 和 set +x 对脚本中某一段代码进行跟踪

数组

bash不支持多维数组,并且没有限定数组大小.(无越界之说)下标从0开始

定义:

array_name=(value1..valuen)
或者
array_name[0]=""
array_name[3]=""
array_name[6]=""

读取
${arrname[index]}
echo ${arr[*]}
获取字符串长度或者数组长度
i=${#arr[@]}

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

推荐阅读更多精彩内容