一、shell命令
1.$ date        显示时间
2.$ who         查看登陆系统的用户
  $ who am i    查看自己的信息
3.$ echo        在终端机上显示键入在命令行的任何信息,会去掉单词中的空格
  例如:$echo this is test
  显示  this is test
4.$ ls 列出文件清单
5.$ cat (查看的文件名称)   显示文件内容
6.$ wc  (参数 -l 行数 -c 字符数 -w 单词数) (统计的文件名称)    统计文件中的行数,字符数,单词数
7.$ cp (源文件)  (目标文件)  复制命令
8.$ mv (源文件) (目标文件) 文件重命名命令,也可以移动文件的位置
9.$ rm 删除命令
10.$ pwd 显示当前工作目录
11.$ cd 改变当前工作目录
12.$ mkdir 创建目录
13.$ rmdir 删除目录(目录为空)
14.$ rm 删除文件 加参数 -r 删除目录和目录中的文件
15.替换符合:* 替换为目录中的所以文件的文件名。单字替换符合:? 替换单字。[abc]替换 a 或 b 或 c 。[0-9] 匹配0-9的任意字符。如果 [ 后的字符是 !,表示反过来匹配,即可以匹配除方括号中所列字符以外的任何字符。
16.ln:链接命令。(优点,减小系统占有,使文件同步)
一般格式:ln from to 把文件from 和文件to 链接起来。
连接的限制是必须位于同一个文件系统,连接后对于任何一个文件的改变都会影响的另一个文件,但是删除任何一个文件,另一个文件依然存在,不受删除的影响。(判断系统中有那些文件系统用 df 命令)
不同的系统进行连接加参数 -s ,建立一个符合化连接。此连接与普通连接很相似,不同的是,删除源文件后,该符合连接就不起作用了。
17.输出的重新定向:命令德输出通常提交到标准输出设备,也可以很方便德转向一个文件来代替,这叫输出重新定向。
命令:在把输出写入到标准输出德命令后加 > filename
例如:$ who >filename
>> 符号为不覆盖原来的文件内容
$ > filename ,前面没有命令时,shell会创建一个空的文件(长度为0个字符),如果文件已经存在,其内容会消失。
18.输入重定向:对应于输出的重新定向的就是输入重定向,命令符合是 <
例如:$ wc -l < filename
19管道:unix系统可以把两条命令的的效果连接起来,这种连接称作管道。
例如:$ who | wc -l
      $ ls | wc -l
20.过滤器:指能够从标准输入接受输入,对输入进行处理后,把结果写入标准输出的任何程序。wc , cat ,sort 是过滤器,ls,who,date,cd,pwd,echo,rm,mv,cp都不是。
21.标准错误:unix把大部分错误信息都写的这里,标准错误默认也是终端。
把错误输入到文件试用命令格式:命令 2> 文件
例如:$ls n* 2> filename
22.一行键入多个命令,用;号分割
例如:$ date ;pwd
23.命令发送到后台:在命令后加一个 & 号,该命令就发送到后台了。
例如:$ date >> filename &
24:ps命令:查看进程的命令,参数 -f 查看父进程的命令
例如:$ ps -f
25.正规表达式
:%s/old/new/g  注:g是全部替换  或 :%s/old/new   全部替换:看vi说明
ifconfig用root用户登陆查看本机的ip地址



26.cut:从文件中剪出各种各样的数据 【cut -cdhars file】
cut -c5- data  把data文件中的每一行的第五个到行尾的字符剪出来,并把结果写入标准输出
who | cut -c1-8 剪出who的输出的每一行的第一个到第八个字符
who | cut -c1-8 | sort 剪出who的输出的每一行的第一个到第八个字符,并进行排序
cut -d: -f1 /etc/passwd 剪出/etc/passwd 中的以:开头的第一个字段
cut -d: -f1,6 /etc/passwd 剪出/etc/passwd 中的以:开头的第一个字段和第六个字段
27.paste 把多个行合并起来,然后输出   【paste files】
paste names numbers 将两个文件合并,然后输出
paste -d'+' names numbers 将两个文件合并中间用+号连接,然后输出
paste -s names 将一个文件所有行合并,然后输出
ls | paste -d' ' -s - 把ls的输出用合并一行并用空格分开。
28.sed 是用来编辑数据的程序,意思是流编辑器。sed不能用于交互。【sed command file】。
sed 's/unix/UNIX/' intro 将unix改为UNIX
sed不对原始文件进行更改,要保存更改,必须把sed的输出重定向到一个临时文件,然后把临时文件移回原来的文件。
sed 's/unix/UNIX/' intro > temp
mv temp intro
sed -n '1,2p' intro 显示前两行
sed -n '/unix/p' intro p命令前用斜扛括住字符串,sed只从标准输入中显示包含这些字符的行。
sed '1,2d' intro 要删除正行,用d命令。删除1,2行
29.grep:从一个或多个文件中搜索特定的字符串。【grep pattern files】
grep shell ed.cmd 从ed.cmd中找出shell所在行
grep '[A-Z]' list list中包含一个大写字母的行
grep '[0-9]' list list中包含一个数字的行
grep '[A-Z]...[0-9]' list list中包含以大写字母开头,数字结尾的5个字符组合的行
grep '\.pic$' filelist filelist中以.pic结尾的行
grep -v 'unix' intro 显示不含unix的行
grep -l 'move_history' *.c 列出包含'move_history' 变量的行
grep -n 'move_history' *.c 列出包含'move_history' 变量的行,前面加行号。
30.sort 输出进行排序
sort -u names 输出中去掉重复的行
sort -r names 反序排序
sort names -o new_names 将结果输出到new_names中
sort -n data 安算术方法排序
sort +1n data 跳过第一个字段排序
31.uniq查找连续的重复行。【uniq in_file out_file】
sort names|uniq -d  显示重复的行
二、shell编程起步
1.要让文件可以执行,要改变文件的许可
chmod +x nu 改变文件nu的许可,然后在当前目录下键入【./nu】即可执行
2.注释符合为#号
3.变量:以字母或下划线开头,后跟0个或若干个字母、数字、下划线字符。【variable=value】
count=1 注意=号两边不能有空格,linux中没有数据类型的概念。
4.显示变量的值【echo $vairable】$符合不能掉了
echo $count
5.空值:如果一个变量没有值,我们就说它含有空值,这是变量没有赋值时的默认值。
6.文件名替换和变量:shell先做变量替换,后做文件名替换。
7.$(variable)结构
假定把一个文件名存于变量filename中,要在文件名后加X
mv $filename ${filename}X   给文件名后加X
8.内部的整数算术运算【$((espression))】
例如:echo $((a=a+1))  应为a没有赋值,所以结果是1,等价于a=0+1
表达式中可以随意使用括号来强制分组,例如:echo $((i=(i+10)*j))
如果不想用echo或其他的什么命令而想直接给变量赋值,可以把赋值移到算术扩展前面
例如:i=$((i*5))
判断表达式:result=$((i >= 0 && i<= 100)),为真是result=1,为假result=0。
三、引用
1.单引号:
作用(1、)让本来需要用空格分割的字符合在一起
例如:grep 'susan goldberg' filename 从filename中找出叫susan住址是goldberg的人(filename中有两个susan的人),如果使用(grep susan goldberg filename),将报错(grep:can't open goldberg)。当shell看到第一个单引号时,忽略掉其后直到右引号的所有本来有特殊作用的字符。
echo '*' 输出 *
echo '$file' 输出 $file
2.双引号:双引号不忽略一下三种符合(美圆符合、反引号、反斜扛)
例如:x=*
echo $x  输出 当前的文件名
echo '$x' 输出 $x
echo "$x" 输出 * (双引号告诉shell在引号内照样进行变量的替换,所以shell把$x替换为*,因为引号中的不做文件名的替换,所以就把*号做为要显示的值传递给echo)
如果想替换变量的值,又不想shell把替换的内容做特殊字符对待,就应该把变量名括在双引号中。
可以用双引号来对shell隐藏单引号,反之亦然。
例如:x="'hello,'said"
echo $x 输出 'hello,'said
x='"hello,"saidfff'
echo $x 输出 "hello," saidfff
3.反斜扛:反斜扛等价于在一个字符前后加上一个单引号,也有一些例外。
例如:echo > 报错
echo \> 输出为 >
x=*
echo \$x 输出 $x
特殊:shell把行尾的反斜扛作为续行,它去掉根在后面的换行字符,也不把换行字符当作参数分隔符。这种结构在分行键入长命令时经常使用。
双引号中的反斜扛:作用去掉字符的特殊意义。
例如:x=5
echo "the value of x is \"$x\""    \"$x\"等价于$x
输出 the value of x is "5"
4.命令替换:命令替换是指shell能够将一个命令的标准输出插入在一个命令行的任何位置的功能。shell有两种方法作命令的替换:把shell命令用反引号或者$(...)结构括起来。
反引号是告诉shell执行括起来的命令,并将括起来的命令的标准输入插入到这个位置。【`command`】
例如:$echo the data is:`date`
$(...)结构:例如(echo the is:$(date))
$(...)结构可以嵌套:echo the are $(who | wc -l) user logged in
处理echo 命令行的过程中,shell在进行替换时将换行字符去掉了,在变量外括上双引号可以保留换行字符。
例如:namelist=$(cat names)
echo "$namelist"   输出的结果有换行字符的
5、expr 用来进行算术的运算的
例如:expr 1+2 结果是3
expr "17*5" 输出是17*5
expr 17\*6  结果是102
例如:i=1
i=$(expr $i + 1)
echo $i     结果是2
以大Z结尾的压缩文件的说明:压缩命令compress 文件名,解压uncompress 文件名
adduser是增加使用者.
touch filename 作用是重新读取文件
                        第七章  参数传递
1、$#变量里存储的是命令行中所键入的参数的个数
2、$*变量里存储的是命令行中所键入的所有的参数
3、echo "$1        $2" >> filename 【将$1和$2的变量添加到filename文件的后面】
   sort -o filename filename 【增加新项后的新文件保持有序】
4、删除文件中的数据
grep -v "$1" phonebook > /temp/phonebook
mv /temp/phonebook phonebook
【删除文件中指定名字的行,然后将文件重新定向,再次覆盖源文件。grep -v "$1" phonebook,输出phonebook中不含"$1"的数据行,> /temp/phonebook,将输出写入到根目录下的temp文件夹下的phonebook文件里,然后将当前目录下的phonebook文件用 /temp/phonebook文件覆盖掉】
5、如果要给一个程序传递9个以上的参数,不能用$10,$11,要用${n},例如:${10},shell将$10替换成$1的值后面跟一个0。
6、shift命令的作用是把位置参数左移。
当执行shift时,$2的值的将赋给$1,$3的内容将赋给$2,$1的值将丢失。
通过shift后跟一个数字,可以一次移动几个位置,shift 3,相当与shift shift shift
                        第八章  判断
1、if命令
【if command(0表示成功,非0表示失败)
  then
        command
        command
  fi

2、$?变量
shell自动将最后执行的命令的退出状态设置到shell变量$?中,可以用echo命令在终端上显示出来。
3、test命令:【test expression】,其中expression表示要测试的条件。test计算expression,如果结果是真,其返回值是0;如果为假,返回值是非0。
注意:test把所有操作数和操作符作为单独的参数分别对待,也就是说他们之间至少要有一个空白字符分隔。
例如:test "$name" = rose 。把给test的参数中的shell变量用引号括起来,可以保证在参数为空时,仍然知道有这个参数。
4、检测字符串的操作符

5、test的另一个格式
test expression 等于 [ expression ]
例如:if [ "$name" = rose ]
        then
                echo "name is rose"
      fi
6、test 整数操作符

7、test的常用文件操作符

8、逻辑非操作符!
可以把一元的逻辑求非操作符放在其他任何test表达式之前,对这个表达式的结果求非。
例如:/home/phonebook不可读的话,[ ! -r /home/phonebook ] 返回的退出状态为0(真)
9、逻辑与操作符 -a
操作符 -a对两个表达式做逻辑与操作,如果两个表达式都为真,则返回真。
例如:$file 代表的文件是普通并可以读取的文件, [ -f "$file" -a -r "$file" ] 返回真。
10、小括号
test命令中可以用小括号改变求值的顺序,只是要保证把小括号用引号括起来。
例如: [ \( "$number" -ge 0 \) -a \( "$number" -lt 10 \) ]就是 0 =< number < 10。
11、逻辑或操作符 -o
和-a类似,两个表达式中一个为真,他求的结果就是真。 -o的优先级小于-a 。
12、else结构
【if command1
  then
        command
        command
  else
        command
        command
  fi】
13、exit命令
【 exit n 】
exit命令可以立即终止shell程序的执行,n为希望返回的退出状态。如果不指定,就采用exit之前最后所执行命令的退出状态。
14、elif结构
【if command1
  then
        command
  elif command2
  then
        command
  else
        command
  fi】
15、case命令
【case value in
        pat1) command
              command;;
        pat2) command
              command;;
        *) command;;【没有匹配项时,执行这个命令】
esac】
把value依次和pat相比较,直到发现一项匹配,就执行该匹配项后直到双分号之间的所有命令,执行到双分号后,该case语句就结束;如果没有发现匹配的,则case语句的命令一条也不执行。
16、sh -x 后面跟程序名及其参数,可以对程序进行调试。
17、|符号,当把|用于两个模式之间时,其作用是逻辑或,即模式pat1 | pat2,表示要匹配pat1 或 pat2
例如:hour=$(date +%H)
      case "hour" in
        0? | 1[01] ) echo "good morning";;
        1[27]      ) echo "good afternoon";;
        *          ) echo "good evening";;
      esac
根据时间给出问候。
18、空命令
【:】就是单冒号。
shell 要求then后必须有一条命令,这就是空语句的用武之地。
例如:if grep "'^system" /user/systems #希望验证文件/user/systems中是否包含变量system,如果不包含,发出错误信息。
      then
        :
      else
        echo "$system is not a valid systems"
        exit 1
      fi
19、&&和||结构
【command1 && command2】如果command1返回的是0,就执行command2。如果command1返回的不是0,就跳过command2。
【command1 || command2】如果command1返回的非0,就执行command2。如果command1返回的是0,就跳过command2。
当在if中用||时,她的作用相等于,逻辑或。
20、让程序在后台运行,使用命令:【filename &】就行了。