整理:Bash shell

以下为 man bash 的内容

bash shell配置文件

交互式登录shell时,按顺序读取 :

/etc/profile

~/.bash_profile ~/.bash_login ~/.profile

~/.bashrc

退出登录时:

~/.bash_logout

非登录打开shell时(非登录包括在图形界面打开新的shell,su切换用户):

~/.bashrc

Shell元字符(metacharacter):用于结束、分割单词

IFS              由 <space> 或 <tab> 或 <newline> 三者之一组成(我们常用 space )

|                  管道,将一个进程的标准输出连接到另一个进程的标准输入

&                重定向文件描述符,&>全部重定向,2>&1stderr重定向到stdout;或命令后面加上 & 后台运行

;

()                 将其内的命令置于 nested subshell 执行,或用于运算或命令替换

>                重定向输出,单个大于符号 command > filename 在文件不存在时会创建文件;大于

<                重定向输入,单个小于符号,常见用法:将文本文件输入传入while循环;小于

Shell控制字符(control operator):用于执行控制(流程)功能

||

&

&&

;

;;                 在case语句里用于结束子语句

;&               case

;;&              case

()

|

|&

<newline>

复合命令(Compound Commands):list表示一列命令

( list )

{list; }

(( expression ))

[[ expression ]]

for name [ [ in [ word ... ] ] ; ] do list ; done

for (( expr1 ; expr2 ; expr3 )) ; do list ; done

select name [ in word ] ; do list ; done

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

if list; then list; [ elif list; then list; ] ... [ else list; ] fi

while list-1; do list-2; done

until list-1; do list-2; done

协进程 Coprocesses

coproc [NAME] command [redirections]

Shell 函数定义

name () compound-command [redirection]

function name [()] compound-command [redirection]

评论(注释

#          以#开头的行

转义字符

  \a          alert (bell)

  \b          backspace

  \e

  \E          an escape character

  \f          form feed

  \n          new line

  \r          carriage return

  \t          horizontal tab

  \v          vertical tab

  \\          backslash

  \'          single quote

  \"          double quote

  \?          question mark

  \nnn        the eight-bit character whose value is the octal value nnn (one to three digits)

  \xHH        the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)

  \uHHHH      the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four  hex digits)

  \UHHHHHHHH  the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

  \cx            a control-x character

参数

=                                   name=[value]

$@                                获取最后一个形参

declare -n ref=$1         声明一个变量,参数-n可以是 -i 整型 -a 数组 -f 方法 -x 导出

特殊字符(Special Parameters )

*

@

#

?

-

$

!

0

-

Shell变量(Shell Variables)

BASH

BASHOPTS

BASHPID

BASH_ALIASES

BASH_ARGC

BASH_ARGV

BASH_CMDS

BASH_COMMAND

BASH_EXECUTION_STRING

BASH_LINENO

BASH_LOADABLES_PATH

BASH_LINENO

BASH_LOADABLES_PATH

BASH_REMATCH

BASH_SOURCE

BASH_SUBSHELL

BASH_VERSINFO

BASH_VERSION

COMP_CWORD

COMP_KEY

COMP_LINE

COMP_POINT

COMP_TYPE

COMP_WORDBREAKS

COMP_WORDS

COPROC

DIRSTACK

EUID

FUNCNAME

GROUPS

HISTCMD

HOSTNAME

HOSTTYPE

LINENO

MACHTYPE

MAPFILE

OLDPWD

OPTARG

OPTIND

OSTYPE

PIPESTATUS

PPID

PWD

RANDOM

READLINE_LINE

READLINE_POINT

REPLY

SECONDS

SHELLOPTS

SHLVL

UID

BASH_COMPAT

BASH_ENV

BASH_XTRACEFD

CDPATH

CHILD_MAX

COLUMNS

COMPREPLY

EMACS

ENV

EXECIGNORE

FCEDIT

FIGNORE

FUNCNEST

GLOBIGNORE

HISTCONTROL

HISTFILE

HISTFILESIZE

HISTIGNORE

HISTSIZE

HISTTIMEFORMAT

HOME

HOSTFILE

IFS

IGNOREEOF

INPUTRC

LANG

LC_ALL

LC_COLLATE

LC_CTYPE

LC_MESSAGES

LC_NUMERIC

LC_TIME

LINES

MAIL

MAILCHECK

MAILPATH

OPTERR

PATH

POSIXLY_CORRECT

PROMPT_COMMAND

PROMPT_DIRTRIM

PS0

PS1

PS2

PS3

PS4

SHELL

TIMEFORMAT

TMOUT

TMPDIR

auto_resume

histchars

扩展(EXPANSION)

大括号扩展(Brace Expansion)

{x..y[..incr]}     匹配其一字符串

波浪号扩展(Tilde Expansion)

~                   表示HOME变量的值,HOME没有设置则表示当前执行目录

~+                 表示PWD变量的值

~-                  表示OLDPWD变量的值

参数扩展(Parameter Expansion)

${parameter}                              执行parameter变量里的语句

${parameter:-word}                   若parameter的值为空,则执行word语句

${parameter:=word}                  在上面的基础上,把word的值赋给parameter

${parameter:?word}                    若parameter为空,则把word作为错误信息输出

${parameter:+word}                    若parameter存在,则把word输出

${parameter:offset}                      把parameter值从底offset个字符开始的子串执行

${parameter:offset:length}          parameter值从底offset开始的,长度为length的子串执行

${!prefix*}                                      展开以prefix为开头的变量名

${!prefix@}                                   同上

${!name[@]}                                若name是数组,则输出所有下标,若不是数组输出0,若不存在不输出

${!name[*]}                                   同上

${#parameter}                              输出parameter的长度

${parameter#word}                      去除word匹配的内容,从开头开始匹配,最短匹配

${parameter##word}                    去除word匹配的内容,从开头开始匹配,最长匹配

${parameter%word}                       去除word匹配的内容,从结尾开始匹配,最短匹配

${parameter%%word}                    去除word匹配的内容,从结尾开始匹配,最长匹配

${parameter/pattern/string}           去除parameter展开后的最长word匹配,替换成string,只匹配一次

${parameter//pattern/string}          同上,但是匹配所有

${parameter^pattern}                       小写转大写,从开头匹配pattern,只匹配一次,不写pattern则转换第一个字

${parameter^^pattern}                    小写转大写,从开头匹配pattern,匹配所有,不写pattern则转换全部

${parameter,pattern}                         大写转小写,从开头匹配pattern,只匹配一次,不写pattern则转换第一个字

${parameter,,pattern}                         大写转小写,从开头匹配pattern,匹配所有,不写pattern则转换全部

${parameter@operator}                    经过operator转换,operator有五个值: Q 加引号、E 转义输出、P 转义提示符、A 输出赋值语句、a 输出变量所有属性

命令替换(Command Substitution )

$(command)

`command`

算数扩展(Arithmetic Expansion )

$((expression))

过程替换(Process Substitution)

<(list)          替换list命令的输出到管道文件

>(list)          替换左边的输出到管道文件

能解决一些重定向不能解决的问题,如让一个命令有多个输入的情况

< 输入重定向必须传入文件名,不能直接输入内容,所以使用<()将数据放入管道文件,传入文件名

cat <(ls)                     #输出了当前目录下所有文件和目录的名称

echo <(ls)                  #输出/dev/fd/63

单词分割(Word Splitting )

默认的单词分割是 <space><tab><newline>

可以修改IFS环境变量来指定分割符

路径名扩展(Pathname Expansion)

特殊匹配字符:

*                 匹配任意字符串

?               任意单个字符

[...]               匹配其中一个

extglob模式:

?(pattern-list)               匹配0到多次

*(pattern-list)              匹配0到多次

+(pattern-list)              匹配1到多次

@(pattern-list)              匹配其中一个

!(pattern-list)               匹配非指定模式

引用移除(Quote Removal)

          \ ' " 斜杠 单引号 双引号 可以去除上述效果

重定向(REDIRECTION)

[n]<word               输入重定向

[n]>word               输出重定向

[n]>>word            输出重定向追加

&>word                重定向标准输出和错误输出

>&word                重定向标准输出和错误输出

>word 2>&1        重定向标准输出和错误输出

&>>word               追加重定向标准输出和错误输出

>>word 2>&1          追加重定向标准输出和错误输出

HERE Document:

[n]<<[-]word

          here-document

delimiter

HERE Document是bash里面定义块变量的途径之一

定义的形式为:

命令<<HERE

...

...

HERE

会把命令和HERE之间的内容利用转向输入的方式交给该命令去处理。其中HERE相当于标记,可以是任何的字符串。

Here Strings:

[n]<<<word

Moving File Descriptors:

 [n]<&word

            [n]>&word

Moving File Descriptors:

[n]<&digit-               将描述符digit重定向到n或者标准输出(未指定n)

[n]>&digit-               将描述符digit重定向到n或者标准输出(未指定n)

Opening File Descriptors for Reading and Writing:

[n]<>word               读写都重定向到描述符n

别名(ALIASES )

alias

unalias

后面太多不看了。

==========================================================

Linux视频教程:Shell编程

什么是Shell

用户登录Linux后,就会出现一个系统提示符号,可以在符号后输入一大堆命令,并获得预期效果,到底幕后是谁在帮我们处理这一大堆事情呢?
就是Shell,当用户登录时,实际上是进入到一个
叫Shell的程序中。
Shell担任了翻译的角色,将用户输入的每个命令翻译成Linux系统能够识别的指令。

交互模式
  一当Shell收到用户输入命令后,就开始执行这项命令,并把结果显示到屏幕上,结束后Shell又会显示系统提示符,等待用户输入下一条命令。
后台运行
  一后台运行的符号为”&“,在命令后面加上“&”符号,就可以将程序放到后台运行。
  一在后台执行的程序怎么使它恢复到前台来运行呢?执行fg命令。
  一程序已经在前台运行,执行ctrl+z就可以放入后台。
  一如果有多个进程在后台运行,执行jobs命令,能够列出所有在后台执行的进程,那个中括号([])里面的数字就是jobs的代号,通过fg %number就可以恢复指定的后台进程

输入输出重定向
  一通过里定向符">" "<"将标准输入输出里新定向
管道
  一通过管道符号“|”完成一系列命令的顺序处理.
通配符
  一通配符的作用是在处理文件的时候用通配符模糊匹配一个或多个字符
环境变量
  一Shell是个庞大的程序,为了使工作环境符合用户的习惯或者应用的需要,可以让用户自行设置Shell使用环境。
Shell Script
  一Shell最里要也是最负责的就是Shell Script。Shell除T解释命令以外还有重要的功能就是程序语言,可以通过Shell Script进程程序设计,完成更加复杂的功能。

shell变量

既然Shell能够编程,当然就一定具备变量定义的功能。
变量分为预定义变量和环境变量
  一预定义变量-一通常是用户自行定义的特殊用途变量,有效返回限]几定义变量的Script中。
  一环境变量-一通常用来定义系统重要的设置,主要功能为提供程序执行时的参考

定义预定义变量的方法语法:varName=value
在Shell中定义变量很简单,不需要定义变量类型,只需要用“=”给变量赋值即可。
变量名称与等号之间不能有空格,否则Shell会认为是错误的命令。
使用变量的值,只需要在变量前加“$”。
set---查看所有已经设置的变量。
unset varName---删除设置的变量。

设置环境变量使用export命令

语法:export varName=value

env---显示当前环境变量

export -n varName 删除设置的环境变量

环境变量的作用域
  一在.bash_profile中定义的变量在用户登录后一直有效。
  一在普通脚本文件中定义的变量只在脚本内部有效。

几个常用的环境变量
变量名                         说明
PWD                         显示当前路径 
UID                         用户ID 
BASH_VERSION     Bash的版本 
HOSTTYPE               显示计算机平台 
OSTYPE                    显示操作系统种类 
PATH                    系统命令,文件查找路径 
HOME                    用户的home目录 

Shell编程

以“#”开头的行代表注释。
字符串前面加”$”代表它是一个变量,
  一如果”$”后面是数字,代表第几个参数
  一$1代表第一个参数,$2代表第二个参数,$0代表命令本身
参数详细说明

$i     代表第i个参数

$#     代表参数个数

$*     代表所有参数

$?     上一个命令的返回值

shift语句。
$i只能提供0到9这10个数据参数,那么超过10个么办呢?
shift能使引用数移位,如此就可以将引用过的引数移掉,把位置留给下一个引数。

echo $# $*

shift

echo $# $*

以“` `”符号包含的内容不是字符串,而是代表这是一个shell命令

echo "today is " `date`

前面是字符,后面`date`表示知晓date这个命令

PDATE=`date`

代表定义一个变量PDATE,将date知晓完成输出的结果放入PDATE中

"expr"是用来取计算的结果

a=9

b=10

var1=$a+$b

echo $var1

输出结果是“9+10”

“expr”是用来取计算的结果

var1=`expr $a + $b`

注意:“+”前后都需要有空格

read命令用于从终端或文件读取输入。
read命令读取一个输入行,直至遇到换行符。
行尾的换行符在读入时将被转换成一个空字符。
如果read命令后有变量名,输入内容赋给该变量,如果read命令后未跟变量名,读入的行将被赋值给内置变量REPLY

第一种if条件语句。
if (test condition) then
  commands
else
  commands
fi
if条件语句中test是一个固定关键字,用来判断condition的描述是否正确,正确继续执行下面语句,错误执行else后面语句。
fi表示if语句结束。

第二种if条件语句

if [ -option expr ]; then

     commands

else

     commands

fi

不同的条件代表不同的判断方式

例如if [ -r file]; 或 "[""]"里面都有加上空格,“]”后面要加";"号

-option说明

-f file     文件存在

-d file     文件存在并且是个目录

-e file     文件存在

-r file     文件存在并且可读

-w file     文件存在并且可写

-x file     文件存在并且可执行

while循环语句

while [ expr ];

do

     commands

done

expr为真的时候,while循环一直下去,直到expr为假

case分支条件语句

case "string" in

pattern_1)

     commands

;;

pattern_2)

     commands

;;

*)

     commands

;;

esac

当条件语句中的string等于pattern字符串时执行pattern下面命令

当没有符合条件时,最后执行*)

for循环语句

for varname in list ;

do

     commands

done

list可以是一个字符串或者数字

for每执行一次循环就将varname指定为list中的一个值,直到list这个数组结束

exit语句

exit code

exit可以让一个shell退出,与C语言的exit函数类似

:语句

代表空语句,本身没有任何作用,但又是合法的语句,它经常用来填补程序设计的缺陷

shell和c语言一样,可以提供自定义函数

function funcname

{

     commands

}

使用函数前必须先定义函数

==========================================================

ZYF师兄的PPT

What Bash?

CLI or GUI

Other sh:

  sh,csh,tch

1、命令历史、命令补全

2、管道、重定向

3、命令别名

4、命令行编辑

5、命令行展开

6、文件名通配

7、变量

8、编程

bash特性:

!n:执行命令历史中的第n条命令;

!-n:执行命令历史中的倒数第n条命令;

!!: 执行上一条命令;

!string:执行命令历史中最近一个以指定字符串开头的命令

!$:引用前一个命令的最后一个参数;

Esc, .

Alt+.

bash特性:

命令行编辑:

光标跳转:

  Ctrl+a:跳到命令行首

  Ctrl+e:跳到命令行尾

  Ctrl+u: 删除光标至命令行首的内容

  Ctrl+k:  删除光标至命令行尾的内容

  Ctrl+l:  清屏

命令行展开:

创建a~z开头,.txt结尾的文件

touch {a..z}.txt

alias:

alias ipconfig="ifconfig"

unaliasipconfig

通配符:

字符匹配: * ? [] [^]

字符集: [:space:],[:lower:],[:punct:],[:alnum:],[:alpha:],[:upper:]

重定向

重定向:本质是改变其stdout,stdin,stderr

>: 覆盖输出

>>:追加输出

2>: 重定向错误输出

2>>: 追加方式

&>: 重定向标准输出或错误输出至同一个文件

2

<:输入重定向

<<:Here Document

编程语言和编译器的关系?

shell的应用场景:

游戏运维,linux运维,自动化任务,文本处理,等等

bash变量的类型:

  本地变量(局部变量)

  环境变量

  位置变量:

  $1, $2, ...

  shift

  特殊变量:

  $?

  $#:参数的个数

  $*: 参数列表

  $@:参数列表

bash支持的引号:

``      命令替换

""      弱引用,可以实现变量替换

''      强引用,不完成变量替换

算术运算

shell中如何进行算术运算:

A=3

B=6

默认是字符类型,只能进行字符串连接操作 declare –i声明整型

1、let 算术运算表达式

       let C=$A+$B

2、$[算术运算表达式]

       C=$[$A+$B]

3、$((算术运算表达式))

       C=$(($A+$B))

4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用

       C=`expr $A + $B`

带颜色输出:

格式如下:

\033[字背景颜色;文字颜色m字符串\033[0m"

文本颜色:30黑色,31红色,32绿色,33黄色,34蓝色,35洋红,36青色,37白色;

字背景颜色:40黑色,41红色,42绿色,43黄色,44蓝色,45洋红,46青色,47白色;

变量进阶:

${parameter#*word} 变量中第一次出现word的时候右边的全部字符(从左往右)

${parameter##*word} 变量中最后一次出现word的时候右边的全部字符(从左往右)

example"

FILE=/usr/local/src

${FILE#*/}: usr/local/src

${FILE##*/}: src

${parameter%word*} 变量中第一次出现word的时候左边的全部字符(从右向左)

${parameter%%word*} 变量中最后一次出现word的时候左边的全部字符(从右往左)

example:

${FILE%/*}: /usr/local

${FILE%%/*}:

判断结构

1.单分支if语句:

if 判断条件;then

  statement1

  statement2

fi

2.双分支语句:

if 判断条件;then

  statement1

  statement2

else

  statment1

  statment2

fi

3.多分支语句:

if 判断条件1;then

  statement1

elif 判断条件2;then

  statement2

elif 判断条件3;then

....

else

  statementnN

fi

4.case多分支

case SWITCH in

value1)

  statement

  .....

  ;;

value2)

  statement

  .....

  ;;

*)

  statement

  .....

  ;;

esac

循环结构

1.while循环

while [condition];do (条件成立进入循环)

  statement1

  statement2

  .....

done

2.until循环

until [condition];do (条件不成立进入循环)

  statement1

  statement2

  .....

done

3.for循环

方式一:

  for VAR in con1 con2 con3......;do

      statement1

      statement2

      .....

  done

方式二:

  for((初始值;限制值;步长));do

      statement1

      statement2

      ....

  done

条件测试

1.文件测试

  -e 文件是否存在

  -f 是否是普通文件

  -d 是否是目录

  -r 是否是读取权限

  -w 是否有写权限

  -x 是否有执行权限

2.整数测试(仅用于数值间的大小比较)

  -le 小于等于

  -lt小于

  -ge大于等于

  -gt大于

  -eq等于

  -ne 不同于

3.字符测试

  == 相同(两个字符串逐个按ASCII字符进行比较全部相同才相同)

  != 不同

  > 大于(逐个按字符的ASCII码进行比较第一个不相等的字符是大于关系)

  < 小于(逐个按字符的ASCII码进行比较第一个不相等的字符是小于关系)

  -n 字符串是否非空(非空为true)

  -z 字符创是否为空(空位true)

4.组合条件测试

  -a 两个条件都为真则真,有一个假就是假(当条件一为假此后的条件将不作判断)

  -o 两个条件只要有一个真就是真(当条件一为真此后的条件不作判断)

  ! 对条件的结果取反

5.文件权限测试

  -r 文件是否具有读权限

  -w 文件是否具有写权限

  -x 文件是否具有执行权限

函数定义

function FUNCTIONNAME{

  command

}

FUNCTIONNAME()

{

  command

}

==========================================================

shell交互特性

&          命令后面加上“&”后台运行

fg          恢复到前台运行

jobs       列出所有在后台执行的进程,中括号[]里的数字是jobs的代号,通过fg %number就可以恢复指定的后台进程

ctrl+z     将正在运行的程序放入后台

ctrl+c     强制终端程序的执行

Shell通配符

*                              匹配0或多个字符

?                              匹配任意一个字符

[list]                          匹配list中任意单个字符

[!list]                         匹配一个非list里的单词

[c1-c2]                      匹配c1-c2中任意单一字符,如:[0-9]

{string1,string2,...}    匹配其一字符串

=                设置变量

$                 作变量或运算替换(或shell prompt符号)

>>              重定向输出追加,双大于符号,不存在会创建

<<              双小于号<<EOF不是从文件读取,而是从标准输入获取内容,直到遇到EOF标志

CR              由 <enter> 产生

Linux Shell 通配符、元字符、转义符使用实例介绍

http://www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html

数组定义   arr=(1 2 3 4 5)

界定符号

(list)                              输出列表

{list;}

[[expression]]

${parameter}               输出parameter的值

$(command)               执行command

`command`                  执行command

$((expression))             算术运算

'command'                   执行command

""                                  双引号中,大部分meta被关闭,$保留

''                                    单引号中,所有 meta 均被关闭

$'parameter'                 $加上单引号,输出parameter

字符串连接

${var1}${var2}

==========================================================

问题:

bboxh@DESKTOP-DEEP:~$ read line < `ls`

-bash: `ls`: 模糊的重定向

原因:ls在间隔号里面会执行,所以ls的执行结果会被重定向到左边,左边把ls的结果当成输入文件,正确的<应该读取一个文件,ls结果里面有很多文件以及文件夹,造成歧义。

发表评论

邮箱地址不会被公开。 必填项已用*标注