从命令行

时间:2016-11-03 13:54:16

标签: bash

我想问你并请求帮助这个脚本的这个特定部分 - 我想让它更紧凑,因为我觉得它太长了,或者我可能会有更短的语法替代... < / p>

此部分是从我的脚本中删除的,用于创建具有降序日期的X量文件(1天跳转,因此每个文件比之前的日期长1天),这已经比整个&#34;实施时间长3倍&# 34;一部分。

This part's purpose is to maintain, check and correct (appropriately) the arguments defined with the script execution, which looks like
./script.sh X X
whereas script expects two arguments (number indicating amount of files to create and the path to the folder, where it is supposed to create those0:
- if there is just 1 it assumes the user wants to create files in the present folder, therefore it checks, if the one included argument is a number and if it is it will add output from pwd to the path (in this case to not have some sort of "cross-mount" accident with the system variable PATH conveniently named PATHX), so there will be two arguments at the end anyway
- if there are more than 2, it will terminate the script

If there are 2 arguments, it performs additional "tasks:
1. checks if there are just two numbers, if so, script ends
2. checks if there are just two words/letters, if so, script ends
3. if there are, let's say, just two dots as arguments, it will end anyway as there is one if, which always will need one argument to be just number
4. after first steps this will save the arguments to the variables (it is necessary as I have had some problems in the implementation part), this step even coves any possible combination of the positions of the arguments (it does not matter now, if the amount is first or second; same for the path)
5. this is a very last step, which just (for any case) covers the case, the path included has not been inserted with the slash in front (as this is mandatory for bash to recognise it indicates an absolute path) or at the end (important for the touch command in the implementation path as the command looks like "touch -t *TIMESTAMP* "$PATHXfile$i""); together with it it does provide an appropriate action, if the path is defined with ".","..","./","../" - if there would be a full path, not relative one


if [[ $# -eq 2 ]]
then
    if [[ $1 == ?(-)+([0-9]) ]] && [[ $2 == ?(-)+([0-9]) ]]
    then
        echo "Invalid arguments. Did you include a slash at the start of the path (if the file name consists only of the numbers)? Well, try it again. Terminating script..."
        exit
    elif [[ $1 == ?(-)+([a-z]) ]] && [[ $2 == ?(-)+([a-z]) ]]
    then
        echo "Only characters in the arguments. Is this some sort of a joke? If you have tried some sick hexadecimal format of number (just A-F), it will not work, mate. Terminating script..."
        exit
    fi

    if [[ $1 == ?(-)+([0-9]) ]] 
    then
        AMOUNT=$1
        PATHX=$2
    else
        AMOUNT=$2

        if [[ $AMOUNT != ?(-)+([0-9]) ]]            
        then
            echo "No argument with number/numbers-only as an amount of files to create. Terminating script..."
            exit
        fi

        PATHX=$1
    fi

else
    if [[ $# -eq 1 ]]
    then
        if [[ $1 == ?(-)+([0-9]) ]]
        then
            AMOUNT=$1
            PATHX=$(pwd)
        else
            echo "Please, include the argument with an amount of files to create. Terminating script..."
            exit
        fi

    else
        echo "2 Arguments are expected. Terminating script..."
        exit
    fi
fi

if [[ $PATHX != /* ]]
then
    if [[ "$PATHX" == "." ]] || [[ "$PATHX" == ".." ]] || [[ "$PATHX" == "./"* ]] || [[ "$PATHX" == "../"* ]]
    then
        true
    else
        PATHX=$(echo "/$PATHX")     
    fi      
fi

if [[ $PATHX != */ ]]
then
    PATHX=$(echo "$PATHX/")
fi

请原谅这种格式,但没有将描述添加到代码示例中,它只是一堆文本...... 无论如何,谢谢你,伙计们,任何意见。

1 个答案:

答案 0 :(得分:0)

可能会减少为:

[[ $# -gt 2           ]] && { echo "Incorrect number of arguments";  exit 1; }
[[ $1 == ?(-)+([0-9]) ]] || { echo "First argument is not a number"; exit 2; }
[[ $2 == ?(-)+([0-9]) ]] && { echo "Both arguments are numbers";     exit 3; }
[[ $2 == +([a-z])     ]] || { echo "File name must be only letters"; exit 4; }
[[ ! -d $2            ]] && { echo "Path does not exist";            exit 5; }

n=$1
p=${2:-$PWD}           # Use the PWD if path is missing.

if [[ $p != */ ]]; then
    echo "Missing trailing slash; correcting";
    p+=/
fi
if [[ $p != /* ]]; then
    echo "Missing leading slash; correcting";
   [[ $p == @(.|..|./*|../*) ]] || p=/"$p"
fi