Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2860855
  • 博文数量: 178
  • 博客积分: 2076
  • 博客等级: 大尉
  • 技术积分: 2800
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-10 10:50
文章分类

全部博文(178)

文章存档

2010年(4)

2009年(13)

2008年(161)

我的朋友

分类: LINUX

2008-07-30 15:56:51

SHELL中,空串与没有设置的变量的长度都为0 :
 
TE=""      #TE为空串  
[ -z $TE ] && echo "yes"
           #A没有声明,即没有设置 
  [ -z $A ] && echo "a"
RESULT:
 YES
 A
 
 ################################
4. 關於兩個整數之間的判定,例如 test n1 -eq n2
-eq 兩數值相等 (equal)
-ne 兩數值不等 (not equal)
-gt n1 大於 n2 (greater than)
-lt n1 小於 n2 (less than)
-ge n1 大於等於 n2 (greater than or equal)
-le n1 小於等於 n2 (less than or equal)
 
 
SU=0
for (( i=1; i<100; i++  ))
 do
     SU=$(($SU +$i))
 done
      echo $SU
 
 
 
 
arrayZ=( one two three four five five )
12
13 echo
14
15 # 提取尾部的子串
16 echo ${arrayZ[@]:0} # one two three four five five
17 # 所有的元素.
18
19 echo ${arrayZ[@]:1} # two three four five five
20 # 在第一个元素 element[0]后面的所有元素.
21
22 echo ${arrayZ[@]:1:2} # two three
23 # 只提取在元素 element[0]后面的两个元素.
 
子串删除
 
# 从字符串的前部删除最短的匹配,
29 #+ 匹配字串是一个正则表达式.
30
31 echo ${arrayZ[@]#f*r} # one two three five five
32 # 匹配表达式作用于数组所有元素.
33 # 匹配了"four"并把它删除.
34
35 # 字符串前部最长的匹配
36 echo ${arrayZ[@]##t*e} # one two four five five
37 # 匹配表达式作用于数组所有元素.
38 # 匹配"three"并把它删除.
 
 
字符串尾部的最短匹配
41 echo ${arrayZ[@]%h*e} # one two t four five five
42 # 匹配表达式作用于数组所有元素.
43 # 匹配"hree"并把它删除.
44
45 # 字符串尾部的最长匹配
46 echo ${arrayZ[@]%%t*e} # one two four five five
47 # 匹配表达式作用于数组所有元素.
48 # 匹配"three"并把它删除.
49
50 echo "-----------------------"
51
52 # 子串替换
53
54 # 第一个匹配的子串会被替换
55 echo ${arrayZ[@]/fiv/XYZ} # one two three four XYZe XYZe
56 # 匹配表达式作用于数组所有元素.
57
58 # 所有匹配的子串会被替换
59 echo ${arrayZ[@]//iv/YY} # one two three four fYYe fYYe
60 # 匹配表达式作用于数组所有元素.
61
62 # 删除所有的匹配子串
63 # 没有指定代替字串意味着删除
64 echo ${arrayZ[@]//fi/} # one two three four ve ve
65 # 匹配表达式作用于数组所有元素.
66
67 # 替换最前部出现的字串
68 echo ${arrayZ[@]/#fi/XY} # one two three four XYve XYve
69 # 匹配表达式作用于数组所有元素.
70
71 # 替换最后部出现的字串
72 echo ${arrayZ[@]/%ve/ZZ} # one two three four fiZZ fiZZ
73 # 匹配表达式作用于数组所有元素.
74
75 echo ${arrayZ[@]/%o/XX} # one twXX three four five five
 
 
 
++++++++++++++++++++++++++++++++
基本的匹配符
 
星号 -- * -- 匹配前一个字符的任意多次(包括零次).
-- . -- 匹配除了新行符之外的任意一个字符.
-- ^ -- 匹配一行的开头,但依赖于上下文环境,可能在正则表达式中表示否定
一个字符集的意思.
美元符 -- $ -- 在正则表达式中匹配行尾.
"^$" 匹配空行.
方括号 -- [...] -- 在正则表达式中表示匹配括号中的一个字符.
 
bash$ grep '\' textfile 精锐匹配用于表示单词的边界
 
 
扩展的正则表达式.
增加了一些元字符到上面提到的基本的元字符集合里. 它们在egrep,
awk,和Perl 中使用.
问号 -- ? -- 匹配零或一个前面的字符. 它一般用于匹配单个字符.
加号 -- + -- 匹配一个或多个前面的字符.它的作用和*很相似,但唯一的区别是它不
匹配零个字符的情况.
 
+++++++++++++++++++++++++++++++++++
 
 
11 declare -a array1
12
13 array1=( `cat "$filename"`) # 加载$filename 文件的内容进数组array1.
14 # 打印文件到标准输出 #
15 #
16 # array1=( `cat "$filename" | tr '\n' ' '`)
17 # 把文件里的换行变为空格.
18 # 这是没必要的,因为Bash 做单词分割时会把换行变为空格.
19 #
20
21 echo ${array1[@]} # 打印数组.
22 # 1 a b c 2 d e fg
23 #
24 # 文件中每个由空白符分隔开的“词”都被存在数组的一个元素里
25 #
26
27 element_count=${#array1[*]}
28 echo $element_count



SHELL 变量
有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值
${color:-yellow}
设置只读变量
readonly color



#!/bin/bash
trap "my_exit" 2          #程序一开始就开启了TRAP
LOOP=0
my_exit()
{
echo "You just hit ,at number $LOOP"     #当WHILE到一定量时LOOP变为了具体数

                      #字       不                                          为0
echo "now I will exit now "
exit 1
}
i=0
while :
do
   LOOP=$(( $LOOP + 1 ))
  echo $LOOP
 done
~       
 
 
+++++++++++++++++++++++++++
read 结合 grep
 echo "enter somthing like:"
 read list
  #GREP 匹配模式 
 if echo $list |grep "<\yes\>" 1>&2 /dev/null ; then
     ..........相当于case 语句
 
 if cp backup.bak /usr/backup/ 1>&2 /dev/null; then
  echo "successfully backup"
 else
    echo "something  wrong is happen !"
fi
 
 
当作字符串处理时最好是:  引号+“=”作以判断
 
 
+++++++++++++++++++++++++++++++++++++++++++
 
case  的正值规则的符号是基本的:
* 任意字符。
? 任意单字符。
[..] 类或范围中任意字符。
“|”符号作为或命令,例如v t 1 0 0 | v t 1 0 2匹配模式v t 1 0 0或v t 1 0 2。
 
 
echo -n "do you want to play in game [Yy]"
read AN
 case $AN in
  [Yy]|[Yy][Ee][Ss])
            echo "play now"
              ;;
             *)
            echo "Usage ..."
              exit 1
              ;;
esac
+++++++++++++++++++++++++++++++++++++++++++++++++++
grep -E "abc|x." file.txt
grep  "4\{2,6\}ABC" FILE.TXT     44ABC  4444ABC .....
grep "<\精确匹配\>" file.txt
grep -n -i -v -c ...
 
 
SED ------------学习.........
 
sed 能做那些编辑动作
  sed 可删除(delete)、改变(change)、添加(append)、插入(insert)、合并、交换文件中的数据行 , 或读入其它文件的数据到文件中 , 也可替换(substuite)它们其中的字符串、或转换(tranfer)其中的字母等等。例如将檔中的连续空白行删成一行、 "local" 字符串替换成 "remote" 、"t" 字母转换成 "T"、将第 10 行数据与第 11 数据合并等。
1.4 sed 如何工作
  如同其它 UNIX 命令 , sed 由标准输入读入编辑文件并由标准输出送出结果。下图表示 sed 将资料行 "Unix" 替换成 "UNIX" ,

在图中 , 上方 standard input 为标准输入 , 是读取数据之处 ; standard output 为标准输出 , 是送出结果之处 ; 中间 sed 方块的下面两个虚线方块表示 sed 的工作流程。其中 , 左边虚线方块表示 sed 将标准输入数据置入 pattern space , 右边虚线方块表示 sed 将 pattern space 中编辑完毕后的数据送到标准输出。
在虚线方块中 , 两个实线方块分别表示 pattern space 与 sed scrīpt。其中 , pattern space 为一缓冲区 , 它是 sed 工作场所 ; 而 sed scrīpt 则表示一组执行的编辑指令。
在图中, 左边虚线方块 "Unix" 由标准输入置入 pattern space ; 接着 , 在右边虚线方块中 , sed 执行 sed scrīpt 中的编辑指令 s/Unix/UNIX/ (批注 [2]) , 结果 "Unix" 被替换成 "UNIX" , 之后 , "UNIX" 由 pattern space 送到标准输出。

  总合上述所言 , 当 sed 由标准输入读入一行数据并放入 pattern space 时 , sed 依照 sed scrīpt 的编辑指令逐一对 pattern space 内的数据执行编辑 , 之后 , 再由 pattern space 内的结果送到标准输出 , 接着再将下一行数据读入。如此重复执行上述动作 , 直至读完所有数据行为止。
DIR=/data/shell/a
RDIR=/data/shell/b
echo -n "please enter mailname:"
read mailname
#echo "$mailname">>$DIR
#remote manipulate host
ssh 60.191.33.35 "sed -i /^$mailname/d $DIR;
 echo "$mailname" >>$RDIR"
sed -n  '' -p 这是属于"找到" 打印的句子了.
当有什么删除,移动等用sed -e 's/ .. /g'  file.txt
 
 sed -e '1,3c\you enter contents'  file.txt  注意c 后不接受/g 等除数
AWK -----------学习..........
 
 
********************************************
find的 -path /var -purne
find / -path '/var/log' -prune -o -path '/var/spool' -prune -o -path "/proc" -prune -o -mtime 0
 
 
**************************************************]
SED line EXAMPLE
 
G function
在每一行后面增加一空行
this is the first line .
this is the second line
this third
five line
six line
eight line .

sed '/second/G' sedfile.txt 
 
this is the first line .
this is the second line
                                           #增加空行,其余行位置向下推
this third
five line
six line
eight line .
 
在每一行后面增加两行空行
sed 'G;G'
 
  n N    Read/append the next line of input into the pattern space.
ten line .
 例如 , sed 'n;d' file.txt  #1。SED从第一行开始,所以第一行不受此命令影响,由于n,执行第二行,然后删除。再读第三行,又不受影响,由于n......
 
 
 
 
 sed  '/2/{x}' sedfile1.txt   X将 /2/的行置空会自动打印出来,注意,因为这里没禁止自动打印选项 -n   ...p ,如果说有的庆,则需要p函数辅助打出.....此时的pattern space 为空
                               如果再加上p,则有两行空行.
1 111111111111111111
3 333333333333333333
4 444444444444444444
 
 
 

d      Delete pattern space.  Start next cycle.

 

       D      Delete  up  to  the first embedded newline in the pattern space.

              Start next cycle, but skip reading from the input  if  there  is

              still data in the pattern space.

 

       h H    Copy/append pattern space to hold space.

 

       g G    Copy/append hold space to pattern space.

 

       x      Exchange the contents of the hold and pattern spaces.

 

       l      List out the current line in a ``visually unambiguous'' form.

 

       n N    Read/append the next line of input into the pattern space.

 
 
 

sed 'y/old-list/new-list/' filename --匹配文件中出现的所有列表

替换每行第n(如果有的话)个匹配

sed "s/4/ /8" filename

 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
\n : 代表 pattern 中被第 n 个 \( 、\)(参照[附录 A]) 所括起来的字符串。例如
sed -e  's/\(test\) \(my\) \(car\)/[\2 \3 \1]/' 资料文件名   

指令中 , \1 表示 "test"、\2 表示 "my"、\1 表示 "car" 字符串。故执行后 , 数据文件的 "test my car" 被替换成 "[my car test]"。
阅读(676) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~