Bash Non-Sense - 变量未正确传递

时间:2014-11-21 02:02:06

标签: linux bash shell ubuntu tar

当我回显文件时,当我直接在命令中输入名称时,它工作正常,但当我以文件名作为变量运行它时。它给了我一个坏与好。这显然是一个较短的等式,我试图开始工作的时间越长,但我觉得如果能让这个工作,那我就很好。

任何?任何想法为什么它给我一个坏事?

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

3 个答案:

答案 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)

多么奇怪的噩梦。但现在它有效! 我只是希望这可以帮助其他人在这个问题上打击他们的头脑。