Bash shell变量替换问题

Bash shell变量替换问题,bash,sh,ksh,Bash,Sh,Ksh,我有一个命令输出一个以变量开头的文件路径名,比如$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/fil

我有一个命令输出一个以变量开头的文件路径名,比如$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

您需要使用eval来实现字符串内变量的扩展。在这里,我将
expanded
设置为展开的结果:

$ pname='$DIR1/file1'
$ echo $pname
$DIR1/file1
$ DIR1=/var/tmp
$ expanded=`eval echo $pname`
$ echo $expanded
/var/tmp/file1

您可以使用
envsubt
命令执行此操作,并避免
eval
的危险,如下所示:

$ cat path.log
$DIR1/file1

$ export DIR1=/var/tmp
$ pname=$(envsubst < path.log)
$ printf "%s\n" "$pname"
/var/tmp/file1
$cat path.log
$DIR1/文件1
$export DIR1=/var/tmp
$pname=$(envsubt

请注意,您必须导出
DIR1
才能工作,而不仅仅是分配它。

您可以使用
envsubt
命令执行此操作,并避免
eval
的危险,如下所示:

$ cat path.log
$DIR1/file1

$ export DIR1=/var/tmp
$ pname=$(envsubst < path.log)
$ printf "%s\n" "$pname"
/var/tmp/file1
$cat path.log
$DIR1/文件1
$export DIR1=/var/tmp
$pname=$(envsubt

请注意,您必须导出
DIR1
才能工作,而不仅仅是分配它。

请不要将脚本与输出混合使用(您可以在命令之前使用
$
,让我们知道您正在向我们显示一个交互式会话)。或者实际上,您对此处的扩展顺序更感兴趣:请参阅。参数扩展发生在命令替换之前,因此
$pname
中的
$DIR1
是一个文本字符串,而不是扩展的字符串。请不要将脚本与输出混合使用(您可以在命令之前使用
$
让我们知道您正在向我们显示一个交互式会话),您对这里的扩展顺序更感兴趣:请参见。参数扩展发生在命令替换之前,因此
$pname
中的
$DIR1
是一个文本字符串,而不是扩展的字符串。