Bash Shelscript для цикла Две переменные с входом из двух файлов

Симлинки

Автозависимые ссылки на имена файлов

Симлинк - это буквально текстовый файл, который обрабатывается ядром особым образом и содержимое которого является путем к другому файлу/каталогу.

Вы можете прочитать содержимое файла симлинка с помощью readlink, а если вы стандартно откроете файл симлинка, система откроет файл/каталог, на который ссылается содержимое симлинка.

Аналогия с указателем/ссылкой на C++

Если вы знакомы с C/C++, то симлинк в большинстве контекстов ведет себя примерно так же, как ссылка на C++ или указатель с автопереадресацией (не во всех: например, rm или mv работают непосредственно с симлинком, а не с целью). Разница в том, что настоящие ссылки C++ связываются с адресами памяти, а симлинки связываются с адресами файловой системы.

Висячие симлинки

Содержимое симлинка не обязательно должно быть корректной ссылкой на путь к файлу --> тогда у вас висячий симлинк (как висячий указатель или висячая ссылка).

Относительные симлинки

Если путь к файлу в симлинке не является абсолютным (начиная с /), то относительный путь к файлу определяется относительно местоположения симлинка (в контекстах без симлинка относительные пути определяются относительно $PWD).


Флаг -s и жесткие ссылки

Флаг -s предназначен для "создания symlinks". ln также может создавать hardlinks. Жесткие ссылки работают на другом уровне, который ближе к реализации файловой системы (следовательно, вы не можете создавать жесткие ссылки в разных файловых системах).

Файловые системы Unix хранят имена файлов (/имена каталогов) и содержимое файлов (содержимое каталогов) отдельно, а имена - это просто автозависимые указатели на их содержимое. Жесткая ссылка создает другое имя для того же содержимого, увеличивая при этом счетчик ссылок.

$ echo 'the contents' > f1
$ ls -l f1 
  * 1 * #the 2nd column is the reference count
$ ln f1 f2 #create another name for the contents of f1
$ ls -l f1
   * 2 * #the contents of f1 has two named references to it
$ rm f1  #the contents of f1 lives on (in f2) #
         # because rm only removes the reference to the data block
         #and this isn't the only reference
         #(rm ivokes a system call literally named `unlink`)

Жесткие ссылки на каталоги

Вы не можете создавать жесткие ссылки на каталоги, но . и ... являются неявно созданными для вас ссылками на каталоги. Следовательно, количество жестких ссылок для каталога отражает количество подкаталогов в нем (каждый подкаталог имеет жесткую ссылку ... на родительский каталог).


Симлинки и жесткие ссылки - большой обзор:

echo 'file data' > fileName 
ln fileName fileName2 #hardlink
ln -s "$PWD/fileName" absoluteSymlinkTofileName 
ln -s fileName relativeSymlinkTofileName 

В одной и той же физической файловой системе ln создает другое имя для файла data (ln не работает в разных файловых системах). Вы можете удалить fileName или fileName2, и пока остается хотя бы одно имя, file data продолжает жить.

absoluteSymlikTofileName - это автозависимая ссылка на имя fileName. Пока этот путь разрешается во что-то, симлинк действителен. Если вы удалите цель, симссылка будет висеть. Это абсолютная симссылка, поэтому ее можно перемещать в другие места без изменения ее действительности.

relativeSymlinkToFileName ссылается на имя fileName в том же каталоге, что и каталог relativeSymlinkToFileName. Если вы переместите его в другой каталог, в котором также есть файл (или каталог) с именем fileName, то он будет указывать на него.

1
15.12.2018, 17:16
1 ответ
for i in `cat file2|wc -l`  
do  
   j=`cat  file1|cut -d, -f4`  
   m=`cat  file2|cut -d, -f5`  
   file1_dom=`cat  file1|cut -d, -f1`  
   file2_vm=`cat  file2|cut -d, -f2`  
        if [[ `${j} -gt ${m}` ]]  
        then  
             echo ${file2_vm} can be reclocated to ${file1_dom}  
        fi  
done    

Несколько проблем, которые я вижу в вашем фрагменте кода:

  • Не используйте обратные кавычки для запуска оболочки sub -, они уже давно объявлены устаревшими. Предпочитайте синтаксис $(cmd).
  • Нет необходимости писать cat file2 | wc -l, например, wc -l file2короче и эффективнее. (Нет необходимости запускать cat, передавать его stdoutна wcи т. д.)
  • Вы должны всегда, всегда, всегда заключать в кавычки все подстановки переменных, если вы не хотите, чтобы они подвергались разбиению на слова и подстановке. Я имею в виду unqouted ${file1_dom}. Кроме того, нет необходимости писать ${file1_dom}, было бы предпочтительнее $file1_dom(синтаксис ${...} предлагает некоторые другие преимущества, которые здесь не нужны ).
  • Точно так же вы всегда должны предотвращать распространенные ошибки сценариев, добавляя -euв строку интерпретатора (shebang )ваших сценариев.
  • Вам не нужно использовать [[для простых числовых сравнений, достаточно [.
  • Ошибка, вероятно, заключается в том, что сравнение:${j} -gt ${m}окружено обратными кавычками и, следовательно, выполняется в подоболочке, поэтому значение jпринимается в качестве имени команды. (Вот откуда пришло сообщение. )Вы хотите что-то вроде if [ "$j" -gt "$m" ]; then..., применяя все вышеперечисленные правила.

Если вы решите переписать свой сценарий в соответствии с этими правилами, добавьте его в свой исходный пост, чтобы другие могли извлечь пользу из того, что правильный сценарий имеет значение.

0
28.01.2020, 00:21

Теги

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