2017-08-09 26 views
0

要执行一个任务,我需要按照精确的顺序创建两个触摸命令: touch aaaa-ref-bbb.done touch cccc-grp-dddd。完成创建一个脚本,以正确的顺序创建两个触摸命令总是

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

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

例如(以错误的顺序参数)

./script.sh BLA-GRP-BLA的Bleh-REF-的Bleh

将产生

触摸的Bleh-REF-的输出bleh touch 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 
+1

您能否再次阅读您的问题并修复错误?例如:在第一句中给出文件名的例子,在第二句中,你声明一个字符串包含'-ref-',这是真实的,但你也声明另一个包含'-done-',这是不正确的。然后,你的脚本使用明显错误的变量名(参见asalamon74的答案)。请帮助我们帮助你。 –

+0

我已经修复了许多错误,如我所发现的。感谢您的提醒。 – user1006082

+1

你的两个第一个例子字符串仍然不包含'-done -'子字符串。 –

回答

0

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

+0

是的,你是对的。我已更正此问题 – user1006082

0

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

我的建议是:

  • 创建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 
+0

我已尝试过您的代码。我喜欢它的有效性和简单性。我在IF语句中遇到了一个奇怪的错误。我尝试了几种引号样式(双引号,执行引号等),并且我得到了相同的错误:./ingest-tmob.sh:第36行:[:=〜:二元运算符预期。 – user1006082

+0

我已经启用调试:./ingest-tmob.sh皮托-REF波托-GRP + FIRSTPARAM =皮托-REF + SECONDPARAM =波托-GRP +回波皮托-REF 皮托-REF +回波波托-GRP poto-grp +'['pito-ref'='ref']' ./ingest-tmob.sh:line 36:[:=〜:binary binary expected +'['poto-grp'=〜 'REF ']' ./ingest-tmob.sh:线38:[:=〜:二元算预期 +用法 +回波' 用法:./ingest-tmob.sh [xxxx_ref_xxxx.tar] [xxxx_grp_yyyy.tar ]' 用法:./ingest-tmob.sh [xxxx_ref_xxxx.tar] [xxxx_grp_yyyy.tar] + exit 1 – user1006082

+0

@ user1006082 Fo r字符串比较我更喜欢使用'[[STR == * SUB_STR *]]',但在之前的答案中,我保持原样。看我的更新 –

0

让我们通过把在正确的地方你的家当线,并极大地简化了代码开始;

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

大多数情况下没有必要。