在linux服务器上测试,因为mac本地date命令不好使。
在自己的测试目录上,新建两个文件:
a.sh
common/init.sh
公共逻辑可移至子shell,变量可以传递至父shell
其中,a.sh如下:
#!/usr/bin/env bash
SCRIPT_DIR=$(
cd "$(dirname "$0")" || exit
pwd
)
SCRIPT_NAME=$(basename "$0")
source "${SCRIPT_DIR}"/common/init.sh
# init_pt
echo "a.sh DAY:" $DAY
echo "a.sh date_time_pt:" $date_time_pt
common/init.sh 如下:
#!/usr/bin/env bash
while getopts "D:" opt; do
case $opt in
D)
DAY=$OPTARG
;;
\?)
echo "error 不能识别的选项:$opt"
;;
esac
done
# function init_pt() {
# NEWEST_DAY=$(date -d "-1 days" +%Y-%m-%d)
# echo "init.sh DAY:$DAY"
# if [ -z "$DAY" ]; then
# DAY=$(date -d "-1 days" +%Y-%m-%d)
# fi
# NEXT_DAY=$(date -d "$DAY 1 days" +%Y-%m-%d)
# PRE_DAY=$(date -d "$DAY -1 days" +%Y-%m-%d)
# phone_end_pt=$DAY
# phone_start_pt=$(date -d "$phone_end_pt -730 days" +%Y-%m-%d)
# date_time_pt=$DAY
# target_pt_tuoguan=$DAY
# target_pt_yms=$DAY
# echo "init date. NEWEST_DAY:$NEWEST_DAY DAY:$DAY NEXT_DAY:$NEXT_DAY PRE_DAY:$PRE_DAY"
# echo "init date. phone_end_pt:$phone_end_pt phone_start_pt:$phone_start_pt"
# echo "init date. date_time_pt:$date_time_pt target_pt_tuoguan:$target_pt_tuoguan target_pt_yms:$target_pt_yms"
# }
调用
sh a.sh
结果如下:
a.sh DAY:
a.sh date_time_pt:
符合预期,因为DAY 变量本来就没有定义。
调用
sh a.sh -D 2022-05-01
结果如下:
a.sh DAY: 2022-05-01
a.sh date_time_pt:
惊喜!DAY竟然有值了,原因是子shell中的捕捉参数的逻辑生效了。
证明了,公共逻辑如参数捕捉,可以移至子shell。
变量可以传递至子shell
a.sh
#!/usr/bin/env bash
SCRIPT_DIR=$(
cd "$(dirname "$0")" || exit
pwd
)
SCRIPT_NAME=$(basename "$0")
source "${SCRIPT_DIR}"/common/init.sh
DAY='2022-05-01'
init_pt
echo "a.sh DAY:" $DAY
echo "a.sh date_time_pt:" $date_time_pt
common/init.sh
#!/usr/bin/env bash
# while getopts "D:" opt; do
# case $opt in
# D)
# DAY=$OPTARG
# ;;
# \?)
# echo "error 不能识别的选项:$opt"
# ;;
# esac
# done
function init_pt() {
NEWEST_DAY=$(date -d "-1 days" +%Y-%m-%d)
echo "init.sh DAY:$DAY"
if [ -z "$DAY" ]; then
DAY=$(date -d "-1 days" +%Y-%m-%d)
fi
NEXT_DAY=$(date -d "$DAY 1 days" +%Y-%m-%d)
PRE_DAY=$(date -d "$DAY -1 days" +%Y-%m-%d)
phone_end_pt=$DAY
phone_start_pt=$(date -d "$phone_end_pt -730 days" +%Y-%m-%d)
date_time_pt=$DAY
target_pt_tuoguan=$DAY
target_pt_yms=$DAY
echo "init date. NEWEST_DAY:$NEWEST_DAY DAY:$DAY NEXT_DAY:$NEXT_DAY PRE_DAY:$PRE_DAY"
echo "init date. phone_end_pt:$phone_end_pt phone_start_pt:$phone_start_pt"
echo "init date. date_time_pt:$date_time_pt target_pt_tuoguan:$target_pt_tuoguan target_pt_yms:$target_pt_yms"
}
执行:
sh a.sh
结果如下:
init.sh DAY:2022-05-01
init date. NEWEST_DAY:2022-05-18 DAY:2022-05-01 NEXT_DAY:2022-05-02 PRE_DAY:2022-04-30
init date. phone_end_pt:2022-05-01 phone_start_pt:2020-05-01
init date. date_time_pt:2022-05-01 target_pt_tuoguan:2022-05-01 target_pt_yms:2022-05-01
a.sh DAY: 2022-05-01
a.sh date_time_pt: 2022-05-01
init.sh DAY:2022-05-01 说明父shell的变量会传递至子shell。
子shell中的$0的dir name是父shell目录
a.sh
#!/usr/bin/env bash
SCRIPT_DIR=$(
cd "$(dirname "$0")" || exit
pwd
)
SCRIPT_NAME=$(basename "$0")
source "${SCRIPT_DIR}"/common/init.sh
echo "a.sh common_dir:$common_dir"
common/init.sh
#!/usr/bin/env bash
common_dir=$(
cd "$(dirname "$0")" || exit
pwd
)
echo "init.sh common_dir:$common_dir"
执行
sh a.sh
结果
init.sh common_dir:/data/adrc/lixin
a.sh common_dir:/data/adrc/lixin
不符合预期。。。init.sh common_dir并没有识别到子shell所在的目录/data/adrc/lixin/common;而是父shell的目录。
结合“公共逻辑可移至子shell,变量可以传递至父shell”的测试,可以认为,source sub_shell.sh,相当于把其代码复制粘贴到父shell的位置,同时也可以自洽于 “source调用方式不会开启子shell进程”的说法。
如果子shell$0逻辑放置在函数中,由函数调用的方式,结果和之前一样。
a.sh
#!/usr/bin/env bash
SCRIPT_DIR=$(
cd "$(dirname "$0")" || exit
pwd
)
SCRIPT_NAME=$(basename "$0")
source "${SCRIPT_DIR}"/common/init.sh
init_dir
echo "a.sh common_dir:$common_dir"
common/init.sh
#!/usr/bin/env bash
function init_dir(){
common_dir=$(
cd "$(dirname "$0")" || exit
pwd
)
echo "init.sh common_dir:$common_dir"
}
执行
sh a.sh
结果
init.sh common_dir:/data/adrc/lixin
a.sh common_dir:/data/adrc/lixin
说明,$0在子shell的函数中,也是识别的父shell文件名称