Preciso escrever um script que inicie meu programa com argumentos diferentes, mas sou novo no Bash. Inicio meu programa com:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
.
Aqui está o pseudocódigo do que eu quero fazer:
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
Então, eu estou realmente intrigado em como criar o segundo argumento a partir do primeiro, então parece com dataABCD_Log1.txt e inicio o meu programa.
basename -s
é uma extensão fora do padrão - editarei minha resposta para usar a sintaxe padrão.shopt -s nullglob
antes do loop (eshopt -u nullglob
depois para evitar problemas mais tarde) ou adicioneif [[ ! -e "$filename ]]; then continue; fi
no início do loop, para que ele pule arquivos inexistentes.Desculpe por necromancer o encadeamento, mas sempre que você iterar arquivos por globbing, é uma boa prática evitar a caixa de canto onde o glob não corresponde (o que faz com que a variável de loop se expanda para a própria cadeia de padrão glob (sem correspondência)).
Por exemplo:
Referência: Bash Pitfalls
fonte
shopt nullglob
é para isso! (oushopt failglob
pode ser usado também, dependendo do comportamento desejado).dir.txt
A
name=${file##*/}
substituição ( expansão de parâmetro do shell ) remove o nome do caminho principal até o último/
.A
base=${name%.txt}
substituição remove o final.txt
. É um pouco mais complicado se as extensões puderem variar.fonte
base=${name%.txt}
, em vez debase=${base%.txt}
.Você pode usar a opção de saída separada com localização nula com a leitura para iterar sobre estruturas de diretório com segurança.
Então, para o seu caso
Além disso
executará o loop while no escopo atual do script (processo) e permitirá que a saída de find seja usada na configuração de variáveis, se necessário
fonte
$'\0'
é uma maneira estranha de escrever''
. Você está perdendoIFS=
eo-r
interruptor pararead
: a sua declaração de leitura deve ser:IFS= read -rd '' file
.$'\0'
e espalharam alguns pontos da pilha. Indo fazer as edições que você apontou. Quais são os efeitos negativos de não terIFS=
tentadoecho -e "ok \nok\0" | while read -d '' line; do echo -e "$line"; done
, parece não haver nenhum. Além disso, -r eu vejo muitas vezes é o padrão, mas não consegui encontrar um exemplo para o que impede que isso aconteça.IFS=
é necessário caso um nome de arquivo termine com um espaço: try is withtouch 'Prospero '
(observe o espaço à direita). Além disso, você precisa da-r
opção caso um nome de arquivo tenha uma barra invertida: experimentetouch 'Prospero\n'
.Parece que você está tentando executar um arquivo do Windows (.exe) Certamente você deve estar usando o PowerShell. De qualquer forma, em um shell bash do Linux, uma simples liner será suficiente.
Ou em uma festança
fonte