shell bash 语法

shell bash 语法

  • 一、shell介绍
  • 二、dirname和basename
  • 三、$0和BASH_SOURCE[0]的区别
  • 四、变量定义和赋值
  • 五、代换
    • 1.文件名用通配符代换
    • 2. 命令代换:`, $()
    • 3. 符号
  • 六、if/then/elif/else/fi
  • 七、case/esac
  • 八、for/do/done
  • 九、while/do/done
  • 十、条件判断语句
  • 十一、位置参数和特务变量
  • 十二、函数
  • 十三、命令的组合符&&和||
  • 十四、echo命令
  • 十五、终端常用的快捷键
  • 参考

一、shell介绍

Shell的作用是解释执行用户的命令。Shell解释执行单条命令的这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令。UNIX系统上有很多版本的Shell,bash是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
Shell脚本中用#表示注释,相当于C语言的//注释。但位于第一行开头的#! 例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。每个脚本程序必须在开头包含这个语句。

在/etc/shells文件中给出系统已知的Shell,可cat /etc/shells 查看:

#/etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash

二、dirname和basename

dirname表示取文件的目录,basename表示取文件名

[root@web ~]# basename /usr/bin/sort 
sort
[root@web ~]# dirname /usr/bin/sort 
/usr/bin

三、$0和BASH_SOURCE[0]的区别

${bash_source[0]} 永远表示当前文件,$0表示最后一次执行的脚本

参考:linux中${bash_source[0]}和$0的区别

四、变量定义和赋值

  1. 变量赋值时’='两边不能有空格,否则会被Shell解释成命令和命令行参数。
  2. 变量获取:$ 放在变量前面或者${变量}时表示获取变量的值。例:
a="hello world!"
echo $a
  1. 和C语言不同的是,Shell变量不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义VAR=45,其实VAR的值是字符串45而非整数。Shell变量不需要先定义后使用,如果对一个没有定义的变量取值,则值为空字符串。

五、代换

1.文件名用通配符代换

* 匹配0个或多个任意字符
皮配一个任意字符
[若干个字符] 匹配方括号中任意一个字符的一次出现

2. 命令代换:`, $()

由反引号[Esc下面那个键]``括起来的或者&()括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中

3. 符号

  • 转义字符:\
    和C语言类似,\在Shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值。
  • 单引号:‘’
    和C语言不一样,Shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。
  • 双引号:" "
    双引号用于保持引号内所有字符的字面值(回车也不例外),但以下情况除外:
    $加变量名可以取变量的值
    反引号仍表示命令替换
    \ $ 表示$的字面值
    \ `表示`的字面值
    \ "表示"的字面值
    \ \表示\的字面值除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值

六、if/then/elif/else/fi

使用时注意:

  • 每一组if/then的结束都应附上一个fi与开头的if对应
  • “[]“应当注意用空格隔开,”]“后紧跟”;”
  • “[]“内的条件与”[”、"]"都有一个空格相隔。
if [ -f $a ];then
        echo "hello world!"
fi

if [ -f $a ]是第一条,then echo "hello world!"是第二条,fi是第三条。如果两条命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了,另外,then后面有换行,但这条命令没写完,Shell会自动把下一行接在then后面当作一条命令处理。和[命令一样,要注意命令和各参数之间必须用空格隔开。if命令的参数组成一条子命令,如果该子命令的Exit Status为0(表示真),则执行then后面的子命令,如果Exit Status非0(表示假),则执行elif、else或者fi后面的子命令。if后面的子命令通常是测试命令,但也可以是其它命令。Shell脚本没有{}括号,所以用fi表示if语句块的结束

七、case/esac

case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。

case$varin
        conditionl )
                statments1;;
        conditionl )
                statment2;;
        * ) default statements;;
esac

注意:

  • conditionl使用空格与“)”隔开
  • statement*后使用两个“;”结尾
  • *)后陈诉除statements之外的情况
  • 使用esac与case呼应结尾

八、for/do/done

for/do/done使用规则:

for var in list
do 
    statement
done

其中,var是要列举的变量,list是变量var的一个集合,do…done中的语句是需要执行的语句。使用时需要注意:

  • for后面的变量未加" " , 但 在 d o . . . d o n e 中 要 使 用 v a r 变 量 时 需 要 加 上 " ",但在do...done中要使用var变量时需要加上" ",do...done使var""
  • 若使用"()"将list括起来时,list中的内容将会被视为一个元素
  • 当for后没有跟in [list]部分时,则循环控制变量将取遍命令行的所有参数,即$@
  • 当在shell界面写脚本语句时,若for语句和do语句都写在同一行,则for语句后面需要用";",可根据shll界面的错误提示来更改脚本
for a in $(ls /home/www/)
do
        if [ -f $a ]
               iconv -f utf-8 -t gbk $a
        fi
done

当/home/www下的文件或者目录未被列举完时,若检索到的当前变量a为文件,则把所有的utf-8编码的文件转换为gbk编码。

九、while/do/done

#! /bin/sh
COUNTER=1
while [ "$COUNTER" -lt 10 ]; do 
        echo "Here we go again" 
        COUNTER=$(($COUNTER+1))
done

Shell还有until循环,类似C语言的do…while循环

十、条件判断语句

  • 在比较操作上,整数变量和字符串变量不同,注意:如下比较操作的前后都需要有空格,若没有空格会被认为是变量的赋值号
    shell bash 语法_第1张图片
  • 文件名判断语句含义

shell bash 语法_第2张图片

  • 条件间的与、或、非逻辑运算

shell bash 语法_第3张图片

十一、位置参数和特务变量

shell bash 语法_第4张图片
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。

十二、函数

和C语言类似,Shell中也有函数的概念(用set命令可以查看到内置函数),但是函数定义中没有返回值也没有参数列表。如:

#! /bin/sh
foo() { echo "Shell bash function is called"; }
echo "---start--"
foo
echo"---end--"

注意:

  1. 函数体的左花括号{和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括号}写在同一行,命令末尾必须有;号。
  2. Shell脚本中的函数必须先定义后调用,调用的时候不需要括号,一般把函数定义都写在脚本的前面,把函数调用写在脚本的最后(类似C语言中的main函数,这才是整个脚本实际开始执行命令的地方)。
  3. Shell函数没有参数列表并不表示不能传参数,调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,改变这些变量并不会影响函数外面的$0、$1、$2等变量。
  4. 函数可以用return语句来制定返回一个特定的整数,如果没有指定,则返回最后一条语句的执行结果(成功返回0,失败返回错误代码)。函数的返回值通过“$?”保留字来获得。BASH要求返回值必须为一个整数,不能有return语句返回字符串变量
    #!/bin/bash
    square(){
    let "res=$1*$1"
    return $res
    }
    square $1 #$1表示第一个实参 5
    result=$?
    echo $result
    exit 0
    执行:sh funtest.sh 5   返回:25

十三、命令的组合符&&和||

除了分号,Bash 还提供两个命令组合符&&和||,允许更好地控制多个命令之间的继发关系。

  • Command1 && Command2:如果Command1命令运行成功,则继续运行Command2命令
  • Command1 || Command2:如果Command1命令运行失败,则继续运行Command2命令
  • 对比: Command1 ; Command2:只要Command1命令执行结束,不管成功或失败,都会继续执行Command2命令

十四、echo命令

echo命令显示内容的时候,若是单行内容显示,可以直接跟要显示的内容,也可以用单双引号括起来;若是多行显示,必须要引号括来(单双都可以)

#直接跟内容
Robin-macbook-pro:~ robin$ echo hello world
#结果: 
hello world
#用单引号括起来
Robin-macbook-pro:~ robin$ echo 'today is Monday, 
> termorrow is Tuesday,
> and the day after termorrow is Thursday.'
#结果: 
today is Monday, 
termorrow is Tuesday,
and the day after termorrow is Thursday.

echo 必须使用参数 -e 解释特殊字符

Robin-macbook-pro:~ robin$ echo "I\nLOve\nU"
I\nLOve\nU
Robin-macbook-pro:~ robin$ echo -e "I\nLOve\nU"
I
LOve
U

十五、终端常用的快捷键

ctrl + l:清除屏幕并将当前行移到页面顶部
ctrl + c:中止当前正在执行的命令
ctrl + a:移动光标到行首
ctrl + e:移动光标到行尾
ctrl + u:从光标位置删除到行首
ctrl + k:从光标位置删除到行尾
ctrl + d:关闭 Shell 会话
↑、↓:向上和下浏览已执行命令的历史记录

参考

  1. shell bash 脚本语法
  2. 高级bash循环语句编程

你可能感兴趣的:(c++,bash,linux,开发语言)