循环脚本通过执行touch引发0

时间:2018-06-22 11:46:25

标签: bash shell while-loop command touch

我正在编写一个脚本,可以为我创建一个while循环,而不必一次又一次地编写while循环。

简短说明: 命令“循环”将执行命令参数-n次,并暂停-p秒。您可以使用-e回显该命令而不执行它。 -v显示所有参数。另外,可以使用while循环的迭代器。

玩弄它,我发现了一个错误。

loop --verbose --times 5 'touch testfile$i'
#loop the touch command 5 times and generate the testfiles 0 to 4

same as:
loop -v -n 5 'touch testfile$i'

它会生成“ testfile0”到“ testfile4”,还会生成一个名为“ 0”的文件

有人知道为什么会生成文件“ 0”吗? 您如何看待这样的命令?您要使用它吗?

最佳 史蒂文

#!/bin/bash

# easy to use loop command
#
# Autor: Steven Wagner
# Date: 22 June 2018
# Version: 0.1


TIMES=0
FREQUENCY=0
PAUSE="0"
VERBOSE=false
ECHOONLY=false
SILENCE=false

POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -n|--times)
    temp="$2"
    if [[ $temp =~ ^[[:digit:]]+$ ]];
    then
        TIMES=$temp
    else
            echo "ERROR: value is not a digit"
        exit
    fi
    shift # past argument
    shift # past value
    ;;
    -p|--pause)
    #PAUSE="$2"
    temp="$2"
    PAUSE=$temp
    #if [[ $temp =~ ^[[:digit:]]+$ ]];
    #then
    #   PAUSE=$temp
    #else
    #       echo "ERROR: value is not a digit"
    #   exit
    #fi
    shift # past argument
    shift # past value
    ;;
    -v|--verbose)
    VERBOSE=true
    shift # past argument
    ;;
    -e|--echo-only)
    ECHOONLY=true
    shift # past argument
    ;;
    -s|--silence)
    SILENCE=true
    shift # past argument
    ;;
    --*)
    echo "Error \"$key\" not known"
    shift #past argument
    ;;
    -*)
    i=0
    while [[ $i -lt ${#key}-1 ]]
    do
        char=${key:$[$i+1]:1}
        case $char in
            v)
                VERBOSE=true
            ;;
            e)
                ECHOONLY=true
            ;;
            s)
                SILENCE=true
            ;;
        esac
        (( i++ ))
    done
    shift # past argument
    ;;
    *)    # unknown option
    POSITIONAL+=("$1") # save it in an array for later
    shift # past argument
    ;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters


#Pause make sleep command
pause=""
if [ $PAUSE > 0 ]
then
    pause="sleep $PAUSE"
fi

#times make while control-command
times=""
if [ $TIMES != 0 ]
then
    times="[ \$i -lt \$TIMES ]"
else
    times="true" #infinity loop
fi

#Echo Only
command=$@
if $ECHOONLY
then
    command="echo $@"
fi

#Silence
silence=""
if $SILENCE && ! $ECHOONLY
then
    silence="&>/dev/null"
fi

if $VERBOSE
then
    echo "pause = $PAUSE"
    if [ $TIMES != 0 ]
        then 
        echo "times = $TIMES"
    else
        echo "times = infinity"
    fi
    if $ECHOONLY; then echo "echo only = yes"; fi
    if $SILENCE; then echo "silence = yes"; fi
    echo "command = '$@' $silence"
    echo
fi


#start the loop
timestamp=$(date +%s%N)
eval "
i=0
while $times
do 
    eval '$command' $silence
    $pause
    (( i++ ))
done
"

if $VERBOSE
then
    echo
    echo "duration: $[($(date +%s%N)-$timestamp)/1000000]ms"
fi

0 个答案:

没有答案