Linux Shell脚本攻略(第3版)

最新书摘:
  • hao
    2015-12-09
    bash -x [*.sh]打印出每行命令的当前状态定义函数:function frame(){statement}frame arg1 arg2$1 $2为参数1,参数2,往下类推.Bash支持函数递归,不过是4.0开始的。fork炸弹::(){: | : &};:
  • hao
    2015-12-09
    最常见的文件描述符是stdout,stderr,stdin.可以将某个文件描述符中的内容重定向到另一个文件描述符中。文件描述符:0-----------stdin1-----------stdout2----------stderr平时这样的重定向都默认为1,echo "Fuck you bitch!" > output.txtecho "Fuck" 1> output.txt以上两行命令效果一样,都是将stdout定向到一个文件中。还可以将某个命令的错误stderr定向到文件中:ls + 2> output.txt因为ls + 会产生错误提示打印到控制台上。这样用以上方法,错误提示就会打印到文件中去了。cmd 2>err.txt 1>out.txt以上命令是分别把错误定到err.txt中把正常输出定到out.txt中。cmd 2>&1 output.txt以上命令是把stderr转换到stdout,所以才使得,错误和正常输出都定向到文件中。将文件充定向到命令,文件充的内容当作cmd的stdin读入。cmd < file自定义文件描述符---文件描述符是指向文件的一个抽象指针exec 3< input.txt 使用文件描述符3以读取的方式打开input.txt文件cat <&3 使用文件描述符3把描述内容导入cat,cat产生输出,意思就是输出input.txt文件的内容exec 4> input.txt 创建一个文件描述符4,以写入方式打开。echo "Hello" >&4 向文件描述符4中写入Hello,也就是向input.txt中写入Hello。exec 5>> out.txt创建一个文件描述符5,以追加模式打开。echo "new li...
  • hao
    2015-12-08
    let运算符可以直接进行数学计算,这样变量名前也不需要$。let result=var1+var2 let var++let var--let var+=6let var-=4其他方法:result=$[ no1 + no2 ] result=$[ $no1 + no2 ]result=$(( no1 + no2 )) result=`expr 3 + 4`result=$(expr $no1 + 3) 以上都只能支持整数,不支持浮点数,要支持需要这样,利用bc这个高级点的工具:echo "4 * 0.56" | bcno1=5;result=`echo "$no1 * 1.5" | bc`可以设定经度范围echo "scale=2; 3/8" | bc保留2位小数进制转换echo "obase=2;100" | bc 十进制100转换成二进制echo "obase=10;ibase=2;1100100" | bc 二进制输入转十进制输出计算平方和平方根echo "sqrt(100)" | bcecho "10^10" | bc
  • hao
    2015-12-08
    root用户的$UID是0if [ $UID -ne 0 ];then echo "not a root user"else echo "is a root user"fi
  • hao
    2015-12-08
    echo "${#var}" var是变量名。
  • hao
    2015-12-08
    环境变量是未在当前进程中定义,而从父进程中继承过来的。用export导出一个环境变量,这样就可以被子进程继承了。$PATH环境变量通常定义在/etc/enviroment或/ect/profile,~/.bashrc中。如果要在$PATH中新增一条,可以export PATH=”$PATH:/home/usr/bin“。
  • hao
    2015-12-08
    变量赋值 var=value 如果value中有空格,必须用单引号或双引号包含起来。赋值千万不能var = value写,带空格,这样就是判断相等了,就不是赋值了。在变量名加$前缀就可以求值,$var ${var}。
  • hao
    2015-12-08
    Shell程序会读取.sh文件首行,查看是不是#!/bin/bash,如果是,就在内部展开为/bin/bash [*.sh]执行sh文件。当打开终端的时候,一般为ctrl+T,该终端会读取一组命令,设置文本,字体颜色等,这组命令来自于用户home目录中的.bashrc文件(~/.bashrc)。Bash还维护了一组历史记录,在文件~/.bash_history中。Bash中每个命令都是以分号和换行来分隔的。如果你希望echo打印感叹号(!),就不要把带有感叹号的字符串放入双引号中,可以在感叹号前加个‘ ’转义。echo后面使用单引号有个问题,如果里面有个$var,那么它是不会对$var求值的。当然,还有个命令printf,跟C语言的用法差不多。
  • Link
    2014-05-02
    使用字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误。
  • Link
    2014-05-02
    在大多数现代系统中, true 是作为 /bin 中的一个二进制文件来实现的。这就意味着每执行一次 while 循环, shell 就不得不生成一个进程。如果不想这样,可以使用 shell 内建的“:”命令,它总是会返回为 0 的退出码。
  • Link
    2014-05-02
    在不可信环境下执行特权命令,通过在命令前加上 来忽略可能存在的别名设置总是一个不错的安全实践。
  • Link
    2014-05-02
    单靠查看输出的文本本身,我们没法区分哪些是正常,哪些是错误。不过可以通过文件描述符来解决这个问题,将那些与特定描述符关联的文本提取出来。文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符 0、1 以及 2 是系统预留的。0 —— stdin1 —— stdout2 —— stderr
  • Link
    2014-05-02
    var = value 不同于 var=value 。把 var=value 写成 var = value 是一个常见的错误,但前者是赋值操作,后者则是相等操作。
  • Link
    2014-05-02
    在 Bash 中,每一个变量的值都是字符串。无论你给变量赋值时有没有使用引号,值都会一字符串的形式存储。
  • [已注销]
    2013-06-13
    将stderr单独重定向到一个文件,将stdout重定向到另一个文件:$ cmd 2>stderr.txt 1>stdout.txt还可以将stderr转换成stdout,使得stderr和stdout都被重定向到同一个文件里:$ cmd 2>&1 output.txt或者$ cmd &> output.txt
  • [已注销]
    2013-06-13
    有一个巧妙的方法可以一方面将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。这一切都可以使用tee来实现。
  • [已注销]
    2013-06-13
    %-5s指明一个格式为左对齐且宽度为5的字符串替代(-表示左对齐,不用-表示右对齐。.2指定保留2个小数位)