Shell笔记

一、shell编程基础

打开文本编辑器(如vim),新建一个文件 test.sh

#!/bin/bash

#! 告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。其后路径便是解释此脚本文件的 Shell 程序。

/bin/sh test.sh

/bin/php test.php

这种方法也可以执行脚本,此时代码第一行则不需要写 #!


Ctrl+L 清屏 ; Ctrl+U 剪切光标前的 ; Ctrl+K 剪切光标后的 ; Ctrl+Y 粘贴剪切的内容

可以用分号分隔毫不相关的命令,实现批处理。

特殊执行方法

通配符:

用来匹配文件名


二、Shell变量

0、<基本说明>

Shell 默认所有变量都是字符串类型。

set -u 设置成“调用未声明变量会报错”    

不加选项的 set 是 “查看(几乎)所有变量”;env 也能看一部分环境变量

$PATH 是路径环境变量,与win不同的是,它以冒号作为分隔。


1、<变量基本操作>

定义变量时,不需要其他声明符号,如:your_name="runoob.com"

    注意,变量名和等号之间不能有空格。

定义用户环境变量时:加一个前缀 export  (区别是在子shell中也可访问到)


使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

    echo ${your_name}  其中大括号不是必需的,加了方便区分。


使用 readonly 命令可以将变量定义为只读变量,如:

    your_name="runoob.com"

    readonly your_name

使用 unset 命令可以删除变量,如:unset your_name  

    unset 命令不能删除只读变量。



2、<变量类型>:

1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。



3、<Shell 字符串>:

字符串可以用单引号,也可以用双引号。

单引号字符串的限制:

1) 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

2) 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,将变量作为字符串使用。

双引号字符串的优点:

1) 双引号里可以有变量

2) 双引号里可以出现转义字符

获取字符串长度

string="abcd"

echo ${#string}

字符串分片:(索引从0开始)

echo ${string:1:4}



4、<Shell 数组>:

只支持一位数组,下标从0开始。数组是动态的。

定义方法:数组名 = (值1 值2 ... 值n)

读取方法:${数组名[下标]}    

    * 使用 @ 符号可以获取数组中的所有元素

取得数组元素的个数:length=${#array_name[@]}

    * @可以换成*

取得数组单个元素的长度:lengthn=${#array_name[n]}



5、<注释>:

单行:#

多行:(EOF可换成 ' 或者 !)

:<<EOF

注释内容...

EOF


6、<变量测试>:

x=${y-new}    若y不存在,x为new;若y存在,x为y。


三、向shell脚本传参

参数用$数字来访问,如 $1,$2,$3 等。其中:

$0 是文件名;10以上要用大括号,如 ${10}

$* 是所有参数(以单个字符串显示);$@ 也是所有参数(以多个字符显示出来)

$# 是参数个数(不含文件名)

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$$ 脚本运行的当前进程ID号;$! 后台运行的最后一个进程的ID号

$- 显示Shell使用的当前选项,与set命令功能相同。



四、运算符

1、<数学运算>

方法1:val=$(expr 2 + 2)  

    * 也可以用反引号。

    * 运算符与运算数之间一定要加空格!

    * 乘号前必须加反斜杠才能实现运算,即 \*

 方法2:val=$[a+b] 

 【推荐】方法3:val=$((a+b)) 

方法4: let命令,用于执行一个或多个表达式。如:let int++ ; let c=$a+$b



2、<关系运算>

    * 只能用于数字,不能用于字符串,除非字符串的值为数字。

-eq 是否相等;-ne 是否不等;-gt 是否大于;-lt 是否小于

-ge 是否大于等于;-le 是否小于等于

    * 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。 


    * 除此之外,还可以使用test命令!

test $[num1] -eq $[num2] 等价于 [$num1 -eq $num2]



3、<布尔&逻辑运算>

     * 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。

! 非运算;-o 或运算,也可写成 ||-a 与运算,也可写成 &&

    * 逻辑运算符必须用两个中括号:

    [[ $a -lt 100 && $b -gt 100 ]] 等同于 [ $a -lt 100 -a $b -gt 100 ]



4、<字符串运算符>

     * 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。

= 是否相等;!= 是否不等;(不用 ==)

-z 长度是否为0;-n 长度是否不为0;$ 是否不为空

    * -n后的必须要加双引号,如 [-n "$a"]

    * [$a] 直接这样写就可以判空。


    * 除此之外,前四个运算也可以换成对应的test指令。



5、<文件测试运算符>

首先定义file="文件路径",然后再进行下面的操作.

必须用方括号。

-d 是否是目录;-f 是否是普通文件;-r/-w/-x 是否可读/可写/可执行

-e 检测文件(包括目录)是否存在

-L 文件是否存在?是否是一个符号链接?



6、<test命令>

文件测试test指令

    * 另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:

    if test -e ./notFile -o -e ./bash


五、echo命令

echo -e 使得输出语句的转义字符生效

    echo -e "\e[1; 颜色 内容 \e[0m"    带颜色输出

echo -n 不换行输出(也可用转义字符实现echo -e "abc\c"

输出重定向(到文件):

    命令 [&]> myfile

    > 是覆盖 ; >> 是尾增 ; & 使得无论是正确还是错误输出,都能写入文件。

    命令 >>文件1 2>>文件2    正确输出写入文件1,错误输出写入文件2


echo `命令` 可以执行命令,并打印出结果,使用的是反引号。

    也可以是$(命令)


六、printf命令

和C语言一样的用法,只不过不用括号和逗号。

printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

倘若格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用:

    printf "%s\n" abc def


七、流程控制

sh的流程控制不可为空,例如C语言中 else{//nothing} 这种。

1、<选择结构>:

sh的选择结构

如果要全部写在一行里(用于命令行):

选择结构在一行中

有时候可以用逻辑运算来实现选择:


2、<循环结构>

sh的for循环

循环结构也可以写成一行,用分号隔开即可。

* items可以为列表或字符串


sh的while循环
while循环示例

循环可用于读取键盘信息。 

例如 while read INPUT; do echo "$INPUT is good!"; done

    可以不断地读取用户的输入,并将输入存入变量INPUT中。

如果想要实现死循环,则while后的条件处填写 "" 或者 " true "


sh的until循环

只要condition还为假,就继续循环,直到为真。

condition通常为条件表达式(用中括号括起来的)


case语句

case语句类似switch语句。

每一模式必须以右括号结束。取值可以为变量或常数或者正则。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;

如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

例如:

case实例

并列的条件则以 | 作为分隔:

case实例2

循环控制:break跳出所有循环、continue跳出所在循环。


八、其他函数

1. cut 命令提取文件内容    (分隔符不支持空格)

-c 基本不用

2. read:类似python的 input,形式为 

    read [-n 允许输入的位数] [-s ] -p "message" 变量 ; -s 为隐藏输入的数据

2. read:类似python的 input,形式为 

read [-n 允许输入的位数] [-s ] -p "message" 变量 -s 为隐藏输入的数据

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

推荐阅读更多精彩内容

  • Shell笔记 变量的使用 定义变量 定义变量直接 变量名=值 注意 =号左右不能有空格,不然认为变量名为shel...
    昵称被谁抢了阅读 310评论 0 2
  • 内容使用多个命令创建脚本文件显示消息使用变量输入输出重定向管道数学运算退出脚本 使用多个命令 如果多个命令一起使用...
    王诗翔阅读 1,976评论 0 15
  • 来源: Linux命令行与shell脚本编程大全 博客地址,推荐电脑点 内容 基本的脚本函数返回值在函数中使用变量...
    王诗翔阅读 2,466评论 0 3
  • 变量使用$variable, ${variable_a} 输出到屏幕echoecho -e 对字符串中转义字符进行...
    mrwrong1988阅读 667评论 0 49
  • 1.ls -F(区分文件和目录) -a(显示所有) -R(递归目录) -l( 显示文件信息) -i(查看inode...
    神烦2阅读 68评论 0 1