hao对《Linux Shell脚本攻略》的笔记(3)

Linux Shell脚本攻略
  • 书名: Linux Shell脚本攻略
  • 作者: (印)拉克什曼
  • 页数: 254
  • 出版社: 人民邮电出版社
  • 出版年: 2011-11
  • 第28页 小试牛刀
    Shell程序会读取.sh文件首行,查看是不是#!/bin/bash,如果是,就在内部展开为/bin/bash [*.sh]执行sh文件。 当打开终端的时候,一般为ctrl+T,该终端会读取一组命令,设置文本,字体颜色等,这组命令来自于用户home目录中的.bashrc文件(~/.bashrc)。Bash还维护了一组历史记录,在文件~/.bash_history中。 Bash中每个命令都是以分号和换行来分隔的。 如果你希望echo打印感叹号(!),就不要把带有感叹号的字符串放入双引号中,可以在感叹号前加个‘ \ ’转义。 echo后面使用单引号有个问题,如果里面有个$var,那么它是不会对$var求值的。当然,还有个命令printf,跟C语言的用法差不多。
    引自 小试牛刀

    打印彩色输出

    echo -e "\e[1;31m This is a text file \e[0m" 这输出就是红色,31是红色,0是重置回去。替换31这个数字为相应的颜色数字就可以了。 在Bash中,每个变量的值都是字符串,无论加不加引号。 如果有个叫gedit的程序正在运行,那么用pgrep gedit就能获得gedit进程的PID。然后通过替换$PID,就可以cat /proc/$PID/environ 查看此进程的环境变量。这样会输出一堆环境变量,它们之间以'\0'分隔,所以为了看清晰一点,可以用tr命令进行字符替换成'\n'换行符,cat /proc/$PID/environ | tr '\0' '\n'这样就好了。
    引自 小试牛刀

    变量

    变量赋值 var=value 如果value中有空格,必须用单引号或双引号包含起来。赋值千万不能var = value写,带空格,这样就是判断相等了,就不是赋值了。在变量名加$前缀就可以求值,$var ${var}。
    引自 小试牛刀

    环境变量

    环境变量是未在当前进程中定义,而从父进程中继承过来的。用export导出一个环境变量,这样就可以被子进程继承了。 $PATH环境变量通常定义在/etc/enviroment或/ect/profile,~/.bashrc中。如果要在$PATH中新增一条,可以export PATH=”$PATH:/home/usr/bin“。
    引自 小试牛刀

    获取字符串长度

    echo "${#var}" var是变量名。
    引自 小试牛刀

    检查用户是否是超级用户

    root用户的$UID是0 if [ $UID -ne 0 ];then echo "not a root user" else echo "is a root user" fi
    引自 小试牛刀

    通过shell进行数学运算

    let运算符可以直接进行数学计算,这样变量名前也不需要$。 let result=var1+var2 let var++ let var-- let var+=6 let var-=4 其他方法: result=$[ no1 + no2 ] result=$[ $no1 + no2 ] result=$(( no1 + no2 )) result=`expr 3 + 4` result=$(expr $no1 + 3) 以上都只能支持整数,不支持浮点数,要支持需要这样,利用bc这个高级点的工具: echo "4 * 0.56" | bc no1=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)" | bc echo "10^10" | bc
    引自 小试牛刀
    2015-12-09 09:32:05 回应
  • 第42页 小试牛刀

    玩转文件描述符和重定向

    最常见的文件描述符是stdout,stderr,stdin.可以将某个文件描述符中的内容重定向到另一个文件描述符中。 文件描述符: 0-----------stdin 1-----------stdout 2----------stderr 平时这样的重定向都默认为1, echo "Fuck you bitch\!" > output.txt echo "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 line" >&5 echo "new line" >&5
    引自 小试牛刀

    数组和关联数组

    普通数组只能用整数作为索引,而关联数组能用字符串作为索引。 var_array={1 2 3 4 5 6} 打印特定内容: echo ${var_array[0]} index = 5 echo ${var_array[$index]} 以清单形式打印出数组中的所有值: echo ${var_array[*]} echo ${var_array[@]} 打印数组长度: echo ${#var_array[*]} 关联数组借助散列技术。 定义关联数组: declare -A friuts friuts=([apple]='100 dollars' [orange]='150 dollars') echo ${friuts[apple]} 列出数组索引: echo ${!friuts[*]}
    引自 小试牛刀

    使用别名

    alias cmd='cmd sequence' alias install='sudo apt-get install' 此命令只是暂时的,一旦关闭终端就无效。所以一般设置在~/.bashrc里。
    引自 小试牛刀

    调试脚本

    bash -x [*.sh] 打印出每行命令的当前状态 定义函数: function frame(){ statement } frame arg1 arg2 $1 $2为参数1,参数2,往下类推. Bash支持函数递归,不过是4.0开始的。 fork炸弹: :(){: | : &};:
    引自 小试牛刀
    2015-12-20 18:56:38 回应
  • 小试牛刀

    导出函数

    函数也能像环境变量那样被导出,这样函数的作用域就可以在子进程中生效了。 export -f function_name
    引自 小试牛刀

    读取命令序列输出

    cmd_output=$(cmd1 | cmd2 | cmd3) 或者cmd_output=`cmd1 | cmd2 | cmd3` echo ${cmd_output}
    引自 小试牛刀

    不用按回车读取键盘输入

    read -n 3 var 从键盘上读取3个字符村存入var变量中
    引自 小试牛刀
    2015-12-21 08:58:14 回应

hao的其他笔记  · · · · · ·  ( 全部427条 )