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

前端之家收集整理的这篇文章主要介绍了bash:将字符串变量解释为文件名/路径前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的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

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

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

解决方法1

不要引用〜.

file=~/path/to/file

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

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

(这在花园种类的壳中完全合法.)

解决方法2

使用$HOME而不是〜.

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

BTW:Shell变量类型

你似乎对shell变量的类型有些困惑.

一切都是一个字符串.

重复,直到它沉入:一切都是一个字符串. (除了整数,但它们主要是字符串AFAIK之上的黑客,而数组,但它们是字符串数组)

这是一个shell字符串:“foo”. “42”也是.所以是的.如果你不需要引用东西,那就不合适了谁想要输入“ls”“-la”“some / dir”?

原文链接:https://www.f2er.com/bash/386349.html

猜你在找的Bash相关文章