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

String bash:将字符串变量解释为文件名/路径,string,bash,filenames,String,Bash,Filenames,我的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 $l

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

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

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

解决方法1 不要引用
~

file=~/path/to/file
file="$HOME/path/to/file"
如果需要引用文件名的其余部分:

file=~/"path with spaces/to/file"
(这在花园里是完全合法的。)

解决方法2 使用
$HOME
而不是
~

file=~/path/to/file
file="$HOME/path/to/file"
顺便说一句:Shell变量类型 您似乎对shell变量的类型有点困惑

一切都是一根弦

重复此过程直到它进入:一切都是一个字符串。(除了整数,但它们大多是字符串之上的黑客。还有数组,但它们是字符串数组。)


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

仍然没有那么迷人,但为我工作:

home_folder="/home/$(logname)"

可以从那里开始工作…

“~/test.txt”和“~/test.txt”停止将~扩展到您的主目录中~/test.txt可以工作,因为它没有引号。停止使用~notation或停止使用引号……如果只使用脚本的命令行参数(
$1
),则一切都会正常工作,因为在调用脚本之前,主目录扩展已经完成。@rici Yes,如果从命令行或其他脚本调用他的脚本时,
~
没有被引用。另一种情况是,当他的脚本从另一个程序调用时,它传递了一个文本
~
,这将是一个错误,应该在另一个程序中修复;但是如果他想在自己的脚本中处理这种情况,他可能需要
eval
file=~“/path with spaces/to/file”
也不起作用。有必要将
file=~/“path with spaces/to/file”
@sercxjo对我来说,它在zsh上工作,在bash上不工作。也就是说,
~/“
更便于携带。@sercxjo(和Nick)亲自修改了这些建议-使用
$HOME
更为一致和直观。
~
应该只在有效的地方被视为一种方便。像利用引用语义这样的跳转可能“有效”“但这是脆弱和令人困惑的。只需重新强调上述实际问题,'这是~-扩展规则的一部分。Bash手册中明确指出,当~被引用为“OP can you maybe put in big text!”时,不会执行此扩展@michaelb958 gofundmonica my fix unixpath=${unixpath/\~/$HOME}