Почему расширение тильды не выполняется на входе для чтения?

Почему расширение тильды не произошло в выводе этого сценария?

#!/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
7
задан 18 November 2018 в 07:12

1 ответ

Это просто потому что read не выполняет расширение тильды прежде, чем сохранить строку, и при этом это не выполняется на переменном содержании позже. Можно использовать $HOME вместо этого и войти

$HOME/Music

или позвольте сценарию протестировать на ~/ и замените его (взятый из этого ответа):

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

Можно также использовать bash Расширение параметра на замену ~/ с $HOME в начале строки:

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

Эта переменная расширена, прежде чем замена выполняется.

7
ответ дан 23 November 2019 в 06:35

Другие вопросы по тегам:

Похожие вопросы: