- 替我们工作的是 “硬件”, 控制硬件的是 “核心”. 用户是通过 “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