- 替我们工作的是 “硬件”, 控制硬件的是 “核心”. 用户是通过 “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), 最简单的功能是将许多命令写在一起, 让用户很轻松地就能执行一次执行多个命令
#!/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
判断文件类型与属性
- 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