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

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

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

#!/bin/bash

read -p "Enter filename: " fname
if [[ -d $fname ]]
then
        echo "$fname is a directory"
else
        echo "$fname is not a directory"
fi

输出:

$ 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

答案1

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

$HOME/Music

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

case "$fname" in "~/"*)
  fname="${HOME}/${x#"~/"}"
esac

您还可以使用bash参数扩展在字符串开头替换~/为:$HOME

if [[ -d ${fname/#~\//$HOME\/} ]]

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

相关内容