Чтение ввода из командной строки в сценарий оболочки exec с использованием golang - PullRequest
0 голосов
/ 28 мая 2019

Я использую go для запуска сценария оболочки с помощью exec.command, как показано ниже, и я хочу получить входной аргумент с помощью командной строки, скажем i, и мой вывод должен быть основан на i, как бы я это сделал?

i := os.Args[1:2]
out, err := exec.Command("bash", "-c", "tail -n 1 /var/log/apache2/access.log | awk '{print $i/1024}' >> mem_usage.csv").Output()
if err != nil {
    fmt.Println(err.Error())
    return
 }

Как я могу использовать это я в сценарии оболочки?

Без i он работает нормально, т.е. если я поставлю $1 или $2, он работает нормально, но я хочу, чтобы пользователь дал мне позицию i, а затем вычислил соответственно.

1 Ответ

2 голосов
/ 28 мая 2019

Вам необходимо соответствующим образом отформатировать строку exec.

То есть:

fmt.Sprintf("awk '{print $%d/1024}'", i)

Это дает: awk '{print $1/1024}' для i = 1и awk '{print $2/1024}' для i = 2

fmt.Sprintf принимает строку формата и аргументы для передачи в эту строку и возвращает отформатированную строку.(https://golang.org/pkg/fmt/#Sprintf)

И это должно быть вставлено в вашу exec -команду:

i := 2
awkPart := fmt.Sprintf("awk '{print $%d/1024}'", i)
out, err := exec.Command("bash", "-c", "tail -n 1 /var/log/apache2/access.log | "+awkPart+" | tee -a mem_usage.csv").Output()

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

...