我的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手册中明确指出,当引用〜时,不会执行此扩展.
原文链接:https://www.f2er.com/bash/386349.html解决方法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”?