【问题标题】:Create a script that makes two touch command in the right order always创建一个脚本,使两个触摸命令始终以正确的顺序
【发布时间】:2017-08-10 17:02:05
【问题描述】:

为了执行一项任务,我需要以精确的顺​​序发出两个触摸命令: 触摸 aaaa-ref-bbb.done touch cccc-grp-dddd.done

Being aaaa .. dddd 任何类型的字符串。第一个字符串包含“-ref-”,第二个字符串包含“-done-”

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

例如(参数顺序错误)

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

将产生一个输出

touch 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

【问题讨论】:

  • 您能否再次阅读您的问题并修复错误?示例:在第一句中,您给出了文件名的示例,在第二句中,您声明一个字符串包含-ref-,这是正确的,但您还声明另一个字符串包含-done-,这是不正确的。然后,您的脚本使用了明显错误的变量名(请参阅 asalamon74 的回答)。请帮助我们帮助您。
  • 我已经修复了尽可能多的错误。谢谢提醒。
  • 您的前两个示例字符串仍然不包含 -done- 子字符串。

标签: bash shell


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    让我们首先将你的 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
    

    大部分都不需要。

    【讨论】:

      【解决方案3】:

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

      我的建议是:

      • 创建一个doTouch 函数,该函数只需按接收到的顺序触摸 2 个接收到的参数。
      • main代码上添加不同的case(如果有更多,添加更多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
      

      【讨论】:

      • 我已经试过你的代码了。我喜欢它的有效性和简单性。我在 IF 语句中遇到了一个奇怪的错误。我尝试了几种引号样式(双引号、执行引号等),我得到了同样的错误:./ingest-tmob.sh: line 36: [: =~: binary operator expected.
      • 我已启用调试:./ingest-tmob.sh Pito-ref poto-grp + FIRSTPARAM=pito-ref + SECONDPARAM=poto-grp + echo Pito-ref Pito-ref + echo poto- grp poto-grp + '[' Pito-ref '=~' ref ']' ./ingest-tmob.sh: line 36: [: =~: binary operator expected + '[' poto-grp '=~' ref ']' ./ingest-tmob.sh: 第 38 行: [: =~: 二元运算符预期 + 用法 + echo '用法:./ingest-tmob.sh [xxxx_ref_xxxx.tar] [xxxx_grp_yyyy.tar]' 用法:. /ingest-tmob.sh [xxxx_ref_xxxx.tar] [xxxx_grp_yyyy.tar] + 退出 1
      • @user1006082 对于字符串比较,我更喜欢使用[[ STR == *SUB_STR* ]],但在上一个答案中我保持原样。查看我的更新
      • @user1006082 如果有用,请考虑accepting这个答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多