将文件名的一部分用作变量bash

将文件名的一部分用作变量bash,bash,Bash,背景: 在script_测试下,我在单字母目录中有一堆名为username.sub的文件名(用户名的第一个字母是文件夹名)。对于每个username.sub,我需要检查行user.$username.contacts是否存在,如果不存在,则在该行后面附加一个真正的选项卡 问题: 鉴于我下面的代码,为什么它不附加到文件中?我想我错过了一些简单的事情。我一直在收到“联系人已订阅”的邮件,即使没有这一行 #!/bin/bash Path_to_files=/home/user/script_test

背景: 在script_测试下,我在单字母目录中有一堆名为username.sub的文件名(用户名的第一个字母是文件夹名)。对于每个username.sub,我需要检查行user.$username.contacts是否存在,如果不存在,则在该行后面附加一个真正的选项卡

问题: 鉴于我下面的代码,为什么它不附加到文件中?我想我错过了一些简单的事情。我一直在收到“联系人已订阅”的邮件,即使没有这一行

#!/bin/bash
 Path_to_files=/home/user/script_testing/^[A-z]+$/
 FULLNAME="${Path_to_files##*/}"
 NAME="${FULLNAME%.*}"
 if grep 'contacts' $NAME.sub; then
   echo 'contacts already subscribed'
else
    echo "subscribing to contacts"
    echo -e user.$NAME.Contacts \t >> $NAME.sub
fi

您正在搜索“联系人”——根据这些文件中的其他内容,这些联系人可能始终存在


相反,请使用
grep-q“^user\.$NAME\.Contacts”
查找您的线路。

修复了以下问题:

#!/bin/bash
#testing directory
#p=$HOME/script_testing
for f in "$p"/*/*.sub ; do
# if this is a file
 if [ -f "$f" ]; then
# define variables
F="${f##*/}"
u="${F%%.*}"
cont=$(grep "user.$u.Contacts" "$f")
cal=$(grep "user.$u.Calendar" "$f")
# if our file doesn't contain Contacts subscription
if [ -z "$cont" ]; then
 # add Contacts subscription
 echo -e "user.$u.Contacts\t" >> "$f"
#fi
# if our file doesn't contain Calendar subscription
elif [ -z "$cal" ]; then
 # add Calendar subscription
 echo -e "user.$u.Calendar\t" >> "$f"
fi
fi
done

还添加了附加的额外行。请告诉我这是否有问题,以便我可以了解,但我没有遇到任何问题。

文件
username.sub
中是否有多行
联系人
?当然,这被忽略了。在我的测试文件中,只有另外一行-
user.$NAME.folder
现在我得到了预期的回显响应,但实际上没有向文件写入任何内容。如果您获得“订阅联系人”,但没有向文件添加任何内容,则您可能没有写入权限。另外,我建议重复引用echo的参数,这样你的
\t
就不会在途中迷路。我觉得我在寻找眼前的东西,却找不到。我现在得到的“联系人已订阅”,无论发生什么,该文件没有被写入。我确实有写权限。现在,我做了建议的修改,并删除了第2行中的正则表达式,以防出错。现在在单个文件上进行测试-如果我将所有内容硬编码为w/out变量,效果很好。@user2472122:建议您查看$?,对于grep,如果无法打开文件,则返回2,如果无法找到匹配项,则返回1。我是个呆子。它正在创建/附加到与脚本位于同一目录中的文件,而不是username.sub文件所在的目录。我现在就得弄清楚这些调整