shell总结

目录
常见错误
数组和字符串
基本语法-括号
循环,判断和分支
子函数
正则
文件读写
面试题

正文:

1 常见错误
1) 定义变量不能有空格
colon =`grep ":" "$result1"`   # 注意colon后面的空格算成单词.
colon=`grep ":" "$result1"` 
2) 中括号两遍必须有空格
if [ "$colon" -eq "0" ]
如果是||比较是   if [ "$colon" -eq "0" ] || [ "$linenum" -eq "1" ]
不是 if [ "$colon" -eq "0" || "$linenum" -eq "1" ]
3) 数值计算
i++ 
((i=i+1))
4) eval使用
所以此时我们需要通过使用eval来解决该问题,eval添加到语句的开头,在执行该语句的时候,会扫描两次该语句:第一次扫描能够替换变量对应的值,第二次扫描就是为了识别语句并运行该语句.
例子:awk的结果传给shell
string:ACCESS=Access
                abce=`echo $result1 |awk -F '=' '{printf("gs=\"%s\";a=\"%s\"",$1,$2)}'`
                eval $abce
echo "line39:$gs;$a;result1=$result1"
3 传参解析(同perl):$#参数个数,$@所有参数,参数$1,...
while getopts "a:b:cdef" opt; do
case $opt in
a) echo "this is -a the arg is ! $OPTARG";;
b) echo "this is -b the arg is ! $OPTARG";;
.......
4 数组和字符串
4.1 数值,string 比较
4.2  数组取值
                for ((i=0;i<${#arr[@]};i++))
                do
                        name=`echo ${arr[$i]} |awk -F '=' '{print $1}'`
                        gs=$gs";"$name
                        echo "line22:${arr[$i]};$name;$gs"
                done
不是$arr[i]
eval ehco \$$# $#是数组最后的
arr=$_str string 转array.$#arr 即数组长
${#file} string length
4.3 数组和字符串转换
#!/bin/ksh
set -A a
b="1 3 5 7 9"
a=($b) //这是string 转成数组在ksh93
ksh88必须这样的才行,在string 转成数组的时候
b="1 3 5 7 9"
set -A a  $b
------
echo ${array[@]}//print 整个数组
Array[3] = "a b c" 
echo $Array[1]  输出b,
str=“a b c”
Array = ($str)
echo$Array[1],同样输出b,
要注意: Array = ($str)中的右值的括号不能缺
上面这个就是我们常说的把字符串放到一个数组中,也可以理解为动态数组,比C和C++简单多了

数组常见错误
typeset -i i=0
cnt=2
for ($i=0; $i<$cnt;$i++) {
       echo "123"
}
temp.sh[4]: syntax error at line 4 : `(' unexpected
shell没有for()这种用法。
while ((i<cnt))
do
    echo "123"
    ((i=i+1))
done
这是ksh93之后的语法
之前的话,(())用expr代替。
5  基本语法 
循环,判断和分支
for file in *.c;do  echo $file;gcc -o$(basename $file.c)$file ;sleep 2;done>compile 2>&1
break;continue
6 括号:大括号,小括号,中括号
(1) 小括号
1) 用于初始化数组。如:array=(a b c d)
2) $()等于``执行命令
3) (())表示计算在ksh93.
(2) 中括号
1) []表示test 。执行
[ expreession ] 执行。 
[ "$A" = 123 ] string test
["$A" -eq 123] integer
[-e "$A" ] file
[ -n string ] string is > 0 is true
2) []数组下标
3) [[]] 支持模式匹配比较[[ hello == hell? ]] .多个判断 [[ &&/||>||< ]]
(3) 大括号
1)这时应该用变量的原形:${var},即是加一个大括号来限定变量名称的范围,如下 $ echo ${var}AA
2) 模式识别${}
${string%substring}
从$string的结尾位置截掉最短匹配的$
3) 子函数的代码段
abc ()
{
}
4) string 长度
${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:3:7} abunga
6 重定向 &1,&2
ls a 1 >file 2>&1 ; ls file 2>file >&2 ;>/dev/null 2>&1
exec 2 >file ;set -x; set +x
7 正则表达式
awk正则,string length($0),substr, -F, print $1 提取列
模式识别*
${varible##*string}     ---   从左向右截取最后一个string后的字符串
${varible#*string}       ---   从左向右截取第一个string后的字符串
${varible%%string*}   ---   从右向左截取最后一个string后的字符串
${varible%string*}      ---   从右向左截取第一个string后的字符串
“*”只是一个通配符可以不要
8 ret 和$?即输出和返回值的区别
ret=·find * -name "*.sh" -print
ret 表示output。$?表示执行是不是成功.
$? is 0;ret: extlab.sh
other:1) 转义字符 在"$a" 需要"\$a"
2) ``和$() 执行
3) 多条shell命令放到一起写。这些命令分开写也行。
set -A LAB_LIST $((cd /opt/cool/loaddata; ls *.par | sed 's/.par$//';egrep -v "^#|^$" ${TOOL_DIR}/data/ECPLenvironment |cut -d';' -f4) | sort -u)
  一下批量执行几个shell
8 文件读写

1

while read line
do
   echo "line=$line"
done<'ls -l /home/felixzh'
ls -l /home/felix/ |while read line
do
  ....
done

<后面跟的是文件名
|是管道
list=`ls -l $path`
然后<$list

ls -l $path不是文件,是一种输入stdout
没有文件名,不能叫文件.

shell 从file descriptor read data. 3是文件描述符
 exec 3< $GUI2CMD_PIPE
 while read -u3 data
 do
  echo $data
 done

将文件的SRCCversionFile的内容,读入变量中
SRCCversionFile=$(cvp -r cool/NGNsrcc_lib/version 2>/dev/null)
SupportedVersion=$(< $SRCCversionFile)

使用"|"管道操作符, 将I/O流重定向到一个子shell中, 比如ls -al | (command).

其他参考

http://blog.csdn.net/xj178926426/article/details/6925770

第二部分 面试题

在目录/ tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中

  1. #!/opt/exp/bin/perl -w

  2. local *DH;

  3. $cwd="/bld/felixzh/temp/shell/";

  4. sub readline1 {

  5. $file1=shift;

  6. print "file1=$file1\n";

  7. if (!open ($fd1,"<$file1")) {

  8. warn "open file fail \n";

  9. return undef;

  10. }

  11. $line1=<$fd1>;

  12. # @lineall=<$fd1>;

  13. # print "line1=$line1\n";

  14. # print "lineall=@lineall\n";

  15. writeline1($line1);

  16. close($fd1);

  17. }

  18. sub writeline1 {

  19. $line2=shift;

  20. if (!open($fd2,">>$file2")) {

  21. warn "open file fail\n";

  22. }

  23. print $fd2 "$line2";

  24. close($fd2);

  25. }

  26. if (!opendir(DH,$cwd)) {

  27. warn "cannot opendir $cwd:$! $^E";

  28. return undef;

  29. }

  30. $file2=$cwd."line2.txt";

  31. print "file2=$file2\n";

  32. system "touch $file2";

  33. foreach ( readdir(DH) ) {

  34. if ($_ eq '.' || $_ eq '..') {

  35. next;

  36. }

  37. my $file = $cwd.'/'.$_;

  38. # print "$file \n";

  39. if (/^s/) {

  40. #read file line1

  41. &readline1 ($file);

  42. }

  43. }

  44. closedir(DH);

  45. ============================================

  46. shell

  47. path="/bld/felixzh/temp/shell"

  48. str=`ls $path |egrep '(^s)'`

  49. #change string to arry

  50. set -A a ${str}

  51. set -A b

  52. #it only string assign to array's element

  53. #a=$str

  54. t=0

  55. for item in $str

  56. do

  57. t=`expr t+1`

  58. b[$t]=$item

  59. done

  60. echo "${b[@]}"

  61. exit

  62. #print all array

  63. echo "${a[@]}"

  64. #array length

  65. cnt=${#a[@]}

  66. echo "cnt=$cnt"

  67. wfile="$path/line1.txt"

  68. typeset -i i=0

  69. while [ "$i" -lt "$cnt" ]

  70. do

  71. print "${a[$i]};i=$i\n"

  72. line1=`cat ${a[$i]} |head -1`

  73. echo "line1=$line1\n"

  74. echo "$line1" >>$wfile

  75. i=i+1

  76. done

把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数

  1. #!/opt/exp/bin/perl -w

  2. $cwd="/bld/felixzh/temp/perl";

  3. open ($fd1,"<$cwd/email1.txt");

  4. open ($fd2,"<$cwd/email2.txt");

  5. open ($fd3,">>$cwd/emaildiff.txt");

  6. system (">$cwd/emaildiff.txt");

  7. @a=<$fd1>;

  8. @b=<$fd2>;

  9. $i=0;

  10. $a1=@a;

  11. $b1=@b;

  12. sub match {

  13. $tline=shift;

  14. $j=0;

  15. while ($j<$b1) {

  16. if ( "$tline" eq "$b[$j]" ) {

  17. return 1;

  18. }

  19. $j++;

  20. }

  21. return 0;

  22. }

  23. while ( $i<$a1 ) {

  24. $line1=$a[$i];

  25. $result=&match($line1);

  26. print $fd3 $line1."\n" if (!$result);

  27. $i++;

  28. }

  29. system ("wc -l $cwd/emaildiff.txt");

  30. ======================

  31. cwd="/bld/felixzh/temp/perl"

  32. t1="$cwd/email1.txt"

  33. t2="$cwd/email2.txt"

  34. typeset -i i=0

  35. typeset -i j=0

  36. typeset -i k=0

  37. typeset -i t=0

  38. >"$cwd/emailsdif.txt"

  39. while read line1

  40. do

  41. a[$i]=$line1

  42. a[$i]="$line1\n"

  43. # printf "${a[$i]}"

  44. i=`expr $i+1`

  45. done<$t1

  46. k=$i

  47. i=0

  48. while read line2

  49. do

  50. b[$j]=$line2

  51. b[$j]="$line2\n"

  52. j=`expr $j+1`

  53. done<$t2

  54. t=$j

  55. function match1

  56. {

  57. tline=$1

  58. j=0

  59. while [ "$j" -lt "$t" ]

  60. do

  61. if [ "$tline" == "${b[$j]}" ]

  62. then

  63. return 1

  64. fi

  65. j=`expr $j+1`

  66. done

  67. return 0

  68. }

  69. while [ "$i" -lt "$k" ]

  70. do

  71. line1=${a[$i]}

  72. match1 "$line1"

  73. if [ $? -eq 0 ]

  74. then

  75. echo $line1>>$cwd/emailsdif.txt

  76. fi

  77. i=`expr $i+1`

  78. done

  79. wc -l $cwd/emailsdif.txt

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值