概述

执行脚本时,可以向脚本里面传递参数,脚本可以根据传递的参数进行进一步操作。

脚本内获取参数的格式为:$n。n代表一个数字,比如 $1 表示传进来的第一个参数,$2 表示传进来的第二个参数,以此类推。

实例

创建脚本并添加内容

1
2
touch chuancan.sh
vim chuancan.sh
1
2
3
4
5
6
7
#!/bin/bash

echo "Shell 传递参数";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

设置可执行权限,并执行脚本:

1
2
3
4
5
6
7
8
9
10
11
12
# 设置可执行权限
chmod +x chuancan.sh

# 执行文件
./chuancan.sh 参数一 参数二 参数三

# 输出结果
Shell 传递参数
执行的文件名:./chuancan.sh
第一个参数为:参数一
第二个参数为:参数二
第三个参数为:参数三

参数处理

  • $# : 表示传递参数的个数
  • $* : 字符串形式展示传递给脚本的所有参数
  • $$ : 当前脚本运行的当前进程ID号
  • $@ : 与$* 相同,但是使用时会给每个参数加引号,在引号中返回每个参数
  • $? : 显示最后命令的退出状态,0表示没有错误,其他值都表示有错误。

参数处理实例

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
#!/bin/bash

echo "Shell 传递参数";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

echo "$#"
echo "$*"
echo "$$"
echo "$@"
echo "$?"

# 输出结果为:
Shell 传递参数
执行的文件名:./chuancan.sh
第一个参数为:参数一
第二个参数为:参数二
第三个参数为:参数三
3
参数一 参数二 参数三
2437
参数一 参数二 参数三
0

$* 与 $@ 详解

  • 相同点:都是引用所有参数
  • 不同点:$* 是直接以字符串的形式输出参数字符串,$@ 则是将参数先用双引号包含,再引用双引号中的所有参数

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /bin/bash

echo "-- \$* 测试 ---"
for i in "$*"; do
echo "$i"
done

echo "-- \$@ 测试 ---"
for i in "$@"; do
echo "$i"
done

# 输出结果

-- $* 测试 ---
参数一 参数二 参数三
-- $@ 测试 ---
参数一
参数二
参数三

参数校验

概述

有时候我们执行带参数的脚本可能只是为了某种特殊情况才需要传入参数进行执行,比如说有个脚本作用是转移每一天的数据,执行一段时间后发现某一天的数据给没了,或者某一天执行失败但是没被发现,那么就需要传入特定的天数参数去执行脚本。

那么问题来了,既然有时候会用到参数,那么我们怎么判断脚本里是否有参数传递呢?

其实想一想就能知道,可以用判断,如果传进来的参数不为空,那么就用传进来的参数作为执行条件,若为空,则无事发生,继续执行脚本。

简单实例

创建脚本

1
2
3
4
5
6
7
8
# 创建脚本
touch getTime.sh

# 给脚本赋权
chmod +x getTime.sh

# 编辑脚本
vim getTime.sh

输入脚本内容

1
2
3
4
5
6
7
8
9
#!/bin/bash

now_time=$(date +%Y%m%d)

if [ $1 ];then
echo "现在时间为$1"
else
echo "现在时间为${now_time}"
fi

不带参数运行:

1
2
3
4
5
# 运行脚本
$ ./getTime.sh

# 运行结果
现在时间为20190626

带参数运行:

1
2
3
4
5
# 运行脚本
$ ./getTime.sh 20190505

# 运行结果
现在时间为20190505

脚本内容使用if进行判断,这里注意两点:一是获取时间,$(date +%Y%m%d) 中,date 与 + 号要用空格隔开,二是判断语句中if与大括号间要用空格隔开,否则会执行失败。具体函数后面会讲,这里不做过多介绍。