learn shell第二课

learn shell第二课

一、字符串操作

1.1 字符串长度

$STRING='this is a string'
$echo ${#STRING}#"#"号往往与长度或者个数有关,比如$#就是返回传入脚本的参数个数
#16

1.2 索引

检测一个字符串里面的字母首次出现在另外一个字符串的位置

$STRING='this is a string'
$SUB_STRING='hat'
$expr index "$STRING" "$SUB_STRING"
#1
#1是hat当中的t首次在STRING当中出现的序号

1.3 切片

索引用${STRING:N:M}的方式切片,N是开始的位置,M是结束的位置

$echo ${STRING:3:7}
#s is a

1.4 子字符串替换

$STRING="to be or not to be"
$echo "${STRING[@]/be/eat}"
#to eat or not to be

字符串替换方法可以用${STRING[@]/replaced/new_item}这样的结构去替换,其中STRING[@]代表取出STRING里面的所有元素,也就是所有字母。

${STRING[@]/replaced/new_item}默认替换第一个,要全部替换,用${STRING[@]//replaced/new_item}

$echo "${STRING[@]//be/eat}"
#to eat or not to eat

$echo "${STRING[@]/#to be/eat}"#替换前面出现的to be
#eat or not to be

echo "${STRING[@]/%be/eat}"#替换后面出现的be
#to be or not to eat

二、判断语句

判断语句的基本语法结构是:

if [ judgement ];then
    code if the judgement is true
fi

在这里要注意几点,一个是if在结束的时候是有fi的代表finish;另外如果then和if同行的话,要加分号,然后还有judgement里面的判断,注意跟前后括号都有空格,另外里面的判断是跟之前的操作符是一样的,操作符前后也要有空格。

示例:

NAME="John"
if [ "$NAME" = "John" ];then
    echo "His name is John"
fi
#His name is John

另外也可以加入elif还有else其他条件

NAME="Peter"
if [ "$NAME" = "John" ];then
    echo "His name is John"
elif [ "$NAME" = "Mary" ];then
    echo "His name is Mary"
else
    echo "No"
fi
#No

数字比较的一些逻辑语句

comparison    Evaluated to true when
$a -lt $b    $a < $b
$a -gt $b    $a > $b
$a -le $b    $a <= $b
$a -ge $b    $a >= $b
$a -eq $b    $a is equal to $b
$a -ne $b    $a is not equal to $b

字符串比较的逻辑语句

comparison    Evaluated to true when
"$a" = "$b"     $a is the same as $b
"$a" == "$b"    $a is the same as $b
"$a" != "$b"    $a is different from $b
-z "$a"         $a is empty

2.2 case结构

case var in 
    judgement1) do something;;
    judgement2) do something;;
    judgement3) do something;;
    judgement4) do something;;
my_case=1
case "$my_case" in
    1) echo "hello";;
    2) echo "my name"
esac
#hello

在这里要注意与case相对应的是要写esac符号退出,另外每个操作之间要加;;两个分号分开。跟变量var有关的判断语句judgement或者condition要写完整,上面如果是判断是否等于则可以不用写完整。

三、循环

3.1 遍历

基本结构

for N in array;do
    do something;
done
# loop on array member
NAMES=(Joe Jenny Sara Tony)
for N in ${NAMES[@]} ; do
    let i+=1
    echo "The number ${i} is $N"
done
#The number 1 is Joe
#The number 2 is Jenny
#The number 3 is Sara
#The number 4 is Tony

注意${NAMES[@]}是取这个整个阵列的元素集合,而${NAMES}是取这个阵列作为整体的一个变量

3.2 while循环

while循环的结构

while condition ; do
    do something
done
count=1
while [ "$count" -lt 4 ] ; do
    echo "The current number is $count"
    let count+=1
done
#The current number is 1
#The current number is 2
#The current number is 3

我们还可以增加break还有continue语句来控制,跟python一样

count=1
while [ $count -lt 10 ] ; do
    if [ $count -gt 7 ] ; then
        break
    
    elif [ $(($count % 2)) -eq 0 ] ; then
        echo "The current number is $count"
    else
        continue
        
    fi
    count=$(($count+1))
done

四、shell函数

shell函数的结构

function function_name {
    commands
}

五、特殊变量

在shell脚本当中有一些特殊变量

  • $0 - The filename of the current script.|
  • $n - The Nth argument passed to script was invoked or function was called.|
  • $# - The number of argument passed to script or function.|
  • $@ - All arguments passed to script or function.|
  • $* - All arguments passed to script or function.|
  • $? - The exit status of the last command executed.|
  • $$ - The process ID of the current shell. For shell scripts, this is the process ID under which they are executing.|
  • $! - The process number of the last background command.|

六、trap命令

trap命令来对某个信号进行输出

trap <argv>/<function> <signal>

信号就是用户一些中断程序运行的操作,或者是磁盘满了之类的错误使得程序无法继续往下运行,这样的一些信号就给了程序信号。可以在终端输入kill -l查看所有的信号类型。也可以参考tutorialspoint的这篇文章

我们在traptest.sh这个文件当中键入以下代码:

 #!/bin/bash
# notice you cannot make Ctrl-C work in this shell,
# try with your local one, also remeber to chmod +x
# your local .sh file so you can execute it!

trap func SIGINT SIGTERM
echo "it's going to run until you hit Ctrl+Z"
echo "hit Ctrl+C to be blown away!"
function func {
        echo "Booh"

}



while true
do
        sleep 60
done

我们在按下ctrl+c取消运行的时候会有提示。说明这个signal被捕捉到了。

七、文件检测

我们还可以用脚本检测文件在当前路径的一些状态。

使用判断语句

<- command> <filename1>

<filename1> <- command> <filename2>

比如-e检测文件是否存在

#!/bin/bash
filename=$1#这里接收第一个参数作为文件名
if [ -e "$filename" ];then
    echo "$filename exists"
fi

我们试一下运行

类似的,-d检测某个路径是否存在,-r检测文件是否可读。

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

推荐阅读更多精彩内容