Символ тильда расширяется оболочкой перед выполнением команды. Он будет заменен значением $HOME
. Таким образом, утилита ln
, создающая симлинк, никогда не увидит тильду, только полный путь. Этот путь будет сохранен в симлинке.
В Linux нет возможности сделать симлинк переменной. Они обрабатываются ядром. Ядро не поддерживает переменные окружения.
BSD допускает такие ссылки. Они называются вариантные символические ссылки. Вы можете сделать что-то вроде этого:
$ ln -s ’${variable}’ linkname
$ ls -l linkname
lrwxrwxrwx 1 root root 6 Sep 29 12:33 linkname -> ’${variable}’
С помощью varsym
эти переменные могут быть установлены:
varsym variable=value cat linkname
[...] contents of file with name value [...]
В сценарии нет ничего, что могло бы вызвать эту ошибку. Если вы запустите скрипт с sh./script.sh
, он выдаст
TEST LAST LOOP
в качестве вывода. Если запустить его с bash./script.sh
, вы получите тот же вывод, но с дополнительной ошибкой «ожидается целочисленное выражение», поскольку t
не является целым числом (, это также может произойти, если вы запустите с sh
, если ваш sh
реализуетсяbash
). Если вы запустите его с ./script.sh
, оболочка, скорее всего, выдаст сообщение «Нет такого файла или каталога», поскольку вы не добавили правильную строку #!
-.
В этом скрипте вы можете использовать #!/bin/sh
вместо строки #!
-, так как вы используете только стандартные функции POSIX.
Тест [ t -eq 1 ]
никогда не будет верным, так какt
(символ )не является целым числом. Если вы устанавливаете переменную t
в целое число, используйте [ "$t" -eq 1 ]
в тесте.
Единственный способ заставить оболочку сказать «неожиданный конец файла» — это преобразовать сценарий в текстовый файл DOS и запустить его с помощью bash
.
Если вы получаете эту ошибку, то файл сценария, вероятно, является текстовым файлом DOS (, возможно, из-за того, что он был создан на компьютере с Windows ). Вы должны запустить dos2unix
в сценарии.
#!
на #!/bin/sh
или запустите sh./script.sh
, и вы должны установить t как целое число $t
, а не t
.