Как сделать вывод как переменной, так и ее значения в файл

Мой ДИСПЛЕЙ установлен как «:0.0», и он работает хорошо. Я получил эту настройку методом проб и ошибок, но в часто задаваемых вопросах CYGWIN/X сказано следующее:

    3.13. I upgraded and now X clients can't connect

    A1:

    Since X server 1.17, by default the server does not listen for TCP/IP
    connections, only accepting local connections on a unix domain socket.

    For local clients, use DISPLAY=:0.0, rather than DISPLAY=localhost:0.0,        
    DISPLAY=127.0.0.1:0.0, DISPLAY=::1:0.0, etc. See Q: 1.6.. 
    A2:

    For remote clients, rather than connecting over TCP/IP by explicitly
    setting DISPLAY and allowing access using xhost or by disabling access
    control, use ssh tunnelling with ssh -Y instead. (See the User's Guide
    section on X forwarding using ssh for more details).

    A3:

    Use the -listen tcp option to restore the previous behaviour, allowing 
    the X server to open a TCP/IP socket as well e.g. startxwin -- -listen
    tcp. See Q: 4.2.. 

Часто задаваемые вопросы по CYGWIN/Xhttps://x.cygwin.com/docs/faq/cygwin-x-faq.html

1
11.05.2020, 12:34
1 ответ

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

1.

list="$1\n$2\n$3"

Это не сработает, потому что \nне будет заменено новой строкой, вам понадобится что-то вроде этого:

list="$1"$'\n'"$2"$'\n'"$3"

или

list="$1
$2
$3"

2.

for i in $varNames $list; do

Предполагая, что вы зафиксировали (1 ), этот цикл будет выполняться 6 раз (Отказ от ответственности, см. последнее предложение этого ). По одному разу для каждого из $varNamesи $list, что, я думаю, не предназначено. Кроме того, когда вы выполняете такой цикл, переменные будут разделены не новой строкой, а$IFS. По умолчанию это новая строка, пробел или табуляция. Так что это работает, но, зная это, вы также можете просто использовать list="$1 $2 $3"в (1 ). Конечно, это работает только в том случае, если вы знаете, что каждая из этих переменных не содержит символов новой строки, пробела или табуляции.

3.

echo -e $varNames$list

выводит целые переменные, а не только разделенные части, которые были бы $i.

4.

Вы перезаписываете весь файл для каждой итерации. Лучшее использование

for...; do... done > file

И что теперь?

Я думаю, что вы не можете легко исправить свой код как есть. Вместо этого вы должны использовать массивы bash и перебирать ключи :

.
#!/bin/bash

list=("$1" "$2" "$3")
varNames=("var1" "var2" "var3")

for k in "${!varNames[@]}"; do
    printf '%s=%s\n' "${varNames[$k]}" "${list[$k]}"
done > "vars-$(date +%Y-%m-%d_%H.%M).file"

Я предпочитаю использовать printf(, см. это ), но вы также можете использовать echoвот так, если вам все равно...

echo "${varNames[$k]}=${list[$k]}"
3
28.04.2021, 23:15

Теги

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