当我回显文件时,当我直接在命令中输入名称时,它工作正常,但当我以文件名作为变量运行它时。它给了我一个坏与好。这显然是一个较短的等式,我试图开始工作的时间越长,但我觉得如果能让这个工作,那我就很好。
任何?任何想法为什么它给我一个坏事?
if [ -f /home/publish/swift/$TAR_FILE ]; then echo "good"; else echo "bad"; fi
但是当我使用时很好:
if [ -f /home/publish/swift/swift_tar_1212.tgz ]; then echo "good"; else echo "bad"; fi
答案 0 :(得分:3)
如果将TAR_FILE设置为相同的值,那么它应该可以正常工作
TAR_FILE='swift_tar_1212.tgz'
请自己帮个忙,总是把字符串写成引号:
if [ -f "/home/publish/swift/$TAR_FILE" ]; then echo "good"; else echo "bad"; fi
单引号,如果您不想要$ ...扩展。
也许你会发现设置xtrace很有用:
set -x
用
关闭它set +x
如果你想为dir中的所有文件添加glob,而不知道他们的名字:
for file in /home/publish/swift/*; do
test -f "$file" && echo "$file"
done
所有文件都不完全正确,隐藏文件不是这样匹配的!
for file in /home/publish/swift/{.*,*}; do
test -f "$file" && echo "$file"
done
正如@ mklement0所说,你可以使用shopt来修改globbing => http://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html 在您的情况下,以下选项可能会对您有所帮助:
dotglob
extglob
failglob
globstar
nocaseglob
nocasematch (``[[ ]]`` only)
nullglob (very useful)
在.bashrc中设置这些值可能会令人困惑,因为Web中的很多示例都基于默认值。不幸的是,shopt不能仅限于shell函数 - 这就是痛苦。
答案 1 :(得分:1)
试试这个
if [ -f "/home/publish/swift/$TAR_FILE" ]
then
echo "good"
else
echo "bad"
fi
答案 2 :(得分:0)
这个问题让我几天难以理解,我知道其他服务器的字符串返回有些奇怪。我添加了最终为我工作的代码。
目标: ssh到其他服务器,在某个目录中运行命令以确定最新更新的.tgz,然后获取该文件的名称并将其传递给变量,以便它可以从当前实例运行到SCP。代码如下
#SSH into the master prod machine and find the latest TAR.
TARFILE="$(ssh -i cross-key -t login@server 'bash -c "cd /home/publish/swift; find *.tgz -type f | xargs ls -t"')"
#Telling us the latest .tgz of Swift Website
echo "TAR List:$TARFILE"
#Pass the List into an Array and then Get the first one which is the latest .tgz file
IFS=' ' read -a array <<< "$TARFILE"
TAR_FILE "${array[0]}"
这终于给了我一个字符串,我需要继续我的if和else语句。
if [ -f /home/publish/swift/$TAR_FILE ]; then echo "good"; else echo "bad"; fi
我能够变得更好 - 因此我可以继续执行新的tgz文件。我必须将完整列表传递给数组,而不是将最后一个值传递给:
$(find *.tgz -type f | xargs ls | tail -n 1)
多么奇怪的噩梦。但现在它有效! 我只是希望这可以帮助其他人在这个问题上打击他们的头脑。