Bash Shell

Bash Shell

Posted by Deetch on June 21, 2017

单引号 双引号 反斜杠

''      不替换变量
""      替换变量
``      执行命令

括号

[]: (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)

传入数组和传出数组