Bash: Разделите символ новой строки от строки (строка чтения)

Другой недостаток, с которым я столкнулся, находится на, Формы аутентифицировали веб-сайт с помощью пользовательского IPrincipal / IIdentity. Cassini переключится AppDomains, не предупреждая (или уведомление).

Проверка этот сообщение в блоге для больше. Головная боль на этом заставила меня отбросить Cassini и придерживаться IIS.

11
задан reza 17 February 2012 в 10:50
поделиться

7 ответов

Мне всегда нравится perl -ne 'chomp and print' , для обрезки новой строки. Красиво и легко запоминается.

например ls -l | perl -ne 'chomp and print'

Однако

Я не думаю, что это ваша проблема. Хотя я не уверен, что понимаю, как вы передаете команды из файла в «чтение» в вашем сценарии оболочки.

С моим собственным тестовым сценарием, подобным этому (test.sh)

read line
if [ -n "$line" ]; then
  $line
fi

и пример входного файла, подобного этому (test.cmds)

ls 
ls -l
ls -ltra

Если я запустил его так ./ test.sh , я увижу ожидаемый результат: выполнение первой команды ' ls 'в текущем рабочем каталоге.

Возможно, в вашем входном файле есть дополнительные непечатаемые символы?

мой выглядит так

od -c test.cmds 
0000000    l   s      \n   l   s       -   l  \n   l   s       -   l   t
0000020    r   a  \n                                                    
0000023

Из ваших комментариев ниже, Я подозреваю, что в вашем входном файле может быть возврат каретки ("\ r"), что не то же самое, что перевод строки. Входной файл изначально имеет формат DOS? Если это так, то вам нужно преобразовать 2-байтовую строку DOS, заканчивающуюся "\ r \ n", в однобайтовую строку UNIX, "\ n", чтобы достичь ожидаемых результатов.

Вы сможете сделать это, заменив "\ n" вместо "\ r" в любой из закомментированных строк.

17
ответ дан 3 December 2019 в 02:02
поделиться

Кто-то уже написал программу, которая выполняет команды оболочки: sh file

Если вы действительно хотите выполнить только первую строку файла: head -n 1 file | sh

Если ваша проблема связана с возвратом каретки: tr -d '\ r'

13
ответ дан 3 December 2019 в 02:02
поделиться

Я пробовал это:

read line
echo -n $line | od -x

Для ввода «xxxx» я получаю:

0000000 7878 7878

Как видите, в конце строки нет \ n содержимое переменной. Я предлагаю запустить скрипт с опцией -x ( bash -x script ). Это напечатает все команды по мере их выполнения.

[EDIT] Ваша проблема в том, что вы редактировали файл commands.txt в Windows. Теперь файл содержит CRLF (0d0a) в качестве разделителей строк, что сбивает с толку чтение ls \ r - неизвестная команда). Используйте dos2unix или аналогичный, чтобы превратить его в файл Unix.

2
ответ дан 3 December 2019 в 02:02
поделиться

Вы также можете попробовать заменить символы возврата каретки символами новой строки только с помощью встроенных команд Bash:

line=$'a line\r' 
line="${line//$'\r'/$'\n'}" 
#line="${line/%$'\r'/$'\n'}"       # replace only at line end
printf "%s" "$line" | ruby -0777 -n -e 'p $_.to_s' 
2
ответ дан 3 December 2019 в 02:02
поделиться

вам нужна команда eval


#!/bin/bash -x

while read  cmd
do
 if [ "$cmd" ]
 then
  eval "$cmd"
 fi
done

Я запускал ее как
./script.sh

И файл file.txt был:

ls
ls -l
ls -ltra
ps as
1
ответ дан 3 December 2019 в 02:02
поделиться

хотя и не работает для ls , я рекомендую взглянуть на find -print0 параметр

0
ответ дан 3 December 2019 в 02:02
поделиться

Следующий скрипт работает (по крайней мере, для меня):

#!/bin/bash

while read I ; do if [ "$I" ] ; then $I ; fi ; done ;
0
ответ дан 3 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

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