使用部分文件名作为变量bash

时间:2013-06-10 19:41:23

标签: bash

背景: 我在script_testing下的单字母目录中有一堆名为username.sub的文件名(用户名的第一个字母是文件夹名称)。对于每个username.sub,我需要检查行用户。$ 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

2 个答案:

答案 0 :(得分:1)

您正在搜索单词contacts - 这取决于您在这些文件中的其他内容,可能始终存在。

相反,请使用grep -q "^user\.$NAME\.Contacts"查找您的行。

答案 1 :(得分:1)

修正了以下内容:

#!/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

还添加额外的行以追加。请告诉我这是否存在问题所以我可以学习,但我没有遇到任何问题。