Конфликт переменных ввода и конвейера внутри скрипта оболочки

Поскольку кто-то ответил за ответ для 4.6 --для версии 4.4, если вы зависите от 32-битного RPM, чтобы обойти трудности или отсутствие синтаксиса, это может работать для других:

Requires:      /lib/libc.so.6

Поскольку этот файл предоставляется 32-разрядной версией glibc, при установке будет установлена ​​правильная зависимость.

0
26.02.2020, 18:39
3 ответа

Сделайте так:

variable="but put shell variable in double quotes"

echo 'Put most of the awk script in single quotes so that $s are not expanded, '"$variable"', then continue in single quotes.'

Тем не менее, пожалуйста, прочтите комментарий @Paul _Pedant о внедрении кода в программу.

0
28.04.2021, 23:22

Я бы использовал одинарные кавычки для awk. Не проверено

#!/bin/bash
cat $1.txt | awk '{cmd="pwgen 10 1"; cmd | getline pass; print substr($0, 1, length($0) -1) ">> ~/dresses/whole-dresses-shape/'$1'-" pass ".jpg"; close(cmd);}' | bash
0
28.04.2021, 23:22

Вот несколько способов сделать это более аккуратно (использование printfвместо print+ конкатенация строк — это вопрос личных предпочтений -Я считаю, что это более читабельно в этом дело ).

  1. экспортировать значение $1и использовать массив awk ENVIRON, например.

    #!/bin/bash
    
    export var="$1"
    
    cat "$1.txt" | awk '
      BEGIN{cmd="pwgen 10 1"} 
      {
        cmd | getline pass; 
        printf "%s >> ~/dresses/whole-dresses-shape/%s-%s.jpg\n", substr($0, 1, length($0) -1), ENVIRON["var"], pass;
        close(cmd);
      }
    '
    
  2. используйте параметр командной строки -vдля передачи значения $1напр.

    #!/bin/bash
    
    cat "$1.txt" | awk -v var="$1" '
      BEGIN{cmd="pwgen 10 1"} 
      {
        cmd | getline pass; 
        printf "%s >> ~/dresses/whole-dresses-shape/%s-%s.jpg\n", substr($0, 1, length($0) -1), var, pass;
        close(cmd);
      }
    '
    

Оба они заменяют внешние «мягкие» кавычки «жесткими». Дополнительным -преимуществом является то, что он освобождает слой цитирования на случай, если вы хотите защитить выходные строки от разбиения слов -(возможно, хорошая практика -, так как вы, очевидно, передаете результат в оболочку ), напр.

printf "\"%s\" >> ~\"/dresses/whole-dresses-shape/%s-%s.jpg\"\n"

Обсуждение -vи ENVIRONсм. в

.
3
28.04.2021, 23:22

Теги

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