创建一个脚本,以正确的顺序生成两个触摸命令

时间:2017-08-09 09:51:40

标签: bash shell

为了执行一项任务,我需要按照精确的顺序制作两个触摸命令: 触摸aaaa-ref-bbb.done 触摸cccc-grp-dddd.done

Beinng aaaa .. dddd任何一种字符串。第一个字符串包含“-ref-”,第二个字符串包含“-done - ”

我想创建一个应用两个触摸命令的脚本,与参数传递的顺序无关。

例如(参数顺序错误)

./ script.sh bla-grp-bla bleh-ref-bleh

将产生

的输出

触摸bleh-ref-bleh 触摸bla-grp-bla

如果以正确的顺序写入参数,则触摸命令遵循正确的顺序。

我做了几次尝试,每次改变都接近目标,但现在我被困住了。 你能帮帮忙吗?

#### tool for touch debug mode (set -x / set +x)
#!/bin/bash
#
#### USAGE

##### Constants

#start debug code
exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x

FIRSTPARAM=$1
SECONDPARAM=$2

echo $FIRSTPARAM
echo $SECONDPARAM

dotouch()
{
if [[ "$FIRSTPARAM" =~ 'ref' ]]; then
  echo 'correct order, processing...'
  sleep 3
  firsttouch = $FIRSTPARAM'.done'
  secondtouch = $SECONDPARAM'.done'
  echo $firsttouch
  touch $firsttouch
  sleep 1
  touch $secondtouch
  echo "touch was"  $1 $2

else
  secondtouch = $FIRSTPARAM'.done'
  firstouch = $SECONDPARAM'.done'
  touch $firsttouch
  sleep 1
  touch $secondtouch
  echo "touch was"  $2 $1
fi
}

if      [ "$FIRSTPARAM" =~ "ref" ] || [ "$FIRSTPARAM" =~ "grp" ]; then
          dotouch()
          echo "touch commands executed"
          exit 0
else
          echo "Usage: $0 [xxxx_ref_xxxx.tar] [xxxx_grp_yyyy.tar] "
          exit 1

fi
  exit 0
#end debug code
set +x

3 个答案:

答案 0 :(得分:0)

您正在定义2sttouch1ndtouch个变量并使用firsttouchsecondtouch。您应该使用相同的变量名称。

答案 1 :(得分:0)

问题是您在进入if功能之前没有考虑主dotouch上的不同情况。在表达式中,您只评估第一个参数,因此您实际上并不知道第二个参数的内容。

我的建议是:

  • 创建一个doTouch函数,该函数只按接收顺序触及2个接收参数。
  • main代码中添加不同的案例(如果还有更多,请添加更多elif语句)。

这是代码(没有调试注释):

#!/bin/bash

#######################################                                                                                                                                                                                                     
# Script function helpers
#######################################
doTouch() {
  local ref=$1
  local grp=$2

  echo "Touching $ref"
  touch "$ref"

  echo "Touching $grp"
  touch "$grp"

  echo "Touching order was: $ref $grp"
}

usage() {
  echo "Usage: $0 [xxxx_ref_xxxx.tar] [xxxx_grp_yyyy.tar]"
}

#######################################
# Main
#######################################

# Retrieve parameters
FIRSTPARAM=$1
SECONDPARAM=$2

echo $FIRSTPARAM
echo $SECONDPARAM

# Check parameter order and touch
if [[ $FIRSTPARAM == *"ref"* ]] && [[ $SECONDPARAM == *"grp"* ]]; then
  doTouch $FIRSTPARAM $SECONDPARM
elif [[ $SECONDPARAM == *"ref"* ]] && [[ $FIRSTPARAM == *"grp"* ]]; then
  doTouch $SECONDPARM $FIRSTPARAM
else
  usage
  exit 1
fi

# Regular exit
exit 0

答案 2 :(得分:0)

让我们首先将您的shebang线放在正确的位置,并大大简化代码;

#!/bin/bash
#### tool for touch debug mode (set -x / set +x)

exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x

FIRSTPARAM=$1
SECONDPARAM=$2

echo $FIRSTPARAM
echo $SECONDPARAM

dotouch() {
touch "$1"
echo "$Just touched $1"
return 
}


case $FIRSTPARAM in
*"ref"*) dotouch $FIRSTPARAM'.done' ; dotouch $SECONDPARAM'.done' ;;
*"grp"*) dotouch $SECONDPARAM'.done' ; dotouch $FIRSTPARAM'.done' ;;
*) echo "Usage: $0 [xxxx_ref_xxxx.tar] [xxxx_grp_yyyy.tar] " ; exit 1 ;;
esac



exit 0
#end debug code
set +x

大部分内容都没有必要。