为了执行一项任务,我需要按照精确的顺序制作两个触摸命令: 触摸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
答案 0 :(得分:0)
您正在定义2sttouch
和1ndtouch
个变量并使用firsttouch
和secondtouch
。您应该使用相同的变量名称。
答案 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
大部分内容都没有必要。