Bash脚本-使用空格作为字符串

时间:2020-05-15 09:27:23

标签: bash unix sh

我正在尝试使用bash脚本构建一个非常简单的TODO列表。它应该允许用户添加和删除任务,并查看整个列表。 我已经用以下脚本完成了。但是我有一个问题,允许给定的任务将空格作为字符串。例如,如果我使用以下命令添加任务:./programme_stack.sh add 1 start projet n1,它将仅添加带有“ start”的任务。 我已经在线阅读了几本书,我知道,我应该用双引号将变量括起来,但是在尝试之后,它不起作用。我肯定在路上想念东西。

这是我的剧本:

#!/bin/bash

TACHES=$HOME/.todo_list
# functions
function remove() {
    res_remove=$(sed -n "$1p" $TACHES)
    sed -i "$1d" $TACHES
}

function list() {
    nl $TACHES
}

function add() {
    if [ ""$(($(wc -l $TACHES | cut -d " " -f 1) + 1))"" == "$1" ]
    then
        echo "- $2" >> $TACHES
    else
        sed -i "$1i - $2" $TACHES
    fi
    echo "Task \"$2\" has been add to the index $1"
}

function isNumber() {
    re='^[0-9]+$'
    if ! [[ $@ =~ $re ]] ; then
        res_isNumber=true
    else
        res_isNumber=false
    fi
}

# application
case $1 in 
    list)
        list
        ;;
    done)
        shift
        isNumber $@
        if ! [[ "$res_isNumber" = false ]] ; then
            echo "done must be followed by an index number"
        else
            nb_taches=$(wc -l $TACHES | cut -d " " -f 1)
            if [ "$1" -ge 1 ] && [ "$1" -le $nb_taches ]; then
                remove $1
                echo "Well done! Task $i ($res_remove) is completed"
            else
                echo "this task doesn't exists"
            fi        
        fi
        ;;
    add)
        shift
        isNumber $1
        if ! [[ "$res_isNumber" = false ]] ; then
            echo "add must be followed by an index number"
        else
            index_max=$(($(wc -l $TACHES | cut -d " " -f 1) + 1))
            if [ "$1" -ge 1 ] && [ "$1" -le $index_max ]; then
                add $1 $2
            else
                echo "Idex must be between 1 and $index_max"
            fi        
        fi
        ;;
    *)
        echo "./programme_stack.sh (list|add|done) [args]"
        ;;
esac

你们能看到我所缺少的吗? 非常感谢!

1 个答案:

答案 0 :(得分:1)

要使脚本支持嵌入式空间,需要进行两项更改 1)接受嵌入式空间- 1A)传入引号script add nnn "say hello"中的任务名称,或者 1B)将所有输入参数连接为单个字符串。 2)引用任务名称以防止将其分解为单个单词

在代码中,实现1B和2

add)
   ...
 if [ "$1" -ge 1 ] && [ "$1" -le $index_max ]; then
    num=$1
    shift
    # Combine all remaining arguments
    todo="$@"
    add "$num" "$todo"
 ...