shell 变量替换问题
shell variable substitution issue
我有一个命令输出一个以变量开头的文件路径名,例如$DIR1/file1。我将这个路径名赋给了一个变量pname,现在当我使用路径读取文件时,变量替换不起作用。模拟案例,
-> cat paths.log
$DIR1/file1
-> DIR1=/var/tmp
-> touch $DIR1/file1
-> pname=`cat paths.log`
-> echo $pname
$DIR1/file1
-> ls -l $pname
$DIR1/file1: No such file or directory
有人知道如何解决这个问题吗?
您需要使用 eval 来实现字符串内变量的扩展。这里我设置expanded
为展开的结果:
$ pname='$DIR1/file1'
$ echo $pname
$DIR1/file1
$ DIR1=/var/tmp
$ expanded=`eval echo $pname`
$ echo $expanded
/var/tmp/file1
您可以使用 envsubst
命令执行此操作并避免 eval
的危险,如下所示:
$ cat path.log
$DIR1/file1
$ export DIR1=/var/tmp
$ pname=$(envsubst < path.log)
$ printf "%s\n" "$pname"
/var/tmp/file1
请注意,您必须导出 DIR1
才能正常工作,而不仅仅是分配它。
我有一个命令输出一个以变量开头的文件路径名,例如$DIR1/file1。我将这个路径名赋给了一个变量pname,现在当我使用路径读取文件时,变量替换不起作用。模拟案例,
-> cat paths.log
$DIR1/file1
-> DIR1=/var/tmp
-> touch $DIR1/file1
-> pname=`cat paths.log`
-> echo $pname
$DIR1/file1
-> ls -l $pname
$DIR1/file1: No such file or directory
有人知道如何解决这个问题吗?
您需要使用 eval 来实现字符串内变量的扩展。这里我设置expanded
为展开的结果:
$ pname='$DIR1/file1'
$ echo $pname
$DIR1/file1
$ DIR1=/var/tmp
$ expanded=`eval echo $pname`
$ echo $expanded
/var/tmp/file1
您可以使用 envsubst
命令执行此操作并避免 eval
的危险,如下所示:
$ cat path.log
$DIR1/file1
$ export DIR1=/var/tmp
$ pname=$(envsubst < path.log)
$ printf "%s\n" "$pname"
/var/tmp/file1
请注意,您必须导出 DIR1
才能正常工作,而不仅仅是分配它。