我正在尝试使用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
你们能看到我所缺少的吗? 非常感谢!
答案 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"
...