String bash:将字符串变量解释为文件名/路径
我的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
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}