分享

读《Linuxshell脚本攻略》第一章有感

 风雪夜归人_95 2013-11-09
      最近闲来无事,研究了一下Linuxshell。这段时间读了第一章,把自己的一些体会记录下来。显然,读这一章我还没有习惯作者这种写法。过去看书都喜欢系统的学习,由浅入深,循序渐进,但是读了第一章,感觉更多的是一种积累,就像我们背单词一样,有些基础的东西,需要你记住。所以,这些知识点之间就缺乏内在的逻辑性。但就像我们背单词一样,不得不掌握。因为看的是原版,有些东西没看懂,就直接把相关的命令在linux上试了一下。下面就来总结一下我认为值得注意的。
     Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。
知识点1:echo
echo是最常见的命令。就相当于C语言里面的printf。
echo -n 不换行输出,忽略结尾的换行符
 echo -e 处理特殊字符
 
知识点2:打印彩色输出
前景色:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37
echo -e "\e[1;31m This is red text \e[0m"
背景色:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47
echo -e "\e[1;42m Green Background \e[0m"
 
知识点3:let命令
let命令是用来赋值的,如let result=no1+no2 。但这里的运算只能用为整数,若要做浮点运算,需要用到下一个知识点。
 
知识点4:| bc
echo "scale=2;3/8" | bc (可用scale来设定小数点保留几位)
进制转换可用echo "obase=10;ibase=2;$no" | bc;obase代表要转换的进制,ibase代表现在的进制
 
知识点5:> 和 >>的区别
前者清空重定向到的文件然后写入加入的内容,后者则是在原文件的末尾加上待加入的内容
 
知识点6:File descriptors(文件标识符)
File descriptors 中的0、1、2被保留下来了
0 代表stdin ;1代表stdout ;2代表 stderr
ls + > out.txt 错误信息只会显示在窗口而不在文件中
ls + 2> out.txt 错误信息则出现在文件中
 
知识点7:/dev/null
任何文件丢到这个路径下都被丢弃
 
知识点8:tee命令
显示程序的输出并将其复制到一个文件中。tee [-a] [-i] [file]; -a 将输出添加到file的末尾而不是覆盖写入, -i 忽略中断。命令返回值:0代表成功;>0发生错误
 
知识点9:将多行内容重定向到一个文件中
可以使用
#!/bin/bash
cat <<EOF > xxx.txt
....
....
EOF
 
知识点9:自定义标识符(Custom file descriptors)
使用exec命令自定义某个文件的标识符
exec 3<input.txt
cat <&3       (<、$、3之间是不能有空格)
或者 exec 4>output.txt
     echo ... >&4
     cat output.txt
 
知识点10:关联数组
这个数组和一般的数组的区别在于index可以是字符串,其他的性质与普通数组相同
 
知识点11:alias命令
alias命令可以将一串命令动作赋值为一个命令来执行。但是这种方式是暂时的,若要长期保存,则需要将alias命令保存到~/.bashrc文件中。任何命令都可以被alias,这也成为了一些黑客利用的手段。所以在不安全的环境下,可在一般的命令前加上“\”,如“\ls”,则可以escape the command
 
知识点12:subshell方法的定义
1.cmd=$(ls | cat -n)
2.cmd=`ls | cat -n`   注意这里不是单引号而是tab 键上面的那个字符
3.(cd /bin; ls);     在终端输入命令时加上()即可,不会改变当前shell的路径
 
这里遇到了一个问题,书上有个例子有关第一个命令和cmd="$(ls|cat -n)"的区别,但通过实践我没发现这个区别
这是书上的例子:
$ cat text.txt
1
2
3
$ out=$(cat text.txt)
$ echo $out
1 2 3 # Lost \n spacing in 1,2,3
$ out="$(cat tex.txt)"
$ echo $out
1
2
3
Reading
我还不知道什么原因。
 
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多