Intereting Posts
изменить конкретный столбец с помощью sed или awk Является ли `bash –posix` необходимым для bash 4, когда передается опция` set` для подсетей? Цвет фона Затхура нельзя изменить? несоответствие версии kmod-VirtualBox в Fedora 22 Как я могу переключаться между графическими драйверами? Как я могу принудительно использовать конкретный двоичный файл при запуске скрипта Большие шрифты «xterm» на дисплеях HIDPI не может открыть перенесенный веб-сайт из старых DS на новые DS Драйвер графической подсистемы для Linux Mint 16 на ноутбуке Acer Aspire 5100 Восстановление драйвера для другой версии ядра «Это 32-битный компьютер, вы не можете использовать на нем 64-битное программное обеспечение», Как защитить CentOS и FreeBSD, отключив порты USB и выход VGA на месте? Как загрузчик и ядро ​​взаимодействуют после загрузки ядра в память? Я больше не могу получить доступ к учетной записи root: пользователь не находится в файле sudoers Должен ли я устанавливать переменную среды LANG или использовать локальный набор locatel?

grepping переменная и добавление 1 к ней

У меня есть переменная, содержащая ведущее число нулей, и я хочу, чтобы grep эту переменную и ту же переменную плюс одну. Я сделал несколько попыток, но столкнулся с ошибками. Вот что я хочу сделать:

read var newvar=$(($var +1)) grep '$var' /some/dir grep '$newvar' /some/dir 

Я действительно думаю, что с моим кодом что-то не так. Я также пробовал несколько тестов следующим образом:

 #!/bin/bash echo "enter number" read number newnumber=$(($number + 1)) echo "$newnumber" 

Это дает мне ошибку: value too great for base (error token is . Если я делаю это так:

  #!/bin/bash echo "enter number" read number number="" newnumber=$(($number + 1)) echo "$newnumber" 

Это будет выводить 1 все время.

Что случилось с моими попытками, и как я могу делать то, что хочу?

Вы используете неправильные кавычки: одинарные кавычки '' предотвращают расширение $ expression ( $var и $(command) и устаревшую форму `command` ). Вместо этого используйте двойные кавычки "" . Хотя в этом случае, если вы уверены, что это число, вам не нужны кавычки.

Для вашего второго вопроса … вы используете ведущие нули? Это указывает на восьмеричность, поэтому цифры 8 и 9 не будут работать.

geekosaur уже объяснил, почему ваша первая попытка не удалась. Вот несколько дополнительных советов о том, что вы пытаетесь сделать.

Если вы ищете число, подобное 42 , вы, вероятно, захотите сопоставить 042 но не 1042 или 421 . Все, что вам нужно для достижения этого, – это причудливое регулярное выражение. Предполагая, что $newnumber содержит число (целое число, положительное, в десятичной нотации) без $newnumber нуля, найдите $newnumber которому предшествует либо начало строки, либо символ без цифры, а также после. 0* также допускает начало нулей. Опция -E сообщает grep что вы используете современный синтаксис регулярных выражений (в отличие от синтаксиса, который является более quirkier и менее мощным).

 grep -E "(^|[^0-9])0*$newnumber(\$|^[0-9])" /path/to/file 

Чтобы проанализировать число с потенциальными ведущими нулями, в bash вы можете использовать $((10#$newnumber)) чтобы заставить десятичную интерпретацию. В других оболочках это немного сложнее; существует конструкция оболочки, чтобы получить значение переменной без определенного префикса ${var#prefix} и аналогичную конструкцию для суффиксов ${var%suffix} , но нет способа указать «максимально возможную последовательность из 0 символов», как префикс для полосы. Но это можно сделать в два этапа: сначала получить часть var которая не является ведущим нулем, и использовать ее как префикс для полосы. Часть var которая не является ведущими нулями, является ее самым длинным суффиксом, который начинается с ненулевого значения, которое равно ${var%%[!0]*} (double % означает вынуть самый длинный суффикс, который соответствует шаблон, один % выведет самый короткий суффикс).

 read number number=${number#${number%%[!0]*}} 

Далее отметим: grep REGEXP /some/file ищет один файл /some/file . Если вы хотите искать все файлы в каталоге, пусть оболочка генерирует список файлов: grep REGEXP /some/dir/* . Если вы хотите рекурсивно искать все файлы в каталоге и его подкаталогах, передайте параметр -r в grep чтобы он рекурсировал: grep -r REGEXP /some/dir .

Как сказал гейкозавр, вы используете неправильные цитаты. Придерживайтесь двойных букв, если вы хотите, чтобы оболочка расширила переменную ссылку на значение.

Во-вторых, вы неправильно выполняете математику в двойных круглых скобках. Вы НЕ хотите, чтобы внутри него существовало $, переменные ссылки внутри конструкции $ (()) не нуждались в $.

 #!/bin/bash echo "enter number" read number newnumber=${number#${number%%[!0]*}} newnumber=$((newnumber + 1)) echo "$number changes to $newnumber" 

Эти два изменения работают для меня в вашем оригинале тоже …

 read var newvar=${var#${var%%[!0]*}} newvar=$((newvar + 1)) printf -v newvar "%02d" "$newvar" grep "$newvar" /some/dir 

UPDATE добавила строку printf для форматирования вывода. UPDATE 2 добавлен в исправление для ввода нулевых заполненных номеров. Теперь это должен быть полный пример.