微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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”?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐