【问题标题】:How to expand macros in strings read from a file in a ksh script?如何扩展从 ksh 脚本中的文件读取的字符串中的宏?
【发布时间】:2021-10-19 15:16:27
【问题描述】:

我想读取存储在文件中的文件名列表,顶层目录是一个宏,因为这是一个可以在多个环境中运行的脚本。 例如,有一个文件 file_list.txt 包含以下完全限定的文件路径:

$TOP_DIR/subdir_a/subdir_b/file_1
$TOP_DIR/subdir_x/subdir_y/subdir_z/file_2 

在我的脚本中,我想对文件进行 tar,但为了做到这一点,tar 必须知道实际路径。 如何获取包含文件路径的字符串以扩展宏以获取实际路径? 在下面的代码中,回显的字符串值与上面的文件完全相同。 我尝试使用 actual_file_path=`eval $file_path` 并且 eval 确实评估宏,它返回一个状态,而不是评估的路径。

for file_path in `cat $input_file_list`
do
    echo "$file_path"
done

【问题讨论】:

    标签: ksh string-substitution expression-evaluation


    【解决方案1】:

    使用标签ksh 我认为您没有实用程序envsubst。
    当$input_file_list中的变量数量非常有限时,可以用awk替换vars:

    awk -v top_dir="${TOP_DIR}" '{ sub(/$TOP_DIR/, top_dir); print}' "${input_file_list}"
    

    【讨论】:

      【解决方案2】:

      我错误地使用了 eval。解决方法是在eval右侧使用赋值如下:

      for file_path in `cat $input_file_list`
      do
          eval myfile=$file_name
          echo "myfile = $myfile"
      done
      

      $myfile 现在具有宏的实际扩展。

      【讨论】:

      • 鉴于特殊字符和可能的命令,您想在没有eval 的情况下找到答案。 This 'filename' is nice.
      • @WalterA 你是说使用 eval 是安全问题还是别的什么?
      • 两者。测试当您的文件名包含空格和引号(不正确的分配)时会发生什么。我看不到您在哪里为 file_name 设置了值,请考虑下一个示例:touch important_file; file_name='file$(rm importantfile)name'; eval myfile=$file_name; ls important_file
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多