shell

shell

1、 什么是shell?

shell是一个命令解释器,将用户输入的命令解释给操作系统内核。

Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它类似于Windows下的cmd.exe,可以交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,但是Shell是不需要进行编译的,它是从脚本程序中一行一行的读取并执行命令。

Shell有两种执行命令的方式:交互式(Interactive),用户输入一条命令,Shell就解释执行一条;批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

2 、常见的shell类型

Linux 的 Shell 种类众多,常见的有:

(1) BourneShell(sh):是由AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。

(2) BourneAgain Shell (即bash):是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。

(3) ash:ash Shell是由Kenneth Almquist编写的,是Linux 中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。

(4) CShell(csh):是加州伯克利大学的Bill Joy为BSD Unix开发的,共有52个内部命令,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh。

(5) KornShell(ksh):是AT&T Bell实验室的David Korn开发的,共有42 条内部命令,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。

(6) zch:是Linux 最大的Shell之一,由Paul Falstad完成,共有84 个内部命令。如果只是一般的用途,没有必要安装这样的Shell。

可以使用系统变量SHELL查看当前使用的shell:echo $SHELL
也可以到/etc/shells文件里查看系统可以使用的shell

3、 shell的交互方式

  • 命令行
  • 脚本执行
    • 编写脚本,文件后缀名一般为.sh
    • 文件必须以#!/bin/bash开头
    • 添加脚本的可执行权限chmode +x 脚本名
    • 执行脚本:
      • 在当前目录里执行:./脚本名

      • 在其他目录中执行:使用绝对路径
        #!/bin/bash
        #使用#注释,第一行是特殊存在
        cd /
        ls -al

        :wq #存退出盘
        chmod +x 1.sh #修改权限,添加可执行权限
        ./1.sh #执行当前目录下的shell脚本

4、 定义变量

  • 变量类型

    • 局部变量:只在本shell中使用
    • 环境变量 : 使用整个系统,一般大写
  • 局部变量的使用
    #1 定义局部变量
    a=10 #注意等号两边不要留空格,否则会看成多个命令
    b=$a

    #2显示局部变量
    echo b echo{b}
    echo "a=$a" #双引号中的变量解释

    #3.销毁变量
    unset a #干掉一个变量,不要带$符
    #注意反引号,反引号引起来的是命令,可以执行,将执行结果给变量
    d=`date`

    【注】:等号两边不要留空格

  • 位置变量
    $0 表示脚本的名称
    $1-$9表示传递给脚本的的参数

    #test.sh脚本
    #!/bin/bash
    echo 'hello world'
    echo $0 $1 $2

    执行输出:
    hello world
    ./test.sh lala dudu

  • 特殊变量
    $#表示传递给脚本的参数个数
    $*表示传递给脚本的所有参数
    $?表示上一个命令执行的返回值,返回值为0表示成功执行,否则命令执行错误

  • 常量
    readonly a=10 #定义常量
    echo $a
    a='ll' #-bash: name: 只读变量,不能修改

5 引号

  • 双引号中解释变量,解释转义字符
  • 单引号不解释变量、不解释转义字符
  • 反引号会执行当中的内容
  • 特殊字符要用反斜线转义:& * ?| $ ^

6 字符串

  • 计算字符串长度${#字符串名}
  • 提取子串:${字符串名:start:len}从下标为start开始,提取len个字符

7 数组

  • 数组定义:a=(1 2 3) #千万注意,数值之间用空格分隔
  • 获取数组元素:${a[0]}
  • 赋值$a[0]=100
  • 获取数组长度:{#a[@]}或者{#a[*]}

8 seq

  • 生成连续整数
  • 示例:seq 1 10,生成1-10的连续整数

9 运算

  • 数学运算

    shell默认所有变量都是字符串,执行数学计算需要用[]括起来

    a=100
    echo $[$a+10]
    echo $[$a/2]
    echo $[$a*2]
    echo $[$a-80]
    echo $[10%2]
    
    echo $((3+5))
    echo $((10/2))
    echo $((10/3))  # 整除
    echo $((10*3))
    echo $((10%3))
    
    let a=5+6
    echo $a
    let a+=10
    echo $a
    
    echo `expr 3 + 5`  #也可以用expr进行计算
  • 关系运算
运算符 说明 举例
-eq ==,相等返回 true。 [ a -eq b ]
-ne !=,不相等返回 true。 [ a -ne b ]
-gt >,如果是,则返回 true。 [ a -gt b ]
-lt <,如果是,则返回 true。 [ a -lt b ]
-ge >=,如果是,则返回 true。 [ a -ge b ]
-le <=,如果是,则返回 true。 [ a -le b ]
  • 逻辑运算
运算符 说明 举例
&& 逻辑的 AND [[ a -lt 100 && b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ a -lt 100 || b -gt 100 ]] 返回 true
  • 字符串判断
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ a = b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ a != b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
  • 文件判断
操作符 说明 举例
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否不为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

10 分支语句

  • if-else
      a=100
      if [ $a -gt 90 ]
      then
          echo "a>90"
      else
          echo "a<=90"
      fi
  • case
      case $变量名 in
       模式1)
       命令序列1
       ;;
       模式2)
       命令序列2
       ;; 
       *)
       默认执行的命令序列     
       ;; 
      esac
        1 #!/bin/bash
        2 case $1 in
        3     start | begin)
        4         echo "start"
        5         ;;
        6     stop | end)
        7         echo "stop"
        8         ;;
        9     *)
       10         echo "I don't know"
       11 esac

11 循环语句

-forin

for 变量 in 列表
    do
        command1
        command2
        ...
        commandN
    done
    
    示例:
    for i in 1 2 3 4 5;do
        echo $i
    done
    
    #从命令读取值
    for line in `cat 1.txt`;do 
        echo $line
    done
    
    #读取目录列表
    for file in ~/*;do 
        echo $file; 
    done
    
    for i in `seq 1 100`;do
        let sum+=$i
    done
    
    #遍历数组
    for x in ${a[*]};do 
        echo $x; 
    done
  • while
    #当型循环
    while condition
    do
        command
    done
    
    sum=0
    i=0
    while [ $i -lt 10];do
       let sum+=$i
       let i+=1
    done
  • until
    #直到型循环
    #condition为假执行循环,为真停止
    until condition  
    do
        command
    done
    
    until [ ! $i -lt 10 ];do 
        echo $i; 
        let i+=1; 
    done

12 break和continue

break 退出当前循环
continue 结束当次循环

13 函数

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

推荐阅读更多精彩内容

  • 葛根湯證 太陽病,項背強几几,無汗惡風者,葛根湯主之。太陽病,項背強几几,而汗出惡風者,桂枝加葛根湯主之。 [[足...
    美君阅读 168评论 0 1
  • 我心里总有个江湖 曾想武功天下第一 做个当仁不让的武林盟主 曾想戴金冠坐龙椅 背北面南贵为九五 也曾想倒骑一头犟驴...
    泼皮破落儿阅读 357评论 0 1
  • 鲜花盛开的地狱丛林是什么样的呢? 刚开瓶的酒,冒着缕缕白烟,盯了半晌,迫不及待将它吹散。说来也真是好笑,本是为了忘...
    Jaskeiyuki阅读 166评论 0 0
  • 魏婚夫1026阅读 204评论 0 0