抽离公共逻辑至子shell(source)

在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文件名称

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值