单引号 双引号 反斜杠
'' 不替换变量
"" 替换变量
`` 执行命令
括号
[]: (1) 数学计算,不需要转义
(2) test命令简写
[[]] if中的字符串比较高级特性,提供test不提供的模式匹配
if [[ $USER == r* ]]
(()): (1) if中的高级数学表达式特性
if (( $val ** 2 > 90))
(2) c-stype for 循环
重定向
> 输出到文件
< 输入重定向
| 管道
<< 内联重定向
数学计算
expr:整数 expr 5 \* 2
bc:浮点 `echo " scale=4; $a + $b" | bc`
`bc << EOF
scale = 4
a1 = a + b
c1 = b + a1
EOF`
查看退出状态码
$?
if
if
then
fi
if
then
else
fi
if
then
elif
then
else
fi
test命令
数值比较:
num1 -eq num2
…
字符串比较:
=
!=
-n str 长度是否非0
-z str 长度是否为0
…
文件比较:
-d file
-e file
-f file
bool运算
[ b ] && [ a ]
[ b ] || [ a ]
case
case $a in
rich | here)
echo a;;
testing)
echo b;;
*)
;;
esac
for
for var in $list
do
echo $var
done
for (( i=1; i<=10; i++ ))
do
echo $i
done
for (( a=1, b=10; a<=10; a++, b-- ))
do
echo $a
echo $b
done
拼接字符串
list="i'm fat"
list=$list" as you"
字段分隔符
默认情况下:
(1)空格
(2)制表符
(3)换行符
更改分隔符,使用IFS变量 IFS=$’\n’ IFS=$’\n:;’” 换行符、冒号、分号和双引号
IFS.OLD=$IFS
IFS=$'\n'
...
...
IFS=$IFS.OLD
while
while [ ]
do
echo $var
done
多条件
while [ ]
[ ]
do
done
until
不成立才执行
util [ ]
do
done
多条件,只有在最后一个条件成立时停止
util [ ]
[ ]
do
done
break
continue
运行参数
$0 程序名
$1 - $9
${10} - ${n}
$# 命令行参数个数,在大括号内,使用!#
$*,将命令行上提供的所有参数当作单个单词保存
$@,将命令行上提供的所有参数当作同一个字符串中的多个独立单词
移动变量 shift
shift,默认情况下它会将每个参数变量减一。所以$3的值会移到$2,$2 —> $1, $1会被删除
count=1
while[ -n "$1" ]
do
echo "Parameter #$count - $1"
count=$[ $count + 1 ]
shift
done
处理选项
getopt命令
getopts命令
通用Linux命令选项
-a
-c 生成一个计数
-d 指定一个目录
-e 扩展一个对象
-f 读入数据的文件
-h
-i 忽略大小写
-l 产生输出的长格式版本
-n 使用非交互模式(批量)
-o 指定将所有输出重定向到输出文件
-q 以安静模式运行
-r 递归
-s 以安静模式运行
-v 详细输出
-x 排除某个对象
-y
获取用户输入 read
echo -n 'Enter your name:'
read name
echo "$name"
read name -p "please enter your age:" age
不指定变量,会存入REPLY变量中
-t 设置read超时
-s 隐藏方式读取
文件描述符
0 STDIN 1 STDOUT 2 STDERR
ls -al badfile 2> test4 #重定向错误
&> 将所有输出都发送到同一位置,包括数据和错误
临时重定向: >&2
永久重定向:exec 1>testout
shell中最多可以有9个打开的文件描述符
创建输入文件描述符
exec 6<&0
exec 0<testfile
exec 0<&6
关闭文件描述符 exec 3>&-
lsof
-p 指定进程ID
-d 允许指定要显示的文件描述符个数
/dev/null
mktemp 创建本地临时文件
mktemp testing.XXXXXX 命令会用6个字符码替换这6个X,保证唯一,返回全路径文件名
-t 强制mktemp命令在/tmp目录创建
-d 创建一个临时目录
tee 将消息同时发送到STDOUT 和 指定的文件名
date | tee testfile
信号处理
1 SIGHUP 终止进程
2 SIGINT 终止进程
3 SIGQUIT 终止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 可能的话终止进程
17 SIGSTOP 无条件停止进程,但不是终止进程
18 SIGTSTP 停止进程,但不终止进程
19 SIGCONT 继续运行停止的进程
默认情况下,bash shell会忽略收到任何SIGQUIT(3)和SIGTERM(5)信号,但会处理SIGHUP(1)和SIGINT(2)信号
使用trap捕捉信号
trap commands signals
trap "echo 'Sorry! Ihave trapped Ctrl-C'" SIGINT SIGTERM
捕捉脚本的退出
trap "echo byebye" EXIT
移除捕捉,单破折线作为命令,后面加一组信号捕捉
trap - EXIT
后台模式运行脚本
& : 依赖终端,终端退出,后台任务退出
nohup命令:终端退出,依旧运行。关闭终端,脚本会忽略任何终端会话发过来的SIGHUP信号
nohup ./test1 &
查看作业 jobs
-l 列出进程的PID以及作业号
-n 只列出上次shell发出的通知后改变乐状态的作业
-p 只列出作业的PID
-r 只列出运行中的作业
-s 只列出已停止的作业
重启停止的作业
以后台模式重启一个作业,可用bg命令加上作业号:bg 2
以前太模式重启一个作业,可用fg命令加上作业号:fg 1
nice命令调整优先级 -20 <—> 19(高 — 低)
nice -n 10 ./test4 > test4out &
限制:阻止普通系统用户来增加命令的优先级
renice命令调整已运行命令优先级
renice 10 -p 29054
限制:
a.你只能对属于你的进程执行renice
b.你只能通过renice降低进程的优先级
c.root用户可以通过renice调整任何进程的优先级到任何级别
定时运行任务 at和cron
at命令允许指定linux系统何时运行脚本,at的守护进程atd会以后台模式运行
atd检查一个特殊目录/var/spool/at来获取任务,每60s
at [-f filename] time
time时间格式:
标准的小时和分钟格式,10:15
~AM/~PM指示符,10:15~PM
特定可命名的时间,比如now, noon.midnight,teatime(4~PM)
若指定一个已经过去的时间,at命令会在第二天该时间运行该作业
标准日期格式,MMDDYY,MM/DD/YY,DD.MM.YY
文本日期,Jul 4 或Dec 25加不加年份均可
列出等待的任务:atq
删除作业:atrm 59
cron定期任务
cron时间表格式:min hour dayofmonth month dayofweek command
可以用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或数值(0为周日,6为周六)
dayofmonth条目会为月份指定个日期值(1~31)
每月最后一天执行:
00 12 * * * if[ `data +%d -d tomorrow` = 01 ]; then; command
命令列表必须指定要运行的命令或脚本的全路径名
crontab -l 列出已有的cron时间表
cron目录 hourly, daily, monthly, weekly /etc
cron关机会丢失所有任务,anacron可尽快运行错过了计划好的任务,只会处理位于cron目录的程序
函数
function name { commands }
返回值 1.默认退出状态码:最后一条命令返回的退出状态码,可用标准的$?变量来决定函数的退出状态码
使用return命令,允许指定一个整数值来定义函数的退出状态码(必须!函数一结束就取返回值,退出码必须在0-255)
传入数组和传出数组