早上了,还有一个小时正式开工,先看会书。嘎嘎。。
上回书说道bash的某些option,今天要讲完这些option。
--login shell is a login shell
--noediting:把readline关闭了。此处的readline是什么具体含义也不是很明白了。希望读者自己去实践,如果用到这些的话,笔者主要是应用出身,底层的很多也是一知半解的。就怕“庸医”。还敢继续么:
--noprofile:donnot read /etc/profile or any of the personal startup file 。意思是不带任何含有基础环境变量的shell。这个类似于exec的应用,里面的ll命令都是不存在的。
--norc :donn't read ~/.bashrc。enabled automatically when invoked as sh。鸡肋。
--posix:这种情况下也是一个受严格限制的shell,系统的变量,别名通通都消失了,只有基础的某些命令可用。大家要明白一个道理,ls这些命令也是linux内核上附加的工具而已。
--version:print a version and exit
基于上面的话,已经全部讲完了。费死牛劲了。。不懂的话也没关系i,因为这些偏向于底层了,对于搞应用的人来说就是深入shell内部后可能需要这方面的知识,也许你当前的shell版本,很多选项已经不支持了,以上讲解基于3.1版本的bash。
下面我就讲述下关于shell arguments的一段概述了:
变量就是$1,$2,$3等这些变量的集合,第一个对应就是$1,依次类推。$0代表的是变量的名字,脚本不必要是可执行的,但是必须是可读的。
as follws 是介绍的是bash特有的某些语法:syntax
special files:指的是shell为登录shell的时候会读取某些配置文件
1. /etc/profile. Executed automatically at login.
2. The first file found from this list: ˜/.bash_profile, ˜/.bash_login, or ˜/.profile.
Executed automatically at login.
3. ˜/.bashrc is read by every nonlogin shell. Ho wever, if invoked as sh, Bash instead
reads $ENV, for POSIX compatibility.
这些原文文献。基本上是很好理解的。在此你也不必纠结于自己的shell是什么类型的shell了。
*:match any string of zero or more characters。匹配任意数量的字符。
?:匹配单个字符。
[abc]匹配当中的某些字符,大于等于1
[!abc]就是匹配之外的
~:当前用户的家目录,说道这点要说个事情,就是当前用户,和最初的登录用户是不一样的概念。whoami和who am i分别指的是当前用户,和最初的登录用户。su的存在,或者ssh的存在可能会切换到其他用户,而其他用户进而就会变成当前用户,而当前用户的某些环境变量问题则又是另一块需要研究的内容了,不赘述。
~name:home directory of name
~+:$PWD(pwd)
~-:$LODPWD (cd -)
上面提到的都是基础的选项,都是由某些开关来控制的,属于基础,下面所提到的选项都是扩展变量开关所控制的,(执行shopt命令,查看这些开关),如下所示:
?(pattern) Match zero or one instance of patter n.
*(pattern) Match zero or more instances of patter n.
+(pattern) Match one or more instances of patter n.
@(pattern) Match exactly one instance of patter n.
!(pattern) Match any strings that don’t match patter n.
如果想使用上面的扩展必须打开相应的开关。
这是指的是shell环境中,比如egrep和awk本身就支持这些扩展。|表示或的意思。还有很多为了支持国际化语言,还有POSIX标准,这些不再赘述,i18n,l11n,分别是国际化,和本地化,大家明白为什么是18和11么?因为这是国际化和本地化的两个单词,中间字母的个数。普及下知识。有几个通配符(wildcards的例子)
ls new*,cat ch?,vi [D-R]* pr !(*.o|core)|lp
#######################################################################
quoting:
;command separator
&background execution
()command grouping
|pipe
<> & redirection symbols
*?[]~+-@!文件通配符,包括扩展的
"' \used in quoting other characters
``command subsitution
$ variavle substitution(cmd or arithmetic substitution)
space tab newline word separators
" " Ev erything between " and " is taken literally, except for the following characters that
keep their special meaning:
$ Variable (or command and arithmetic) substitution will occur.
‘ Command substitution will occur.
" This marks the end of the double quote.
’ ’ Ev erything between ’ and ’ is taken literally, except for another ’. You cannot embed
another ’ within such a quoted string.
\ The character following a \ is taken literally. Use within " " to escape ", $, and ‘.
Often used to escape itself, spaces, or newlines.
这个是quoting的解释,中文翻译过来英文总是存在很多的误差,比如单引号是可以屏蔽所有特殊字符的含义,但是它自身却不能被自身所屏蔽,这个在中文的很多shell文章翻译中都没提到,导致哥又一次工作处理特殊的文件名字的脚本的时候,老是报token错误。坑爹啊。剩下的翻译基本上ok。
$""和""是差不多的。差不多的含义是显示的时候是会带有""的,而纯粹的是不带有双引号的。
$``和``是差不多的。但是$``处理的是如下的字符:
Sequence Value Sequence Value
\a Alert \t Tab
\b Backspace \v Vertical tab
\c X Control character X \nnn Octal value nnn
\e Escape \xnn Hexadecimal value nn
\E Escape \’ Single quote
\f Form feed \" Double quote
\n Ne wline \\ Backslash
\r Carriage return
examples:
引用:
echo 'single quotes "protects" double quotes'
echo "well,isn't that \"special\""
echo "you have `ls |wc -l`files in `pwd`"
echo "the value of \$x is $x"
cmd & Execute cmd in background.
cmd1 ; cmd2 Command sequence; execute multiple cmds on the same line.
{ cmd1 ; cmd2; } Execute commands as a group in the current shell.
(cmd1 ; cmd2) Execute commands as a group in a subshell.
cmd1 | cmd2 Pipe; use output from cmd1 as input to cmd2.
cmd1 ‘cmd2‘ Command substitution; use cmd2 output as arguments to cmd1.
cmd1 $(cmd2) POSIX shell command substitution; nesting is allowed.
cmd $((expression)) POSIX shell arithmetic substitution. Use the result of expression as
argument to cmd.
cmd1 && cmd2 AND; execute cmd1 and then (if cmd1 succeeds) cmd2. This is a
“shor t circuit” operation: cmd2 is never executed if cmd1 fails.
cmd1 || cmd2 OR; execute either cmd1 or (if cmd1 fails) cmd2. This is a “shor t
circuit” operation; cmd2 is never executed if cmd1 succeeds.
! cmd NOT; execute cmd, and produce a zero exit status if cmd exits
with a nonzero status. Other wise, produce a nonzero status when
cmd exits with a zero status.
最后一条非常有意思。大体i意思就是本来一条命令被正确执行,但是退出的正确状态是0,但是加上!之后就是退出的状态是非0.
例子:
nroff file>file.txt &(nroff是转换编码方式,比如utf-8之类的,具体查看man nroff)
cd;ls
(date;who;pwd)>logfile
sort file|pr -3|lp
vi `grep -l ifdef *.c`
egrep '(yes|no)' `cat list`
egrep '(yes|no)' $(cat list)
egrep '(yes|no)' $( grep xx file && lp file grep xx file || echo "xx not found" ###################################### redirection forms: 0 standard input 1 standard output 2 standard error cmd >| file Send output of cmd to file (overwrite), even if the shell’s noclobber option is set.这里面我只说这一个,就是这个强制重定向。即使是只读的。 除了012三个文件描述符,还有3-9用户可以自行使用的文件描述符,可以用来定义输入和输出。 exec 3>& 3>test.txt(定义了一个标准输出,输出到一个test.txt文件当中去)可以关闭这个标准输出。自我感觉用途不甚大,有机会可以自行研究。 例子: cat part1>book cat part2 part3>>book mail tim sed 's/^/xx /g'< > > >END_ARCHIVE echo "usage error:see administrator" 1>&2 find / -print >filelist 2>no_access