以下为 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
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结果里面有很多文件以及文件夹,造成歧义。