Black Mamba

Faster, Higher, Stronger.

Shell Notes I

  • 替我们工作的是 “硬件”, 控制硬件的是 “核心”. 用户是通过 “Shell” 控制一些内核提供的 “工具(Utility)”, 来控制硬件工作
  • Shell(壳) 是连接人类和 kernel(核心, 使计算机主机工作) 的桥梁
  • 命令别名设置功能
  • alias lm=‘ls -al’, 将 lm 命令设置为 ‘ls -al’, 即显示目录中所有的内容
  • alias l=‘ls -F’, 将 l 命令设置为 ‘ls -F’, 即以文件类型格式来显示目录中的内容
  • unalias lm, 取消 lm 命令的别名

  • type 命令查看命令类型

  • type ls

    查询 ls 是否为 shell 内置命令 ls is aliased to `ls –color=auto’

  • type -a ls

    查询 ls 命令的最主要使用情况 ls is aliased to `ls –color=auto’ ls is /bin/ls

  • type cd

    cd is a shell builtin

  • 变量设置中的单引号与双引号的不同, 双引号可以保持变量的内容, 单引号只能是一般字符

  • [root@linux ~]# name=“$name”

  • [root@linux ~]# echo $name Ngcl

  • [root@linux ~]# name=‘$name’

  • [root@linux ~]# echo $name

$name

  • 在执行命令时, 引号 (`) 代表的含义
  • 在一串命令中, ` 之内的命令先被执行, 而其执行出来的结果将作为外部输入信息
  • 例如, locate 命令可列出所有相关文件的文件名, 如想知道每个文件的权限, 应先用 locate 将文件名数据列出来, 再用 ls 命令来处理
  • [root@linux ~]# ls -l `locate crontab`

  • 变量键盘读取

  • read [-pt] variable
  • -p: 后接提示符
  • -t: 后接时间
  • 例1:
  • [root@linux ~]# read atest This is a test
  • [root@linux ~]# echo $atest This is a test $name
  • 例2:
  • [root@linux ~]# read -p “Please keyin your name: ” -t 30 named Please keyin your name: Ngcl
  • [root@linux ~]# echo named Ngcl

  • 历史命令: history

    • !66, 执行第 66 条命令
    • !!, 执行上一条命令
    • !al, 执行最近的以 al 开头的命令
  • Shell 配置文件: ~/.bashrc

    • User specific aliases and functions

      添加用户自己设定的 alias 变量别名

    • 使用 source 或小数点 (.), 将设置文件的内容读进当前的 shell 环境中
    • source ~/.bashrc
    • . ~/.bashrc
  • 数据流重导向

    • 输入 (stdin): 代码为 0, 使用 < 或 <<
    • 输出 (stdout): 代码为 1, 使用 > 或 >> 或 1>
    • 标准错误输出 (stderr): 代码为2, 使用 2> 或 2>>
    • 例如:
    • 将当前目录下的文件信息全存储到 list.txt (覆盖写) ls -al > list.txt
    • 将根目录下的数据也存储到 list.txt (添加写) ls -al / >> list.txt
  • 正则表达式

    • grep ‘root’ ~/list.txt 查找 list.txt 中有 ‘root’ 的那一行
    • grep -v ‘root’ ~/list.txt, (v: invert) 查找 list.txt 中没有 ‘root’ 的那一行
    • grep -n ‘a’ list.txt, (n: show line number) 查找 list.txt 中有 ‘a’ 的行, 并显示行号
  • Shell 脚本即剧本, 即用 shell 功能所编写的 “程序(program)”, 可以类比为 DOS 中的批处理文件 (.bat), 最简单的功能是将许多命令写在一起, 让用户很轻松地就能执行一次执行多个命令

    • 可以看为一种程序语言, 且这个程序语言用 shell 相关工具命令, 所以不需要编译即可执行, 还拥有不错的调试 (debug) 工具

    • Shell 版本 “Hello World!”

#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e “Hello World ! \a \n” read -p “Enter first name and last name” firstname lastname echo -e “\nFull name: \$firstname \$lastname” exit 0

  • 解释:
  • 第 1 行: #!/bin/bash 在声明这个脚本使用的 shell 名称和使用的 bash 的语法, 没有这一行, 该程序可能无法运行, 因为系统无法判断使用什么 shell 来执行
  • PATH 用来设置好环境变量, 可让程序直接进行并执行命令, 而不必写绝对路径

  • 执行该脚本:

    • sh hello.sh
    • chmod a+x hello.sh ./hello.sh
  • read -p

    • 后根一个字符串 “”, 字符串 “some string” 后可以跟多个变量作输入
  • echo -e

    • 参数前加 \$ 符号,\$firstname
  • 判断文件类型与属性

    • test -f, filetype=“regulare file”
    • test -d, filetype=“directory”
    • test -r, permission=“readable”
    • test -w, permission=“\permission writable”
    • test -x, permission=“\permission executable”
  • netstat -tuln 指令, 可查询到目前主机开启的网络服务端端口, 取得目前主机启动的服务

    • 常见的 port 与相关网络服务的关系:
    • 80: www
    • 22: ssh
    • 21: ftp
    • 25: mail
  • testing=netstat -tuln | grep ":80 " if [ “$testing” != “” ]; then echo “WWW is sunning” fi

testing=netstat -tuln | grep ":22 " if [ “$testing” != “” ]; then echo “SSH is sunning” fi

testing=netstat -tuln | grep ":21 " if [ “$testing” != “” ]; then echo “FTP is sunning” fi

testing=netstat -tuln | grep ":25 " if [ “$testing” != “” ]; then echo “Mail is sunning” fi

  • if [ “\$yn” == “Y” ] || [ “\$yn” == “y” ]; then echo “OK, continue” elif [ “\$yn” == “N” ] || [ “\$yn” == “n” ]; then echo “Oh, interrupt!” else echo “I don’t know what is your choise” fi

  • read -p “Please input (Y/N): ” yn [ “\$yn” == “Y” -o “\$yn” == “y” ] && echo “OK, continue” && exit 0 [ “\$yn” == “N” -o “\$yn” == “n” ] && echo “OK, interrupt!” && exit 0 echo “I don’t know what is your choise” && exit 0

  • if [ “\$yn” == “Y” ] || [ “\$yn” == “y” ]; then echo “OK, continue” exit 0 fi if [ “\$yn” == “N” ] || [ “\$yn” == “n” ]; then echo “Oh, interrupt” exit 0 fi echo “I don’t know what is your choise” && exit 0

  • if [ “\$1” == “hello” ]; then echo “Hello, how are you ?” elif [ “\$1” == “” ]; then echo “You MUST input parameters, ex> $0 someword” else echo “The only parameter is ‘hello’” fi

  • case \$1 in “hello”) echo “Hello, how are you ?” ;; “”) echo “You MUST input params, ex> $0 someword” ;; *) echo “Usage \$0 {hello}” ;; esac

  • 算术比较类:

    • exp1 –eq exp2 相等, 为真
    • exp1 –ne exp2 不等,为真
    • exp1 –gt exp2 大于,为真
    • exp1 –ge exp2 大于或等于,为真
    • exp1 –lt exp2 小于,为真
    • exp1 –le exp2 小于或等于,为真
    • !exp 表达式为假,则结果为真
  • until [ “\$yn” == “yes” ] || [ “$yn” == “YES” ] do read -p “Input YES/yes to stop this program: ” yn done

  • s=0 i=0

while [ “\$i” != 100 ] do i=\$((\$i+1)) s=\$((\$s+\$i)) done echo “The res is ==> $s”

s=0 for (( i=1; i<=100; i=i+1 )) do s=\$((\$s+$i)) done echo “The result is ==> \$s”

  • for animal in dog cat elephant do echo “There are ”“$animal”“s…. ” done

Comments