我的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
如上所述,我无法将命令行参数传递给上面的例程,因为我得到了与引用的字符串相同的行为。
答案 0 :(得分:33)
这是~
- 扩展规则的一部分。 Bash手册中明确指出,引用~
时不会执行此扩展。
不要引用~
。
file=~/path/to/file
如果您需要引用文件名的其余部分:
file=~/"path with spaces/to/file"
(这在花园品种的外壳中完全合法。)
使用$HOME
代替~
。
file="$HOME/path/to/file"
你似乎对shell变量的类型有点困惑。
一切都是一个字符串。
重复直到它陷入其中:一切都是一个字符串。(除了整数,但它们主要是在字符串AFAIK之上的黑客。和数组,但它们是数组的字符串。)
这是一个shell字符串:"foo"
。 "42"
也是如此。 42
也是如此。 foo
也是如此。如果你不需要引用东西,那就不合理了;谁想要输入"ls" "-la" "some/dir"
?
答案 1 :(得分:0)
仍然没有那么迷人,但对我有用:
home_folder="/home/$(logname)"
可以从那里工作...