解释器
脚本文件第一行要求指定解释器: shebang(#!)
这就是为什么大家在脚本第一行中常常见到
#! /bin/bash
#! /bin/sh
#!/usr/bin/env python
注释
脚本文件使用#或<<符号实现单行或多行注释
其中多行注释需要用两个相同的字符做起始符, 如
<<zhushi
# echo hello
# echo world
zhushi
执行权限
如果你是root 用户, 一定要注意给其他用户添加可执行权限给
chmod +x test.sh
如果没有x权限, 可以尝试用解释器执行, eg
<<zhushi
# bash test.sh # 使用bash解释器
# sh test.sh # 使用 sh 解释器
zhushi
pstree
可使用 pstree对运行的脚本进行进行查看
脚本运行方式
# bash test.sh # 开启子进程运行
# source test.sh # 不开启子进程, 返回脚本执行结果, 原文解释 Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.
# exec test.sh # 不开启子进程, 而是用命令替换当前的shell 环境.
显示行信息
# echo "hello world" # 输出 hello world
# printf "hello world" # 输出 hello world
# printf "%s%s" "hello world" # 输出 hello world
debug
执行shell 脚本时 加 -x 参数
# bash -x test.sh
read
read [选项] [变量名]
read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name .
# read test_key # 读取标准输入, 键盘输入 666
# echo $test_key # 输出 666
who
用户登录计算机日志
# who # 输出用户登录日志
# who | wc -l # 用户登录次数
重定向
大家经常在shell 脚本中看到 >, >>, 1>, 2>分别是什么意思 ?
>和>> 将符号重定向之文件
# echo "hello world" > test.txt # hello world 符号重定向入test.txt, 覆盖重写方式
# echo "hello world two" >> test.txt # 此时文件有两行, 为追加方式
其中 0 为标准输入, 1 为标准输出, 2 为标准错误
# ls /sbin > test.txt #重定向标准输出, 只含正确信息
# ls /sbin 1> test.txt # 同上
# ls /sbin 2> test.txt # 标准错误重定向,只含错误信息 如果没有权限的话, 错误数据信息会输出到文件中
# ls /sbin 2>&1 > test.txt # 标准输出和错误同时重定向到文件,包含正确和错误信息
touch
创建空白文件
# touch empty.txt # 空白文件
# vim empty.txt # vim编辑器编辑文件
引号
单引号 ‘’ 能够转义特殊字符, 双引号" "则不能
# nihao="hello world"
# echo "$nihao" # $nihao为变量
hello world
# echo '$nihao' # 相当于 echo "\$nihao", \ 为转义符
$nihao
反引号
反引号 `` 可以执行其他常用命令
# date #执行日期命令
Thu Mar 31 21:48:23 CST 2022
# echo "date" # 引号把命令当成字符对待
date
# echo `date` # 反引号执行命令
Thu Mar 31 21:48:23 CST 2022
常用查看文件
# cat test.txt # 全部打开文件
# head 100 test.txt # 显示头部100行
# tail 100 test.txt # 显示尾部100行
# more test.txt #滚动显示文件
变量
# nihao="hello world"
# echo nihao # nihao 是被当做字符
nihao
# echo $nihao # $nihao 是取变量的值
hello world
grep
# grep [参数][匹配模式][文件]
# grep hello test.txt #显示过滤的行
hello world
其中 匹配模式可以是正则表达式, 这里不做详述
算数运算
Shell 支持算数运算 如, +, -, *, /, ++, --, … 格式同C语言接近, 读者可查看相关文档.
命令之间的逻辑关系
# test A ; B ; C ; #命令之间可以用 ; 无论正确与否, 三条命令都会执行完成
# test A && B ; # A 正确执行, 则执行B; 否则, 不执行B
# test A || B ; # A 不能正确执行, 则执行 B;
# test A && B : C # A 正确者执行 B, 否则执行C ; 同C语言 A ? B : C 效果类似
# echo $? # 取上一次命令返回结果, 0为正确, 1 为错误
chmod
修改权限
# chmod +r test.sh # 对所有用户组添加读权限
# chmod +w test.sh # 对所有用户组添加写权限
# chmod +x test.sh # 对所有用户组添加执行权限
# chmod -r test.sh # 对所有用户组删除读权限
# chmod -w test.sh # 对所有用户组删除写权限
# chmod -x test.sh # 对所有用户组删除执行权限
条件语句
Shell 支持条件语句, 格式如下
# if CONDITION, MODULE => ARGUMENTS;
if condition
then
命令
fi
if condition; then
命令1
else
命令2
...
fi
case 语句
# case string ?in? patList body ?patList body ...?
case string in
模式1)
命令1;;
模式2)
命令2;;
...
*)
命令n;;
esac
循环
for condition
do
命令...
done
while condition
do
命令...
done
如同c 语言, 可用 continue 和 break 来控制跳过或者终止逻辑.
函数
function () {
命令
return
}
扩展符号
# echo {hello, world} # 对字符串扩展
hello world
# echo ~ # 用户根目录
/root
# ls /root | wc -l # | 为管道, 左边的输出 | 作为右边的输入
进程管理
# ps aux # 查看进程
# ps aux | grep test #查看 test 进程信息
# kill -9 pid # kill进程
xargs
用于读取管道中的数据, 把结果数据作为参数传给命令, 适合需要参数的命令, 如echo , printf , kill 等等
# ps aux | wc -l # wc 可以直接处理数据
# ps aux | echo # 输出为空, echo 不支持直接处理数据, 仅能接受参数作为数据
# ps aux | xargs echo # 输出所有进行信息, xargs 将数据转化为参数
结论
Shell 还有很多其他命令, 无法一一列举. 另外, shell 中有sed , awk 等高阶处理器, 后面有时间为大家介绍. 建议大家先查查资料.
作为一名架构师, 必须熟练掌握shell 编程技能. 是中高级开发者迈向架构师的必备技能. 希望能带来一些帮助.