Скрипт Bash не расширяет мою переменную $ file? - PullRequest
0 голосов
/ 04 октября 2019

Оператор elif печатает строку $file буквально вместо значения переменной. Как я могу это исправить?

  while read file
    do
    file_time=$(du -s --time "$directory/$file" | cut -f2)
    if [ -d "$directory/$file" ]; then
      if [ "$directory" == "." ]; then
        content+="<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]" width="16" height="16" /></td><td><a href=\"$root_directory/$file/index.html\">$file</a></td><td align="right">$file_time  </td><td align="right">  - </td><td>&nbsp;</td></tr>"
      else
        content+="<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]" width="16" height="16" /></td><td><a href=\"$root_directory/$directory/$file/index.html\">$file</a></td></td><td align="right">$file_time  </td><td align="right">  - <td>&nbsp;</td></tr>"
      fi
    elif [ -f "$directory/$file" ]; then
      file_size=$(du -h "$directory/$file" | cut -f1)
      if [ "$directory" == "." ]; then
        content+="<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]" width="16" height="16" /></td><td><a href=\"$root_directory/$file/index.html\">$file</a></td><td align="right">$file_time  </td><td align="right"> $file_size </td><td>&nbsp;</td></tr>"
      else
        content+='<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]" width="16" height="16" /></td><td><a href=\"$root_directory/$directory/$file\">$file</a></td><td align="right">$file_time  </td><td align="right"> $file_size </td><td>&nbsp;</td></tr>'
     fi  
    fi

 done < <(ls -1 --group-directories-first $directory --ignore=index.html --ignore=icons --ignore=pictures --ignore=make_index.sh --ignore=good.sh)

1 Ответ

1 голос
/ 04 октября 2019
if [ "$directory" == "." ]; then
  content+="<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]" width="16" height="16" /></td><td><a href=\"$root_directory/$file/index.html\">$file</a></td><td align="right">$file_time  </td><td align="right"> $file_size </td><td>&nbsp;</td></tr>"
else
  content+='<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]" width="16" height="16" /></td><td><a href=\"$root_directory/$directory/$file\">$file</a></td><td align="right">$file_time  </td><td align="right"> $file_size </td><td>&nbsp;</td></tr>'
fi  

Сравните подсветку синтаксиса в двух длинных строках. В первом есть сочетание красного и черного текста. Второй весь красный. Почему? Вы не используете одинаковые кавычки: одна начинается с ", а другая с '.

  • Переменные не раскрываются в одинарных кавычках, поэтому я не рекомендую'. Вы хотите, чтобы $file был расширен, и это не так, если он заключен в одинарные кавычки.

  • Версия с двойными кавычками позволяет расширять $file. Однако встроенные двойные кавычки являются проблемой. Как показывает подсветка синтаксиса, вы на самом деле не встраиваете кавычки. Скорее, вы неоднократно начинаете и заканчиваете разделы двойных кавычек.

Переключите одинарные кавычки на двойные кавычки, а затем экранируйте все встроенные кавычки с помощью \". Это исправит красную / черную подсветку синтаксиса.

if [ "$directory" == "." ]; then
  content+="<tr><td valign=\"top\"><img src=\"/icons/unknown.gif\" alt=\"[   ]\" width=\"16\" height=\"16\" /></td><td><a href=\"$root_directory/$file/index.html\">$file</a></td><td align=\"right\">$file_time  </td><td align=\"right\"> $file_size </td><td>&nbsp;</td></tr>"
else
  content+="<tr><td valign=\"top\"><img src=\"/icons/unknown.gif\" alt=\"[   ]\" width=\"16\" height=\"16\" /></td><td><a href=\"$root_directory/$directory/$file\">$file</a></td><td align=\"right\">$file_time  </td><td align=\"right\"> $file_size </td><td>&nbsp;</td></tr>"
fi  

Или используйте одинарные кавычки в HTML. Тогда вам не нужны отвратительные обратные слеши. HTML позволяет использовать любой тип цитаты.

if [ "$directory" == "." ]; then
  content+="<tr><td valign='top'><img src='/icons/unknown.gif' alt='[   ]' width='16' height='16' /></td><td><a href='$root_directory/$file/index.html'>$file</a></td><td align='right'>$file_time  </td><td align='right'> $file_size </td><td>&nbsp;</td></tr>"
else
  content+="<tr><td valign='top'><img src='/icons/unknown.gif' alt='[   ]' width='16' height='16' /></td><td><a href='$root_directory/$directory/$file'>$file</a></td><td align='right'>$file_time  </td><td align='right'> $file_size </td><td>&nbsp;</td></tr>"
fi  

Все это будет легче читать, если вы безоговорочно добавите общие биты HTML.

content+="<tr><td valign='top'><img src='/icons/unknown.gif' alt='[   ]' width='16' height='16' /></td><td>"
if [ "$directory" == "." ]; then
  content+="<a href='$root_directory/$file/index.html'>"
else
  content+="<a href='$root_directory/$directory/$file'>"
fi  
content+="$file</a></td><td align='right'>$file_time  </td><td align='right'> $file_size </td><td>&nbsp;</td></tr>"
...