linux-doc-shell基础

内置命令

echo
输出一行文本到标准输入设备

read
从标准设备读取数据

print
格式化输出

declare
定义或创建变量或数组

let
让未定义的变量参与算术运算

expr
执行表达式

shift
把所有参数变量向下移动一个位置($0不参与,也可以理解为删除变量1)

1
2
3
4
5
6
#!/bin/bash
while [ "$1" != "" ]
do
echo $1
shift
done

eval
执行命令

trap
用来定义接收
trap command signal

  • 语法
1
2
3
4
5
6
7
8
9
10
11
12
# command:
# 一般情况下是linux命令
# ''表示发生陷阱时为空指令,不做任何动作
# '-'表示发生陷阱时采用缺省指令
# signal
# HUP(1) 挂起:一般因终端掉线或用户退出而引发
# INT(2) 中断:一般因按下CTRL+C组合键引发
# QUIT(3) 退出:一般因按下CTRL+\组合键引发
# ABRT(6) 异常中止:一般因某些严重的执行错误而引发
# ALRM(14) 闹钟:一般是超时时钟到来而引发
# TREM(15) 中止:一般由系统在关机的时候发出
trap command signal
  • 参考
1
2
3
4
5
#!/bin/bash

trap "rm -f tmp$$;exit 0" 2 3
touch tmp$$
sleep 60

exit
退出SHELL程序

1
exit n

sleep
表示睡眠多少秒

1
sleep n

test
条件测试

$RANDOM
随机变量

字符串操作

pattern和old都可以使用通配符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
${#var}
返回字符串变量var长度

${var:n}
返回${var}中从第n+1个字符到最后的部分

${var:n:len}
返回${var}中从第n+1个字符开始,长度为len的部分

${var#pattern}
删除${var}中开头部分与pattern匹配的最小部分

${var##pattern}
删除${var}中开头部分与pattern匹配的最大的部分

${var%pattern}
删除${var}中结尾部分与pattern匹配的最小部分

${var%%pattern}
删除${var}中结尾部分与pattern匹配的最大部分

${var/old/new}
用new替换${var}中第一次出现的old

${var//old/new}
用new替换${var}中所有的old(全局替换)

算术扩展

$[]

1
n=5; echo [n+1]

$(())

1
n=5; echo ((n+1))

(())

1
((n+=1)); echo $n

expr

1
expr 4 + 5 注意+号两边要有空格

let

1
2
let n=n+1(不可以有空格)
let n = "n = n + 1"

变量使用

1
r=`expr 4 + 5`

语句

循环语句都可以使用continue和break

for语句 非C语言格式

1
2
3
4
for variable in list    # list可以是命令替换、变量名替换、字符串和文件名列表(可包含通配符)
do
commands
done
1
2
3
4
5
6
#!/bin/bash

for i in s*
do
echo $i
done
1
2
3
4
5
6
7
8
9
#!/bin/bash

counter=0;
for f in *
do
counter=$[$counter+1]
done

echo There are $counter files in 'pwd'

for语句 C语言格式

1
2
3
for ((exp1;exp2;exp3)
do
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

if [ $# -ne 1 ];ther
echo 'usage:$0 <n>'
exit 1
fi

if [ $1 -lt "5" -o $1 -gt "15" ];then
echo 'usage:$0 <n>'
echo 'where 5 <= n <= 15'
exit 1
fi

for ((i=0;i<$1;i++))
do
for ((j=0;j<$[$1-$i-1];j++))
do
echo -n ""
done

for ((j=0;j<$[2*$i+1];j++))
do
echo -n "*"
done

echo -ne '\n'
done

select循环菜单

1
2
3
4
select variable in list
do
commands
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

select var in Dogs Cats Birds
do
case $var in
Dogs)
echo Dogs are my favorite pet
;;
Cats)
echo Cats are my favorite pet
;;
Birds)
echo Birds are my favorite pet
;;
*)
echo none of my favorite pet
break;
;;
esac
done