【问题标题】:sign automatic number to my file in bash在bash中将自动编号签名到我的文件
【发布时间】:2014-06-11 15:44:33
【问题描述】:

我正在尝试为重定向并存储在文件中的字符串分配一个唯一编号。

您必须填写一个表格,我想用它发送一个唯一的号码。 示例:

echo fill in the form

echo place

read place

date

"place: $place, time $(date) >> List

它必须看起来像这样。

outcome in List
number 1, place, time
number 2, place, time
number 3, place, time

我使用了一个循环,但得到了以下结果。

number 0, place, time
number 0, place, time.

我想我需要一个函数来检查文件中给出的最后一个数字并将其加 1,但我想知道是否有更简单的方法。

【问题讨论】:

    标签: bash for-loop scripting


    【解决方案1】:

    也许是这个:

    #!/bin/bash
    
    # Optionally truncate file
    # : > List
    
    I=0
    
    while
        read -p "Place: " PLACE
        read -p "Time: " TIME
        echo "number $((++I)), $PLACE, $TIME" >> List
        read -n 1 -p "Continue? " && [[ $REPLY == [yY] ]]
    do
        continue
    done
    

    更新:

    #!/bin/bash
    
    # Optionally truncate file
    # : > List
    
    shopt -s extglob
    
    for (( I = 1;; ++I )); do
        for (( ;; )); do
            read -p "Place: " PLACE
            read -p "Time: " TIME
            until
                read -p "Save data? "
                [[ $REPLY == [nN]?([oO]) ]]
            do
                [[ $REPLY == [yY]?([eE][sS]) ]] && break 2
                echo "Please answer Y[es] or N[o]."
            done
        done
        echo "Saving \"number $I, $PLACE, $TIME\"."
        echo "number $I, $PLACE, $TIME" >> List
        until
            read -p "Continue? "
            [[ $REPLY == [yY]?([eE][sS]) ]]
        do
            [[ $REPLY == [nN]?([oO]) ]] && break 2
            echo "Please answer Y[es] or N[o]."
        done
        echo
    done
    

    【讨论】:

    • 确保使用 bash 运行它:bash script.sh
    • 我确实用 bash 运行过它。想弄清楚出了什么问题
    • 现在可以了,但是数量没有增加。它保持在一个。
    • 这里确实增加了。您确定您使用 bash 运行它,并且您没有查看 List 中的旧数据?
    • 现在可以使用了,谢谢。我关闭脚本并再次运行它,计数器再次启动。我试图避免这种情况。
    【解决方案2】:

    要生成16个字符的随机十六进制字符串,可以使用r=$(openssl rand -hex 8)

    要找到最后使用的数字并增加它,您可以这样做

    prev=$(awk -F, 'END {print $1}' List)
    printf "%d, place:%s, time:%s\n" $((prev+1)) "$place" "$(date)" >> List
    

    如果脚本可以同时执行,这将受到竞争条件的影响

    从 1 开始:

    if [[ ! -f List ]]; then
        prev=1
    else
        prev=$(awk -F, 'END {print $1}' List)
    fi
    printf "%d, place:%s, time:%s\n" $((prev+1)) "$place" "$(date)" >> List
    

    【讨论】:

    • 我想从 1 开始。我有点困惑,我以为 printf 是 csharp。
    • 谢谢,我还是遇到了一个错误。 -F, : 语法错误 : 操作数预期(错误标记是 ","
    • 嗯,应该不会有错误。准确显示您正在执行的操作。
    • 有什么特别需要解释的部分吗?
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2019-06-19
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多