gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:45:12 25 4
gpt4 key购买 nike

我的 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

yield :

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

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

最佳答案

这是 ~ 扩展规则的一部分。 Bash 手册中明确指出,当引用~ 时,不会执行此扩展。

解决方法 1

不要引用 ~

file=~/path/to/file

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

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

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

解决方法 2

使用 $HOME 而不是 ~

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

顺便说一句:Shell 变量类型

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

一切都是字符串。

重复直到理解:一切都是字符串。(整数除外,但它们大多是在字符串 AFAIK 之上的黑客攻击。还有数组,但它们是字符串数组 .)

这是一个 shell 字符串:"foo""42" 也是如此。 42 也是如此。 foo 也是如此。如果你不需要引用的话,不引用也是合理的;谁想输入 "ls""-la""some/dir"

关于string - bash:将字符串变量解释为文件名/路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16703624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com