# Shell 编程
# Hello world!
#! /bin/bash
echo 'hello world!'
1
2
3
2
3
./test.sh // 输出 hello world!
1
#! 声明此脚本使用的 shell
注意需要赋予执行权限。sudo chmod +x xxx.sh
# 变量
Shell 变量分为系统变量和自定义变量,系统变量有 $HOME、$PWD 等。查看所有变量:set
变量定义:变量名=变量值。
WARNING
等号左右不能有空格。
获取变量:$变量名。
删除变量:unset 变量名。
将命令返回值赋给变量:
- 反引号:VAR=
command
- $符:VAR=$(
command
)
环境变量:
export 变量名=变量值(通常配置在 .bashrc 或 .zshrc 中) 记得使用 source 使配置立即生效。通过 echo $变量名检查是否生效。
位置参数变量:
$n
: $0 代表命令本身,$1-$9 代表第 1 个到第 9 个参数,10及以上需要使用花括号,${10}。$*
: 命令行的所有参数,且把所有参数仓做一个整体。$@
: 命令行的所有参数,且把每个参数独立对待。$#
: 参数个数。
#! /bin/bash
echo $0 $1 $2
echo $*
echo $@
echo $#
1
2
3
4
5
6
2
3
4
5
6
运行测试:
./test.sh a b c
./test.sh a b
a b c // 此处看不出区别,但循环遍历时此处只有一个元素
a b c
3
1
2
3
4
5
6
2
3
4
5
6
预定义变量:
$$
: 当前进程 pid。$!
: 后台运行的最后一个进程 pid。$?
: 最后一次命令执行的结果返回值,0 为成功,非 0 为失败。
# 运算符
语法格式:
$((运算式)) 或 $[]。
expr 运算式
(注意运算符间要有空格, * 前需要加\
转义符)。echo $((1+(2*3))) // 7 echo $[1+(2*3)] // 7 echo `expr 1 + 2 \* 3` // 7
1
2
3
# 条件判断
语法格式:
[ condition ]
(注意条件表达式前后要要空格;0 为真,其他为假)
#!/bin/bash
if [ 1>0 ]
then
echo 'y'
else
echo 'n'
fi
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
#!/bin/bash
score=70
echo $score
if [ $score -gt 90 ]
then
echo '优秀'
elif [ $score -gt 60 ]
then
echo '良好'
else
echo '不及格'
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# case 分支
语法格式:
#!/bin/bash
case $1 in
"1")
#code
;;
esac
1
2
3
4
5
6
7
2
3
4
5
6
7
测试:
#!/bin/bash
case $1 in
"1")
echo 周一
;;
"2")
echo 周二
;;
*)
echo 其它
;;
esac
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# for 循环
语法格式:
# 语法1
for 变量名 in 值1 值2 值3...
do
# code
done
# 语法2
for ((初始值;循环控制条件;变量变化))
do
# code
done
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
打印命令行输入参数:
#!/bin/bash
for i in "$*"
do
echo $i
done
for j in "$@"
do
echo $j
done
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
执行结果:
./test.sh a b c
a b c
a
b
c
1
2
3
4
5
2
3
4
5
# while 循环
语法格式:
while [ 条件判断式 ]
do
# code
done
1
2
3
4
2
3
4
测试输出前 10 个数:
#!/bin/bash
a=0
while [ $a -lt 10 ]
do
echo $a
a=$[$a+1]
done
1
2
3
4
5
6
7
2
3
4
5
6
7
# 读取控制台输入参数
read [选项] 参数
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒),如果没有在指定时间内输入,就不再等待了。
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "你输入num1的值是:$NUM1"
read -t 10 -p "请在10秒内输入一个数num2=" NUM2
echo "你输入num2的值是:$NUM2"
1
2
3
4
5
6
7
2
3
4
5
6
7
# 函数
语法格式:
[ function ] funname[()]
{
Action;
[return int;]
}
# 调用
funname 参数1 参数2...
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
计算输入两个参数的和:
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "sum=$SUM"
}
read -p "请输入第一个参数n1:" n1
read -p "请输入第二个参数n2:" n2
# 调用 getSum 函数
getSum $n1 $n2
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12