为什么不对要读取的输入执行波浪号扩展?

jes*_*adi 7 command-line bash scripts

为什么此脚本的输出中没有出现波浪号扩展?

#!/bin/bash

read -p "Enter filename: " fname
if [[ -d $fname ]]
then
        echo "$fname is a directory"
else
        echo "$fname is not a directory"
fi
Run Code Online (Sandbox Code Playgroud)

输出:

$ bash -x test_cd.sh 
+ read -p 'Enter filename: ' fname
Enter filename: ~/Music
+ [[ -d ~/Music ]]
+ echo ' ~/Music is not a directory'
 ~/Music is not a directory
Run Code Online (Sandbox Code Playgroud)

des*_*ert 7

这仅仅是因为read在保存字符串之前不执行波浪号扩展,以后也不会对变量内容执行。您可以$HOME改用并输入

$HOME/Music
Run Code Online (Sandbox Code Playgroud)

或者让脚本测试~/并替换它(取自这个答案):

case "$fname" in "~/"*)
  fname="${HOME}/${x#"~/"}"
esac
Run Code Online (Sandbox Code Playgroud)

您还可以使用bashParameter Expansion替换字符串开头的~/with $HOME

if [[ -d ${fname/#~\//$HOME\/} ]]
Run Code Online (Sandbox Code Playgroud)

在执行替换之前扩展此变量。