当前位置: 首页 > 知识库问答 >
问题:

bash:将字符串变量解释为文件名/路径

薛兴德
2023-03-14

我的bash脚本接收一个字符串形式的文件名(或相对路径),但是必须从该文件中读取。如果我在脚本中将文件名直接声明为文字(没有引号),我就只能从文件名中读取...这对于参数来说是不可能的,因为它们一开始就是隐式字符串。观察:

a="~/test.txt"
#Look for it
if [[ -a $a ]] ; then
    echo "A Found it"
else
    echo "A Error"
fi
#Try to use it
while read line; do
    echo $line
done < $a

b='~/test.txt'
#Look for it
if [[ -a $b ]] ; then
    echo "B Found it"
else
    echo "B Error"
fi
#Try to use it
while read line; do
    echo $line
done < $b

c=~/test.txt
#Look for it
if [[ -a $c ]] ; then
    echo "C Found it"
else
    echo "C Error"
fi
#Try to use it
while read line; do
    echo $line
done < $c

产量:

A Error
./test.sh: line 10: ~/test.txt: No such file or directory
B Error
./test: line 12: ~/test.txt: No such file or directory
C Found it
Hello

如上所述,我无法将命令行参数传递给上述例程,因为我得到的行为与引用字符串上的行为相同。

共有2个答案

胡星汉
2023-03-14

仍然没有那么迷人,但对我来说很管用:

home_folder="/home/$(logname)"

可以在那里工作...

邓毅
2023-03-14

这是~-扩展规则的一部分,在Bash手册中明确说明,引用~时不执行此扩展。

不要引用~

file=~/path/to/file

如果需要引用文件名的其余部分:

file=~/"path with spaces/to/file"

(这在普通外壳中是完全合法的。)

使用< code>$HOME而不是< code>~。

file="$HOME/path/to/file"

您似乎对shell变量的类型有点困惑。

一切都是一个字符串。

重复直到它陷入:一切都是字符串。(除了整数,但它们大多是字符串AFAIK之上的hacks。和数组,但它们是字符串数组。)

这是一个外壳字符串:“foo”“42”也是如此42岁也是如此。傅也是。如果你不需要引用东西,那么不这样做是合理的;谁想输入“ls”“-la”一些/目录“

 类似资料:
  • 问题内容: 我想将python变量名称转换为等效的字符串,如图所示。有什么想法吗? 问题答案: TL; DR:不可能。参见最后的“结论”。 在一个使用场景中,您可能需要此场景。我并不是在暗示没有更好的方法或实现相同的功能。 为了在调试,模式和其他类似情况下出现错误时“转储”任意词典列表,这将很有用。 需要的是该功能的反向功能: 它将以标识符名称(“变量”,“字典”等)作为参数,并返回包含标识符名称

  • 问题内容: 我试图创建一个唯一文件名的文件,每次运行脚本时,它只打算每周或每月执行一次。所以我选择使用日期作为文件名。 是我收到此错误的地方。 如果我使用静态文件名,它可以工作,打开功能是否存在问题,这意味着您不能传递这样的字符串? name是一个字符串,其值包括: 非常感谢您的帮助 问题答案: 您需要在字符串后面直接输入: 您的代码不起作用的原因是,您正在尝试的文件不是字符串格式,而且也是无效的

  • 问题内容: 我有任何字符串。像“水牛” 我想将此字符串转换为某些变量名称,例如, 不仅是这个例子,我还想将任何输入字符串转换为某个变量名。我该怎么做(在python中)? 问题答案: 之后,你可以通过以下方式进行检查: 作为输出,你将看到:

  • 问题内容: 我的变量在其中具有递增的数字,例如row0text,row1text,row2text等。 我已经找到了如何动态创建这些变量名的字符串版本的方法,但是一旦有了这些字符串,如何将它们用作实际的变量名而不是代码中的字符串? 例: 一旦知道如何执行此操作,就可以使用for循环遍历这些变量;只是目前我不确定如何在我的代码中将该字符串用作变量名。 谢谢! 问题答案: 简短的回答: 没有 充分的理

  • 考虑一下,我得到了以下枚举类: 我想指定ostream操作符( 并获得以下输出,这是Foo。 我的问题是: 是否有存储枚举“名称说明符”的地方?(即,对于枚举类TestEnum,它是None、Foo和Bar),因此我可以编写一个函数(或者至多是函数模板)来指定TestEnum的ostream操作符,例如: 到目前为止,我是这样做的: 我见过一些使用库的解决方案,但这次我不希望使用它。

  • 问题内容: 此线程讨论如何在Python中以字符串形式获取函数名称:如何在Python中以字符串 形式获取函数名称? 如何对变量执行相同操作?与函数相反,Python变量没有属性。 换句话说,如果我有一个变量,例如: 我正在寻找一个功能/属性,例如: 返回字符串 更新: 由于人们在问我为什么要这样做,这里有一个例子。我想从此列表在Pandas中创建一个DataFrame,其中列名称 由实际字典的名