【问题标题】:BASH Variable changes value with combined with string valueBASH 变量结合字符串值改变值
【发布时间】:2017-10-11 01:05:43
【问题描述】:

我正在尝试编写一个 bash 脚本,它将查找文件夹中的所有 .txt 文件,获取基本名称,然后重新定位文件。但是,我遇到了一个问题,每当我尝试将文件名与字符串组合时,它会从 for 循环中输出“*.txt”通配符,而不是它找到的实际文件。如果我只是回显变量,它会输出预期的文件名。

我在下面包含了一个简化的脚本及其产生的输出。我是 BASH 的新手,我认为这与它处理变量的方式有关。我一直在寻找几个小时的解释,但我还没有真正想出任何东西。谁能解释为什么连接时值会发生变化?

示例代码如下:

TEMP_PATH=C/Test

for testFile in $TEMP_PATH/*.txt; do
    testFileName=$(basename "$testFile")
    echo $testFileName
    echo "FileName:$testFileName"
done

这是每个 echo 的示例输出

TestOne.txt
FileName:*.txt

这是目录中的文件。 TestingToo.sh 就是上面显示的脚本

TestingToo.sh  TestOne.txt

任何帮助将不胜感激!谢谢。

【问题讨论】:

  • 我无法重现您的结果。当我在描述的环境中运行你的脚本时,我得到了TestOne.txt FileName:TestOne.txt,正如预期的那样
  • 嗯。我只是尝试完全按照我在此处编写的脚本复制我的脚本并再次运行它。它仍然为我产生相同的输出。这会很奇怪,但我想知道它是否与我在 Windows 系统上运行它有关。我已经尝试过 git bash 和 windows 10 developer bash。两者产生相同的结果...
  • 你确定你在C/Test下有一些txt文件吗?如果不是,则字符串 $TEMP_PATH/*.txt 不会扩展为 C/Test 下的文件列表。它将按“原样”采用,因此您最终会将变量 testFile 设置为 C/Test/*.txt。下一个命令会将testFileName 设置为*.txt。然后,在第一个 echo 命令中,bash 会将 *.txt 替换为一组匹配文件,即:当前目录中的 TestOne.txt。但在第二个回显命令中,将没有与FileName:*.txt 模式匹配的文件。所以 bash 会保持原样。
  • 是的,脚本和 TestOne.txt 都在 C:\Test 中。主帖中的第三个代码块是在 /mnt/c/Test 中从 ls 命令输出的。所以它似乎认识到 C:\Test 和 C/Test 是同一个位置。我还尝试对 TEMP_PATH 显式使用 /mnt/c/Test 并产生相同的输出。
  • echo C/Test/*.txt 命令产生什么输出?

标签: bash shell


【解决方案1】:

试试这个

#!/usr/bin/env bash

TEMP_PATH=~/temp
TARGET_PATH=~/temp2

filenames=`find "$TEMP_PATH" -name "*.txt" `

if [ -z "$filenames" ] ; then echo "files not found" ; exit ; fi

for testFile in $filenames; do
    testFileName=$(basename "$testFile")
    echo $testFileName
    mv "${testFile}" "${TARGET_PATH}/${testFileName}"
done

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 2022-01-06
    • 1970-01-01
    • 2014-12-24
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多