Мне нужно написать скрипт, который запускает мою программу с другими аргументами, но я новичок в Bash. Я начинаю свою программу с:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
,
Вот псевдокод для того, что я хочу сделать:
for each filename in /Data do
for int i = 0, i = 3, i++
./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
end for
end for
Поэтому я действительно озадачен тем, как создать второй аргумент из первого, поэтому он выглядит как dataABCD_Log1.txt и запускает мою программу.
basename -s
, это нестандартное расширение - я отредактирую свой ответ, чтобы использовать стандартный синтаксис.shopt -s nullglob
перед циклом (иshopt -u nullglob
после, чтобы избежать проблем в дальнейшем), либо добавьтеif [[ ! -e "$filename ]]; then continue; fi
в начале цикла, чтобы пропустить несуществующие файлы.Извините за некроманализацию потока, но всякий раз, когда вы перебираете файлы с помощью глобинга, рекомендуется избегать углового случая, когда глобус не совпадает (что приводит к расширению переменной цикла до (не совпадающей) строки шаблона глобуса).
Например:
Ссылка: Bash Pitfalls
источник
shopt nullglob
! (илиshopt failglob
может использоваться тоже, в зависимости от желаемого поведения).dir.txt
name=${file##*/}
Замещения ( оболочки расширения параметра ) удаляют ведущий путь до последнего/
.base=${name%.txt}
Замена удаляет замыкающей.txt
. Немного сложнее, если расширения могут отличаться.источник
base=${name%.txt}
, а неbase=${base%.txt}
.Вы можете использовать опцию output с нулевым разделением и read для перебора структур каталогов.
Так что для вашего случая
дополнительно
запустит цикл while в текущей области действия скрипта (процесса) и позволит при необходимости использовать вывод find для установки переменных
источник
$'\0'
это странный способ написания''
. Вы упускаетеIFS=
и-r
переключатель дляread
: вашего чтения заявления должен быть:IFS= read -rd '' file
.$'\0'
и распределении точек стека. Собираюсь сделать правки, на которые вы указали. Каковы вредные последствия отсутствияIFS=
попыток,echo -e "ok \nok\0" | while read -d '' line; do echo -e "$line"; done
кажется, не будет. Также -r я часто вижу по умолчанию, но не смог найти пример того, что он предотвращает.IFS=
требуется, если имя файла заканчивается пробелом: try is withtouch 'Prospero '
(обратите внимание на завершающий пробел). Также вам нужен-r
переключатель в случае, если имя файла имеет обратную косую черту: попробуйтеtouch 'Prospero\n'
.Похоже, вы пытаетесь выполнить файл Windows (.exe) Конечно, вы должны использовать PowerShell. В любом случае на оболочке Linux bash достаточно простой однострочной оболочки.
Или в баш
источник